From patchwork Mon May 14 09:15:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yoshihiro Shimoda X-Patchwork-Id: 912787 Return-Path: X-Original-To: incoming-dt@patchwork.ozlabs.org Delivered-To: patchwork-incoming-dt@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=devicetree-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=renesas.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=renesasgroup.onmicrosoft.com header.i=@renesasgroup.onmicrosoft.com header.b="RAewIBf8"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40kw7W6mmqz9s0y for ; Mon, 14 May 2018 19:16:55 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752251AbeENJQv (ORCPT ); Mon, 14 May 2018 05:16:51 -0400 Received: from relmlor2.renesas.com ([210.160.252.172]:34265 "EHLO relmlie1.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752000AbeENJQq (ORCPT ); Mon, 14 May 2018 05:16:46 -0400 Received: from unknown (HELO relmlir4.idc.renesas.com) ([10.200.68.154]) by relmlie1.idc.renesas.com with ESMTP; 14 May 2018 18:16:41 +0900 Received: from relmlii2.idc.renesas.com (relmlii2.idc.renesas.com [10.200.68.66]) by relmlir4.idc.renesas.com (Postfix) with ESMTP id 7100982D80; Mon, 14 May 2018 18:16:41 +0900 (JST) X-IronPort-AV: E=Sophos;i="5.49,399,1520866800"; d="scan'208";a="280916056" Received: from mail-ty1jpn01lp0179.outbound.protection.outlook.com (HELO JPN01-TY1-obe.outbound.protection.outlook.com) ([23.103.139.179]) by relmlii2.idc.renesas.com with ESMTP/TLS/AES256-SHA256; 14 May 2018 18:16:40 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=renesasgroup.onmicrosoft.com; s=selector1-renesas-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=ybfiuVV/CYOb2FtJPVBnkZ3UFBBJL8UI5vcm4Adut+k=; b=RAewIBf8IG2RP2PZdXlZvWzL77WU3lhrNPj+FQcnciUkSoWS8rGJ366WgcOu+T0sOEZX5g3p48E/J4xl7n9YZTSgZz9iyT3F7zIJnldUc/M3jjcgt/lKBNGkJaa9dOwznCqmv4VzoIdhNGZUkLKHv1KDo1ztE9Q0tOt9o/zY5N8= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=<>; Received: from localhost.localdomain (211.11.155.138) by OSBPR01MB2293.jpnprd01.prod.outlook.com (2603:1096:603:26::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.755.16; Mon, 14 May 2018 09:16:38 +0000 From: Yoshihiro Shimoda To: gregkh@linuxfoundation.org, robh+dt@kernel.org, mark.rutland@arm.com Cc: heikki.krogerus@linux.intel.com, hdegoede@redhat.com, andy.shevchenko@gmail.com, linux-usb@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, Yoshihiro Shimoda Subject: [PATCH/RFC v3 2/4] usb: gadget: udc: renesas_usb3: Add register of usb role switch Date: Mon, 14 May 2018 18:15:58 +0900 Message-Id: <1526289360-3997-3-git-send-email-yoshihiro.shimoda.uh@renesas.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1526289360-3997-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> References: <1526289360-3997-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> MIME-Version: 1.0 X-Originating-IP: [211.11.155.138] X-ClientProxiedBy: TY1PR01CA0144.jpnprd01.prod.outlook.com (2603:1096:402:1::20) To OSBPR01MB2293.jpnprd01.prod.outlook.com (2603:1096:603:26::14) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(4534165)(4627221)(201703031133081)(5600026)(2017052603328)(7153060)(7193020); SRVR:OSBPR01MB2293; X-Microsoft-Exchange-Diagnostics: 1; OSBPR01MB2293; 3:kuc4p42QsDvQGVCIPBJwlkwx7VjB/QNK+BrAJHz/m0i+p+AtTIMX87f91KLjeHUFubQtwlYka1UTP3VI9nENAA6+ii929rmZnNbopCEn1RkAUWR3zDapI/ahGiB0VgVoxnG/qlcu2xSWQ5aHi+6BOZL1inFX1YJnvfpwz8u7k5p7ak3kTMsYPE1A7O3KU1eEGyeBJ4yiQw5wxegVVm0pc13U0cZGFQYYIJoSi27VdS0Qm/l4kVSFBCbkWnZ+zorG; 25:gmOEpy65g/gniPNpNxQqWnRuM7GRlFfqPWfcBvppacwqyQZLcxwglqodl+vjryEyjyb9FEHGKqBD25iIxbvfApfY9X6Vue2TNz42RrHU9C8gQ7yfLuWPwKMUY33BCIwx+jaNqUzSyHwpXvSXEAnMtzkj+wG6zn8ktl7T5UCpsSUQsc6fMCjRSxW5PKP/qiqIwwInUstpJE67z1vCty85dAKH5sSeGGWpYd46BYSFfVWGC/kxcCnZ6996YC59cKPsW7qv6uy+PCmIq3+33be0CdjBFLntQTNwi7Ql9s98+JWTU1Vh77P8Ge2IN2l3mavYvTqfaMljrqWI7h/f/qJ+Sw==; 31:ra8LcYuXJZS0ZhKLH+L7gPg6YXQ1W93PX0erxdm1fqYJPL8gusaXlzuREBAF8DhJQYuOjG7O/KszOG98tXrozGh0Qndi92UkbGlR24tCDJ5+oPrRU0kUq8kqcioxeb+wPARpqyGR9oGlCEzfI7GZbs25/fJL7RUVqbG0VLI8WGFmF3cPbWdmDu8PZZQsOQiighZmsz79GelIq5ierdokiPhyJ5T5pN++24vH6E9UrhM= X-MS-TrafficTypeDiagnostic: OSBPR01MB2293: X-Microsoft-Exchange-Diagnostics: 1; OSBPR01MB2293; 20:EIgnvzkj/mrEkemNnIKzqE1876A8W8qcSj/zqgy0mH4Qbu+wsbpGlX7Rjn8c2dcab2EChjh71k2BUsqi+Nt9c3q1DCY4Yh5+wu680WSF+JI1CJud6v4KJ9H/gsv2FwM0cUhSWb9QPjGSgR4IM9V4Vpcl5ExDIgkpfmWvzKnSql67xJg07tM80TmMkQoXWepi3qXH9O7nj/1U0+rBohsMD8LCmKRZiIW398HChXu0KCpoBewaa4HeJimt3K3YUv77VrqdTbBC4B6SqMcjPAU+kvH9d1cIYlZzI4zFVGSI2adDK0tJiEDG13z76XzXgVstXz6VdzwL5x93icU3j75G+7SD0VF6pXUf9fPikM8LLBO35W71HxtZ7x1H25fcel7oFzzE7JQ5mbhVJxKYtSM0KpdTqXEBzqfqEWXKDwWn1uli55g90XIQn8hmnWgDPxD9HeukcOu9qmYx5phQnu9Fgdor2kTw6ED0Nq6aC3Hr6cD5Z+LSHr8kuj1Gf7Si9uOk; 4:EOTDu6muUaWqvwqaFa25VzXRH8YVdw39aZEe6qNrAHt1vpXtdxA5xpL7We5aTRFZzJrMauCn+oH4Ot3DxvkHKynA9r+WrX24CfP+uQAq+ytFhh3Uj4Z+LDysK823dnYwFBgefs7goPAZA2i0TVt4kKCdRSgR5HQb9I7PQUvh5IDp7B/FOOFgKw95gBgutRxed07Czazin4gALCsfNjVBEXrQsNeTLgbgiTneC4D2rYdZn6yicT5mPi1zRNzlqvSSNkOWZw0BKshpHDTk4ZacWw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3231254)(944501410)(52105095)(93006095)(3002001)(10201501046)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061750153)(20161123558120)(20161123560045)(20161123562045)(20161123564045)(6072148)(201708071742011); SRVR:OSBPR01MB2293; BCL:0; PCL:0; RULEID:; SRVR:OSBPR01MB2293; X-Forefront-PRVS: 067270ECAF X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6069001)(346002)(376002)(39380400002)(39860400002)(396003)(366004)(199004)(189003)(16526019)(107886003)(68736007)(97736004)(53936002)(36756003)(50466002)(4326008)(6512007)(316002)(6116002)(106356001)(6486002)(6506007)(386003)(16586007)(26005)(3846002)(5890100001)(25786009)(59450400001)(5660300001)(78352004)(47776003)(81166006)(7736002)(52116002)(81156014)(305945005)(50226002)(2906002)(51416003)(105586002)(39060400002)(11346002)(486006)(42882007)(2616005)(446003)(48376002)(476003)(6666003)(498600001)(956004)(76176011)(66066001)(8676002)(8936002)(3720700003); DIR:OUT; SFP:1102; SCL:1; SRVR:OSBPR01MB2293; H:localhost.localdomain; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:0; MX:0; Received-SPF: None (protection.outlook.com: localhost.localdomain does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; OSBPR01MB2293; 23:BLEL/+7OLAH74D8odLxjFC6G4UUD4vp2Z1HRewjGh?= 2KiDKC7awOU5Fa/+scseLvBOXz/BjBse1aG2NgVT8c6r1Xv61DTW2lY0QEyb4YokNQYoIge1WzEzuVtBKnLITDO+uAn/wh8nwamyG5UUZ5A+bTCTe3C1Dpk6IE/lUIBlLALdxexn9x1oCOTGET+S5AGJJYd5k6AS16cIN3lU9x9Ol6X799wFj9HhkfjX/53nDp0d+eI1Xdc/F0/LDBQpdMq22KNzhqWZXHCdlrZTiClwEl0N/IFbo7+LzX7ZF1Wo2MJEhQBfm5IysVPr7PWOhYgo7Dt51IWgjvUSZGpk/25FMy+Nfc4qxJwsE4a9iLmn3EXoKAwRAoQPOmA0FQKcMMAVNMFGGe8GJCNX9LTBVAvNJFZ+OYxfRd0b2JeAtPhR7joPMINxzjwPERB9I1irIkXQB85drgH2pncsizl1dJREcwzlQoRPhylo9l0pHu2UuU4PhjHOzPdgwqTE5e0yAp5crPm7wKUSY0IOs86nEyfOWw5e/rV+Ny+f1Bg6dO+/THbwR/MQSlQDDamUakJHckAF1cVbYozhxA9MoQZcZ1N48fhmr6yVmhUCtoWBZ0UEsoNIpk53G8+yT6Bkn5brVwrLdaOpoviUsqHk0DyPyboVJYQL9P2Tuis8nz01bT8OUT7AFooWMMM47G+2PvJQDFozejbIL4pNN70pqsnNiunYu3k22EIlRfUc8k63E85Da8mZzf5xQ1d9uct0twN5WsXTuIXZOpoGtAXD8H2UIPKqGd5sqR0DBxKbB0P6v/+zmm4g7c4Ep/5yRbYsS+IYA0zTXw7U3mVssOPoCn1CGl7QdAi4CeUF4vqGsQ4mxRrjXB/mAa4zyF803dlFgB69/eiezz+ObqCSOlkuriNMwZo5vqXMg0Q9isVNQc8v3op4u1A+UL3MgfcBMeksL1p6VMhMEzgvU2JcYpQWnTK9DZjGjDsiFvjVPP4GUL2s8UGJAhD3UFBXizovnTLNc2xY1OUyJM+TUjx1EPj2uxmaYFmEZYy033deCzr8f6YLEb4J2TUGeFMSFzQkAbNBZySWEV7/LfzSmIlI9GzKIXT6XRja/bdPSj02En/06FEZGxuWh+FJyt/7edV+t/yFDSiyGDJhnJRab47jZTD4d6m0aXome4ZobXNkQEVkUpnsJHAnpQnYcAkOe2oNxuHCpZ+2a9VKgeJzQId8DjfD5y8EQprBJ7i9/0EaNDwfS4KJPDWwmtDoz76LeYrlY2xR84n3Eq06Se5YozdQ4OFALonUpEMvHWkM6drWnwGCRu7GomSQSs= X-Microsoft-Antispam-Message-Info: seRLVD8u8QZNZAbacus6edGJ/kOhfzDnknTVrqk3M6XwY7B16Bj1Q+epsSrsrZoeZm1SK5XxBbH2XH6RWeeXXwixUOLpMu09TYpKi4mIiJndKmSPxeZ7T1DnrzULiGLScqlxPLBBDcux5l4T22xxsKdWfDLIqYL8r3OYnQMAPm+O50fGRZMyRYgqLA8J8WRF X-Microsoft-Exchange-Diagnostics: 1; OSBPR01MB2293; 6:XUsRTT2cD0i2hTsUHts24nHf6rJq0oAs2zi6c0kvyX4fK8yDoQAd6k0pGVf3Fsrr8v7GXYU+XK+fbru6fzKGz/jz6oUMYQhJ3kx0jFKu9mhXiM9Upu9TAG40fEp6gHl1j1lTq6J4aozqNIRhpwHvBNo99mj75o006U8oQjGUvXim+Eec7wjsnHpf5ep3zrxSOgiNzYT/U/Cyv8Kx+R8+P9E6VYnKXFXOactaWtoGzsjCXv91IE2ahawUov0qhrj/iJtDBy0EC4e2a7DTX10TacIyeOxD8xARUXqHolvqjyM6YOcmx91cnVu0F6x9atUA8Qk2Rhr5ZWm4lzXJQvj88Xk+tVIb0vJ04Uygn86BZwCxarl2znHBYej2ZkyCklzNzac4ZRJ5vP5oWsY5OzEacPAsRGLTHoTmHiksbmHL4WxifjaQLd0EsdTcciWxTYQzz1bv4067mygLY0/3aUQydw==; 5:Xl9JzLa5kBnf5v4fMuQpeVKoAZBuki2OSGJmxl0rh5ApvVNKwkWz5HQn+ahTDespvONDbZl4zEJFNOPp2anNQNIhLPcb7qn/owLpv8OWLkR7usAJmgrfPflq/F3EZDTC5Vw3Lz9fRL91NvTEdMMndUAXg1zv06Ej0i3nZWrJlqY=; 24:84HLkXzVxrDk20AuNMWSj1z53xWWAP6RTs2CPD6Ajdhsju58SwpNoORrmcgc5oYP6GmH4GoOYrWdcIJs70nbp+p7dAhX4xsNQcPZVJl5jpQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; OSBPR01MB2293; 7:qigYQ+yEVcTv6kYiZjWp9xndD8FCRzAOdG7dCi5nYMQ9zWHPg/zXeQoZFEIXXA5iJkQgr8wyeawRcfuhB4BW26LL9Vv9FSh/3WzYIPKT+Z0QdnsOCRtnP6CX1LbfSG+ELn2IUTd3Nx9sSm43XqtAFgYCKH7+1l7z4B/lHSOetP1FSGumHa2B8wi2nb0SzPOApCVKsmLO5L+F6YWVw9iaeIZhoAYSDJGRv1jpBExKq0ghwpi61C0BxwTAIN89kUyr; 20:YxDruX39Bd0f2gULdnDsIn4vaHCHuoeuv43n05SQEV6cEo+Dic5QSBSkGsyvj5lIV8/IfPZLHLIafNjfbqIQd0H4LRGR7v3yETHVDJuz4iQP/BbQ2jtPCid6V99j9XirUzzH3GaC9H2/lR6BwOp3DBC2DbXRhDBKd5F0bZPS7JU= X-MS-Office365-Filtering-Correlation-Id: 379fd4da-2967-496f-ffe0-08d5b97b6621 X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 May 2018 09:16:38.6382 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 379fd4da-2967-496f-ffe0-08d5b97b6621 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 53d82571-da19-47e4-9cb4-625a166a4a2a X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSBPR01MB2293 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org This patch adds role switch support for R-Car SoCs into the USB 3.0 peripheral driver. Some R-Car SoCs (e.g. R-Car H3) have USB 3.0 dual-role device controller which has the USB 3.0 xHCI host and Renesas USB 3.0 peripheral. Unfortunately, the mode change register contains the USB 3.0 peripheral controller side only. So, the USB 3.0 peripheral driver (renesas_usb3) manages this register now. However, in peripheral mode, the host should stop. Also the host hardware needs to reinitialize its own registers when the mode changes from peripheral to host mode. Otherwise, the host cannot work correctly (e.g. detect a device as high-speed). To achieve this by a driver, this role switch driver manages the mode change register and attach/release the xhci-plat driver. Signed-off-by: Yoshihiro Shimoda --- .../devicetree/bindings/usb/renesas_usb3.txt | 15 +++++ drivers/usb/gadget/udc/Kconfig | 1 + drivers/usb/gadget/udc/renesas_usb3.c | 68 +++++++++++++++++++++- 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/usb/renesas_usb3.txt b/Documentation/devicetree/bindings/usb/renesas_usb3.txt index 2c071bb5..f6105aa 100644 --- a/Documentation/devicetree/bindings/usb/renesas_usb3.txt +++ b/Documentation/devicetree/bindings/usb/renesas_usb3.txt @@ -19,6 +19,9 @@ Required properties: Optional properties: - phys: phandle + phy specifier pair - phy-names: must be "usb" + - The connection to a usb3.0 host node needs by using OF graph bindings for + usb role switch. + - port@0 = USB3.0 host port. Example of R-Car H3 ES1.x: usb3_peri0: usb@ee020000 { @@ -27,6 +30,12 @@ Example of R-Car H3 ES1.x: reg = <0 0xee020000 0 0x400>; interrupts = ; clocks = <&cpg CPG_MOD 328>; + + port { + usb3_peri0_ep: endpoint { + remote-endpoint = <&usb3_host0_ep>; + }; + }; }; usb3_peri1: usb@ee060000 { @@ -35,4 +44,10 @@ Example of R-Car H3 ES1.x: reg = <0 0xee060000 0 0x400>; interrupts = ; clocks = <&cpg CPG_MOD 327>; + + port { + usb3_peri1_ep: endpoint { + remote-endpoint = <&usb3_host1_ep>; + }; + }; }; diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig index 0875d38..7e4a5dd 100644 --- a/drivers/usb/gadget/udc/Kconfig +++ b/drivers/usb/gadget/udc/Kconfig @@ -193,6 +193,7 @@ config USB_RENESAS_USB3 tristate 'Renesas USB3.0 Peripheral controller' depends on ARCH_RENESAS || COMPILE_TEST depends on EXTCON && HAS_DMA + select USB_ROLE_SWITCH help Renesas USB3.0 Peripheral controller is a USB peripheral controller that supports super, high, and full speed USB 3.0 data transfers. diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c index 409cde4..c878449 100644 --- a/drivers/usb/gadget/udc/renesas_usb3.c +++ b/drivers/usb/gadget/udc/renesas_usb3.c @@ -23,6 +23,7 @@ #include #include #include +#include /* register definitions */ #define USB3_AXI_INT_STA 0x008 @@ -334,6 +335,9 @@ struct renesas_usb3 { struct work_struct extcon_work; struct phy *phy; + struct usb_role_switch *role_sw; + struct device *host_dev; + struct renesas_usb3_ep *usb3_ep; int num_usb3_eps; @@ -643,7 +647,7 @@ static void usb3_check_vbus(struct renesas_usb3 *usb3) } } -static void usb3_set_mode(struct renesas_usb3 *usb3, bool host) +static void _usb3_set_mode(struct renesas_usb3 *usb3, bool host) { if (host) usb3_clear_bit(usb3, DRD_CON_PERI_CON, USB3_DRD_CON); @@ -651,6 +655,11 @@ static void usb3_set_mode(struct renesas_usb3 *usb3, bool host) usb3_set_bit(usb3, DRD_CON_PERI_CON, USB3_DRD_CON); } +static void usb3_set_mode(struct renesas_usb3 *usb3, bool host) +{ + _usb3_set_mode(usb3, host); +} + static void usb3_vbus_out(struct renesas_usb3 *usb3, bool enable) { if (enable) @@ -2294,6 +2303,41 @@ static int renesas_usb3_set_selfpowered(struct usb_gadget *gadget, int is_self) .set_selfpowered = renesas_usb3_set_selfpowered, }; +static enum usb_role renesas_usb3_role_switch_get(struct device *dev) +{ + struct renesas_usb3 *usb3 = dev_get_drvdata(dev); + enum usb_role cur_role; + + pm_runtime_get_sync(dev); + cur_role = usb3_is_host(usb3) ? USB_ROLE_HOST : USB_ROLE_DEVICE; + pm_runtime_put(dev); + + return cur_role; +} + +static int renesas_usb3_role_switch_set(struct device *dev, + enum usb_role role) +{ + struct renesas_usb3 *usb3 = dev_get_drvdata(dev); + struct device *host = usb3->host_dev; + enum usb_role cur_role = renesas_usb3_role_switch_get(dev); + + pm_runtime_get_sync(dev); + + if (cur_role == USB_ROLE_HOST && role == USB_ROLE_DEVICE) { + device_release_driver(host); + _usb3_set_mode(usb3, false); + } else if (cur_role == USB_ROLE_DEVICE && role == USB_ROLE_HOST) { + /* Must set the mode before device_attach of the host */ + _usb3_set_mode(usb3, true); + if (device_attach(host) < 0) + dev_err(dev, "device_attach(usb3_port) failed\n"); + } + pm_runtime_put(dev); + + return 0; +} + static ssize_t role_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { @@ -2404,6 +2448,8 @@ static int renesas_usb3_remove(struct platform_device *pdev) device_remove_file(&pdev->dev, &dev_attr_role); + usb_role_switch_unregister(usb3->role_sw); + usb_del_gadget_udc(&usb3->gadget); renesas_usb3_dma_free_prd(usb3, &pdev->dev); @@ -2562,6 +2608,12 @@ static void renesas_usb3_init_ram(struct renesas_usb3 *usb3, struct device *dev, EXTCON_NONE, }; +static struct usb_role_switch_desc renesas_usb3_role_switch_desc = { + .set = renesas_usb3_role_switch_set, + .get = renesas_usb3_role_switch_get, + .allow_userspace_control = true, +}; + static int renesas_usb3_probe(struct platform_device *pdev) { struct renesas_usb3 *usb3; @@ -2644,6 +2696,20 @@ static int renesas_usb3_probe(struct platform_device *pdev) if (IS_ERR(usb3->phy)) usb3->phy = NULL; + usb3->role_sw = usb_role_switch_register(&pdev->dev, + &renesas_usb3_role_switch_desc); + if (!IS_ERR(usb3->role_sw)) { + usb3->host_dev = device_connection_find_by_graph(&pdev->dev, + 0, 0); + if (IS_ERR_OR_NULL(usb3->host_dev)) { + /* If not found, this driver will not use a role sw */ + usb_role_switch_unregister(usb3->role_sw); + usb3->role_sw = NULL; + } + } else { + usb3->role_sw = NULL; + } + usb3->workaround_for_vbus = priv->workaround_for_vbus; renesas_usb3_debugfs_init(usb3, &pdev->dev);