From patchwork Thu Apr 26 11:26:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yoshihiro Shimoda X-Patchwork-Id: 10365659 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 57D61601D3 for ; Thu, 26 Apr 2018 11:27:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 46AD41FFB1 for ; Thu, 26 Apr 2018 11:27:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3B2432839C; Thu, 26 Apr 2018 11:27:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 960061FFB1 for ; Thu, 26 Apr 2018 11:27:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754958AbeDZL1g (ORCPT ); Thu, 26 Apr 2018 07:27:36 -0400 Received: from relmlor2.renesas.com ([210.160.252.172]:33061 "EHLO relmlie1.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755209AbeDZL1R (ORCPT ); Thu, 26 Apr 2018 07:27:17 -0400 Received: from unknown (HELO relmlir3.idc.renesas.com) ([10.200.68.153]) by relmlie1.idc.renesas.com with ESMTP; 26 Apr 2018 20:27:12 +0900 Received: from relmlii1.idc.renesas.com (relmlii1.idc.renesas.com [10.200.68.65]) by relmlir3.idc.renesas.com (Postfix) with ESMTP id 1D81176C08; Thu, 26 Apr 2018 20:27:12 +0900 (JST) X-IronPort-AV: E=Sophos;i="5.49,330,1520866800"; d="scan'208";a="277957262" Received: from mail-ty1jpn01lp0175.outbound.protection.outlook.com (HELO JPN01-TY1-obe.outbound.protection.outlook.com) ([23.103.139.175]) by relmlii1.idc.renesas.com with ESMTP/TLS/AES256-SHA256; 26 Apr 2018 20:27:12 +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=N3nH1Y1M0606z6dTsI2uzUQsmMl7aBMJ8LturgmuXyI=; b=CimFovnNgPiabIhVuhzO6TN+GcVhBzgfKaRic/mWsqbnXvobua8WL1zRguEJ/P0gSIb2f/RNOUdFXmPCtPglhnUKRJjfBLij3EdTXzsFGwbWMmxnPmEQD4UJdOeB1OSclW3ApOhZuNM2W8U8aah2FrjLnrTGp6LYzqNS2+7jpFs= Received: from localhost.localdomain (211.11.155.138) by TYAPR01MB2304.jpnprd01.prod.outlook.com (2603:1096:404:8::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.696.13; Thu, 26 Apr 2018 11:27:09 +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 v2 5/6] usb: gadget: udc: renesas_usb3: add support for a usb role switch Date: Thu, 26 Apr 2018 20:26:45 +0900 Message-Id: <1524742006-17984-6-git-send-email-yoshihiro.shimoda.uh@renesas.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1524742006-17984-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> References: <1524742006-17984-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> MIME-Version: 1.0 X-Originating-IP: [211.11.155.138] X-ClientProxiedBy: OSAPR01CA0066.jpnprd01.prod.outlook.com (2603:1096:604:a::30) To TYAPR01MB2304.jpnprd01.prod.outlook.com (2603:1096:404:8::18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4534165)(4627221)(201703031133081)(8559017)(2017052603328)(7153060)(7193020); SRVR:TYAPR01MB2304; X-Microsoft-Exchange-Diagnostics: 1; TYAPR01MB2304; 3:yaFZ8Pr8k1MTzvkEh7iCF7LfnDajmKeNRzApnhjO39C1FTuv24FBxmVKwZMomkXABaS4UUBGEM524gVwxmYgEsJcJ8eIobIghJLj2lDhqpd881HEp0wRK59FJmgNWZOjvixtSwBNElTBxC6xDx8u+ZVd4OpgOgDlr5GvHqCI7fWzNV48BOAD53oy5XSCqznBULf+5rV6Ky6GUIOEXRwpz84zvgCaTl5UHYOhhw9TP5+9vHXXHs9DnMKkCu0ytwRf; 25:wIsOf31RggpSz+uxZdgiEBEE9A1Jv6dDlKqkhYU4FKct0V7lFuiTuKXJ2gZgxnmL46pZlChF6p46TyWRG5vneKnbGdxCkLmwFZ21Y9+dy6414VG5GgwlYSZ2o8p3gDdfCmTHWJjKH0nBOmc6PkOk6etikb1wQhlzq71ghWqGrpMLmBSTEx/rSQoO9nHTX3tt6KeqB489pxjg7XmkoEnAplbCuRLglFIojYhnmJaOzSUb94GMV5tkc1Vi3ExSmxAecyKJQRTYqf7hz0mUaNLRQfBUD6OSX8/DL2IgVTG69c5WcKRTqBYv/YEql+yDOstDOdC4ArXPSnqivYjoAqZMuA==; 31:VdgPbnYf9to8fawRIzU8AK7QldaaPo5gES+gAjaZ0PiGpvgokt353m0qoWGzNEFtlMkGCzF4N7HbxE0PuoGu8rnQ0FNxNNQffAqdKjnerI+vNprQYYbPvRRaHmd8QZ/+QvRFr6qfKa7Ylep9SkAo621EBTBdVbL8xLTToq1RXKk691HpUNcWiURqfxgskftfGItEiSVGytULj5KkIkzCv687VJTdH7pCzAsf8MqakJs= X-MS-TrafficTypeDiagnostic: TYAPR01MB2304: Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=<>; X-Microsoft-Exchange-Diagnostics: 1; TYAPR01MB2304; 20:ZmLyDT2lzTog6Cq9u45HiIMjFKDekD2jhJ6TfF1ASZHPzrFsG5cGFQp759th8H1AB6wODbG4vwWZc3J1D5E0bLF7EMR8YTq0H5gI8ND/AAgklEHdchR4YLpN0EfskYVeu3A9ftbBnK/B0yJmW95qRATr3/v9ud9tp9fVwIN5tN0ZvvwmW4qYJLFm/1RIJqmnNxIXu3nqEIP1VvjO7FjX/Jib/evrSsd5OUSjP9Bardl5m8DUFXIO0DHyKH3nJ+sOWGDfcE5PaJTULf4DD2pWNMLdeo3TYuW+MPms/YE6D2rP2nzKeiLOrM4adBZtxYG7nOZVNeNSAlaSQvU9dnhbaaiShQr8eKd2iiOgoz/bxg9e22IectC1WetQXzaaQF2xVNP56IhsR3YsskKKY4Egki6LHd4/TuqxXnPhDX4bO4QPJf0nuG4J7qhhMa0qc3JYZJcKsSfANJGfsQKy+dm++8bjec4tie4Dv5cLpPRqgL7GQuJ4EZE4QbeSqJyHeivL; 4:3KMUpffr0kyLTzKsVmDOEdM5RbpsRDupg40HfuExYCyYHqO4JhCL4iXKYwG9BIavBjk85nf385lhrraAOyqNXGLZXafRZbG/do2OB3kkteRnU2J5RI6GOOh+tMl/pXJKNJxCPTjV8UfxNLM9hOKT/lvoJWA0OMC67C1Y7tBkfFzS4lVRAvPVeDT+NpBvTB7UHsBQMYbBa1ql3f0cpFuB8ioLJnoo5H7kRlgnNiQ2QoPK7xSUw7qNa2AVGvjsbgvKNk6MLQ9AgWxjXxKObKEDdg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(3231232)(944501410)(52105095)(93006095)(10201501046)(6055026)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061750153)(20161123564045)(20161123560045)(20161123558120)(20161123562045)(6072148)(201708071742011); SRVR:TYAPR01MB2304; BCL:0; PCL:0; RULEID:; SRVR:TYAPR01MB2304; X-Forefront-PRVS: 0654257CF5 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6069001)(346002)(39380400002)(376002)(39860400002)(396003)(366004)(189003)(199004)(25786009)(48376002)(386003)(81166006)(6506007)(106356001)(316002)(16526019)(305945005)(50466002)(42882007)(26005)(16586007)(51416003)(52116002)(8936002)(81156014)(8676002)(50226002)(11346002)(53936002)(6666003)(78352004)(476003)(486006)(2616005)(446003)(7736002)(59450400001)(956004)(6486002)(6512007)(97736004)(2906002)(66066001)(6116002)(39060400002)(107886003)(3846002)(5660300001)(105586002)(4326008)(47776003)(498600001)(68736007)(36756003)(76176011)(3720700003); DIR:OUT; SFP:1102; SCL:1; SRVR:TYAPR01MB2304; H:localhost.localdomain; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:0; A:0; Received-SPF: None (protection.outlook.com: localhost.localdomain does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; TYAPR01MB2304; 23:QcKnd7jGfDgdlc7RNWV+aT+Hsgb5eUB1ChJrg28iZ?= =?us-ascii?Q?v8JBGrtrOVSmyeo2f6oO+VTU4MtAqYbRtYgvE7GI4KXttiXIFFk7U4cXOoSN?= =?us-ascii?Q?4pXNETsIzcEwOhHLlYjLefbhhb0aJZM6T+XHjD8cWRQW1343KNOkDBTeafSd?= =?us-ascii?Q?rCdRwrB4voyqlFf0Yw2PFOo9LRwZgc50CcrRJfDNaiT5ulSRN1SxbNKkTmdI?= =?us-ascii?Q?3F85xFK10wUdzmfcqOTgxXrHTIV1mjL7evnUCz1nE+vCIpX1o51VitHB3QAG?= =?us-ascii?Q?n492khoNkVCgdSJDI+pA4cVq/wZOKhOW9UBWSECFtsYiPmUJKezqBF86iuuB?= =?us-ascii?Q?EJ8Wm5vcQHY5vEtEk32cbv/Qtazcg/ONk8fd6oVliSnED2GU2gaBAgHODJ8G?= =?us-ascii?Q?zgO5qVVa8/i7RMNBy/3jB8KwnXn3ncWBpvweyLUuNHYw6P5LP8e9RHpekeLv?= =?us-ascii?Q?d2BBwhc5bQZfrOYZZ7lYv8T99L16W8Ol8XLS3A3Rt3hPeFZRRgfSTBQMc40Y?= =?us-ascii?Q?t+Ktj9YzHhBdU44gjL68Qkx5yc1BvzP4GMXPTJrUBOanh+k7hLWCCkCPpoP1?= =?us-ascii?Q?d0ebv4gu/DrIdI8PzyJE9YbX/DESA4ZkFZleY5wLUtx3Te+kmVfIj+RIexYa?= =?us-ascii?Q?hEdRm0ofShA9DOHSep3iGaO1MXyZuDQrMXf8f0bC1ghflo6MgKEMk8kTrOXJ?= =?us-ascii?Q?+HXz5B/R9wiw8VRhFSN3vDLiss9etssA2qsXgwcYucVytpO1zAQWVnCmyAvn?= =?us-ascii?Q?PaTxRt/+NzBigBskWmhHb5zsUSRKz/0rpmq75xsYBhN8mBdmKR3bRq4RCDRs?= =?us-ascii?Q?nwSG0c/SJiZkr0wcWWPoENEioolauCN1TEal1VLdMkUaFVzeKCi+NW/rJfK4?= =?us-ascii?Q?e9Ev5L1bI8HPmAEn1kHihqABGNG1SJDKeGiNYugkfpfxyaE2dqJVA3xVVwf3?= =?us-ascii?Q?aR5/D3gxNju/xtyDRw7D7b7okWxDaVa+hSWmeQ+RrxfgFNH6oFLylSv5NZz+?= =?us-ascii?Q?4eX4Rsd36EJ4bFd6e2RmMUCDDBy81JK9A/+E9SVCXfMUxtje6gUWzI701SKu?= =?us-ascii?Q?Oe1JX2yQ5IscU8VxRHI+e5BMuj0u5oHxdGW1zH4v8CPYfqaY1j+OeY245wC7?= =?us-ascii?Q?RGJegk5/mcutEPoCyaZn4gdawKQmuc5WDRfo4e0ZeM7WxbXmRskCouhAXN/A?= =?us-ascii?Q?tx3IaDMF49f0XPjMNVnQ768ThC0k+aY7W1dduIIJKpt99MQlO0MLXL/Z+jHB?= =?us-ascii?Q?JXnQ/FYC9cfFqgK7Hxd4oHDom4LjZFN/s7THBRi37SjOpuCW9n2Zz52YWote?= =?us-ascii?B?QT09?= X-Microsoft-Antispam-Message-Info: 53K8W80Widz2M4xgqE9UARNdGsm+dlaYb1RqSGnmKfAXGodGqLKxnFqRLCyDKpcB97plcaKONLJCZodVjDvETWR5jRVjvZ5938DtwBJO3oSnbmDas3wetn3wSLNFZO8tHlUk78pv2RA2GFhQIdIW/CWjk1UAztpJRixmFTfl44SmoU9awzES82yDFVAMt2e8 X-Microsoft-Exchange-Diagnostics: 1; TYAPR01MB2304; 6:lW6qY8XcYUc6e1Yg4J4JfQF6G6Z+lBkCNoyCPdtG+/JmOsVjGWfqGRie9k8bl1toSdsxq9+EhkqtnBNwFhlHDO3RKy967qEqineLWPj9I1+oX/zIF9f5vPPcqk06DGY4yaMSsyWYmssxcyxZpVrT4oGiGcsQog4frmQSb2m9hblTKKa7dtivOS7NbPYgjFHLr8u1Fh9redhRBlB0LKKPVA4auOoYGV23k3NhNCnAVNRmkGbHDrO2hLf7J20V6P7pya5vTHryzsgweOLYksiodAmSCde3TYniemdzac20Z1/LY9Df1Z3411iQySXgLdEXrqqFftDfi1974y/CfgIzvV5E1AosOusdL6dswJhn94iKl467o+Mg8v6X3ISBd+7UfDp1gyKKu8x5zdkIm2JPNFHisCd1kLp1ARczD8Bx4KJ+7DiodhA7/myIiHupd315STmv7oSVRG8JA/8JYaA9Uw==; 5:53s+uB+1+7ifkuzzvsE/AIV6yDLf+u4ZBY0D+32zyTigOMdWQ8MYnxd/TxBwo69FdskBwhSgMk0zzNnK0q49aLb0DtxM5Ps+PluhKM4kwqDYzz6pyHL2AkUISuyA8VeI/4iYG1UiDWGT9Ia4QUkfaryPBcwUIAkKy9BjhqzzmuU=; 24:qwXrGs1EtH7ylcPsV/+Z7bnjWX/UntDMNtxW4CVeopzTtlihqaYamb0AylGFIfk0ji0JipSx99SFWbRMZ702OYsJx/nlTw3MbHPIb/npgcQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; TYAPR01MB2304; 7:yEKb96brEcGzl8q104rEaVV7iV+V6RRTNKHHBVSvLFvhcaPE03NhmMkWGjlDEoMoPG4u/LM1j7qtKbg/77qs0w+Eut8wJe+rRNv9kh08OlfARKylyIVdX0OZNMz6q89d1Lsvuu6NH/0KfcHd514paMvgepy50f05DIlcSX86qm/Gr/EKNwydsNxo2+kcvpY0qgejrk8WOQV8+/C9v0fxZ9mW2EU9TXRBBrSXbazGfSoqYo7vEmuQugyKGRSC5ijD; 20:edxTrWqn7/ISsuhSYmiq+siAcz1bdGc3PDbY02Yt3jpNo9U7/5A/vpX8ar13cDWe/jAeWjG+4jOUzFwc7HoaATT7z8T0Y3PYI3YC2jbkZhfeTheVchsJbyBgMp87SWbqzC+R7/bxi70UOKZnOuzgu2z+3QmZTHLCVaO/7ANmjjs= X-MS-Office365-Filtering-Correlation-Id: 40aada6e-566b-4809-4560-08d5ab68a652 X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Apr 2018 11:27:09.5026 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 40aada6e-566b-4809-4560-08d5ab68a652 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 53d82571-da19-47e4-9cb4-625a166a4a2a X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYAPR01MB2304 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch adds support for a usb role switch driver. And then, this driver uses the usb role switch APIs instead of hardware access to initialize usb host side at specific timings. Signed-off-by: Yoshihiro Shimoda --- drivers/usb/gadget/udc/Kconfig | 1 + drivers/usb/gadget/udc/renesas_usb3.c | 34 ++++++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) 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..5b7b1ce 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 @@ -330,6 +331,7 @@ struct renesas_usb3 { struct usb_gadget gadget; struct usb_gadget_driver *driver; + struct usb_role_switch *role_sw; /* Optional */ struct extcon_dev *extcon; struct work_struct extcon_work; struct phy *phy; @@ -454,7 +456,11 @@ static void usb3_disable_pipe_irq(struct renesas_usb3 *usb3, int num) static bool usb3_is_host(struct renesas_usb3 *usb3) { - return !(usb3_read(usb3, USB3_DRD_CON) & DRD_CON_PERI_CON); + if (usb3->role_sw) + return usb_role_switch_get_role(usb3->role_sw) == + USB_ROLE_HOST ? true : false; + else + return !(usb3_read(usb3, USB3_DRD_CON) & DRD_CON_PERI_CON); } static void usb3_init_axi_bridge(struct renesas_usb3 *usb3) @@ -645,10 +651,16 @@ static void usb3_check_vbus(struct renesas_usb3 *usb3) static void usb3_set_mode(struct renesas_usb3 *usb3, bool host) { - if (host) - usb3_clear_bit(usb3, DRD_CON_PERI_CON, USB3_DRD_CON); - else - usb3_set_bit(usb3, DRD_CON_PERI_CON, USB3_DRD_CON); + if (usb3->role_sw) { + enum usb_role role = host ? USB_ROLE_HOST : USB_ROLE_DEVICE; + + usb_role_switch_set_role(usb3->role_sw, role); + } else { + if (host) + usb3_clear_bit(usb3, DRD_CON_PERI_CON, USB3_DRD_CON); + else + usb3_set_bit(usb3, DRD_CON_PERI_CON, USB3_DRD_CON); + } } static void usb3_vbus_out(struct renesas_usb3 *usb3, bool enable) @@ -663,8 +675,8 @@ static void usb3_mode_config(struct renesas_usb3 *usb3, bool host, bool a_dev) { unsigned long flags; - spin_lock_irqsave(&usb3->lock, flags); usb3_set_mode(usb3, host); + spin_lock_irqsave(&usb3->lock, flags); usb3_vbus_out(usb3, a_dev); /* for A-Peripheral or forced B-device mode */ if ((!host && a_dev) || @@ -2238,6 +2250,10 @@ static int renesas_usb3_start(struct usb_gadget *gadget, /* hook up the driver */ usb3->driver = driver; + usb3->role_sw = usb_role_switch_get_by_graph(usb3_to_dev(usb3), 0, 0); + if (IS_ERR_OR_NULL(usb3->role_sw)) + usb3->role_sw = NULL; + if (usb3->phy) phy_init(usb3->phy); @@ -2260,6 +2276,8 @@ static int renesas_usb3_stop(struct usb_gadget *gadget) if (usb3->phy) phy_exit(usb3->phy); + usb_role_switch_put(usb3->role_sw); + pm_runtime_put(usb3_to_dev(usb3)); return 0; @@ -2632,6 +2650,10 @@ static int renesas_usb3_probe(struct platform_device *pdev) if (ret < 0) goto err_add_udc; + ret = devm_of_platform_populate(&pdev->dev); + if (ret < 0) + goto err_dev_create; + ret = device_create_file(&pdev->dev, &dev_attr_role); if (ret < 0) goto err_dev_create;