Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752176AbbL1K4k (ORCPT ); Mon, 28 Dec 2015 05:56:40 -0500 Received: from mail-bn1on0132.outbound.protection.outlook.com ([157.56.110.132]:35456 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751934AbbL1Kzd (ORCPT ); Mon, 28 Dec 2015 05:55:33 -0500 Authentication-Results: spf=permerror (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none;freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; From: Ramneek Mehresh To: CC: , , , , Ramneek Mehresh , Li Yang Subject: [PATCH 3/7][v5]usb:fsl:otg: Add support to add/remove usb host driver Date: Mon, 28 Dec 2015 16:42:30 +0530 Message-ID: <1451301154-14422-4-git-send-email-ramneek.mehresh@freescale.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1451301154-14422-1-git-send-email-ramneek.mehresh@freescale.com> References: <1451301154-14422-1-git-send-email-ramneek.mehresh@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD022;1:/sQLms5PjpbFyg/YDWmBHfS3QvSk0TLTTs5cYmWZCC+vJFk1nLf/ECwI1r07wYeq8jTe3f7teUVA8bkkOUd8ieAdAktBFqbNrkANouuJ4ZhsIYM7LjZrmB+zDna8WWFmDtyTRSrabZJWHxdKcrYspUzNacEXvt7O8TG/xQhY60WBn23EWXn88oh4v8D1Fc4KOtg56jAYF5OUcQ0PkvO9EcPMImgMEiJ3ppktvePL7g86Yh4RjzVizTUwU7VeNwAIztig7WwixNkhpRaihSDoNSQQ5n2oVnGRtHO6hE7Z+Hr8pJJukZf8LDt4YYEFxFvguf2FE0PX5uEbsQtYjc54BLZ3NuHIOi5W4h8GDEIi2Az3SFMWsu1ZR3q2tBtJ5wLWLliYZw8G5i+UajSSSl2GRfM2qQQ2cpkLYlo1hDAG1eQ= X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(448002)(199003)(189002)(4001430100002)(19580395003)(77096005)(92566002)(47776003)(69596002)(189998001)(19580405001)(104016004)(2351001)(48376002)(11100500001)(50466002)(5008740100001)(50226001)(106466001)(2950100001)(229853001)(87936001)(36756003)(6806005)(85326001)(76506005)(33646002)(110136002)(1096002)(5001960100002)(107886002)(76176999)(97736004)(50986999)(586003)(81156007)(86362001)(5003940100001)(1220700001);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR0301MB1580;H:az84smr01.freescale.net;FPR:;SPF:PermError;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1580;2:LIZTF4HLaiPSaRqweaew8smzeykdTIWi/qCeO1A01uwa4lX2GFJqaifOvd8uZobZWl93DQLiGKEpzKeYE+GJ4IdfZHpPNMDElj1tcFjFSw4jmvdMm0F1A4S8YNei2QmC1/SRHkBwu6+aMeB2hN89DA==;3:OMeYo5UxkwDFFoJ9m3keXJnYIX0HG10pMC+z3nyehbW7KJWE++qZwB+FzZemNBbkfdu8cD5udhKE8/GQ4UQ7QfCXY58sFCbehU6QQJmS7CLfoxZyWKwZYuHJ3dNtNyAYwRBEzIXQgzN8wt4ZoQm/wV45aTeEM6jhvkzpp4JWv+20pG/9Oy3cKy24sevMdBZam+G6YZSpgi1H8I2DHF5ntPqLeWgL9oEkA1geBMb8ceo=;25:weKEYDOph8mW96PFZb3SgJozGDCppVjJUsqixeuksogwZrGJYq5cYP7ARbuoigkYls9OGbcuNqzhBJ7Eh/Bo59VcZ16mqUTzINLdpcpDdklLAxUkBEsypDHb5h1ZreH3wL7zkepBPbJ9s0GlverypV4cXBIuZwCcelhj4lyI60xMHxI7wkeBOEPdDXXMvMV5C57Dcrrqmqp+dzv9M3ZxpKNFMsCZSLZAaGN+Df5M+ve9ADTQpEhNsc/pkOQLSWFSARPPAlgCH7QDNgqGoeFl0Q== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1580; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1580;20:conj42yIcOOz+wqs9sXQHRfF8H29ZfqKRbpiZSKZW/DGdokGtI3/oZFvbPjzSdt3udya7xSWaSBe84QUQSAvXWen4eofFQnwPXZ9/AHTebX9EgabWmFWQZgxS8+S2IAmsJvU3Iv1YP1LQTY0iwVULcUPKcEqWllxYHTqT1Dn0qnrmdoiLThr+srOhqp9ILzkv7wkXtkxSDYTWoEMbomHHRFuXY+lE3/q41niszSzEgTt1/lt168LmXFXgDxymLdlyR7+Q4IHwP7QiCngoN4fEtflnU//X819+pPaYQ/l354MunGDaS1+2akaJHHn39ACOHvFSIX14OOgBbpxgjxiP5j1VZvdx6xdsFyvovVoeGE=;4:9lGJirYbr/l1LOJHZJkVZEmRetUZJEHHnFnrKrt200EBYG3L5J4Skw8QYi4bpEIHBNuweUhwsIw2Hek/z5bQfuKQ8VPSovHvoN9/BHGDnQ9UgNO3Vdi7zbEWUTgxXw25mpWopZ21puFG++mwpq4HqU/fY4HnfnKT9pQ6dgtSanomU2IoAmrrRtNFtJEz4pjfaeaCfexSO3KQ/Er1abo/2sKtPlIe9vcxF/J35B+9ct6qVFYm1JPw7M1LoTPLR4QS+pxmkY2J292BAMEEHrkYdioO0t4aUEmMq97BO6WfSojvmdDr5USllmcrDj4LWcd/3z/MnWyRGriGTYjeqSj6bNg0jGUWVLpr8EzTK4FRKMLi3gkuObQUp9LBuWHjxpfKbTlnuA8F19FUa5xit09yaQqu4UMF8FZoxYjhsMwv0hXhYOISzyhVJElKKDhuYkybjZpl2SNS5JBBZG0JeBFPvA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(35762410373642)(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(10201501046)(3002001);SRVR:CY1PR0301MB1580;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1580; X-Forefront-PRVS: 08041D247D X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB1580;23:K0iKdgZGsyYOgk1Ga4PqL+yP9TjaMdBlk/H3OQc?= =?us-ascii?Q?vy12hn3K0wgZNCLoTxlWAcUUgLEKEjn6+e9Xcd0MPxnGaznyHnqjr7WHoUtG?= =?us-ascii?Q?vaWF0RbS/tLcKgy6hQjcoFvRAY6xUIhgbJdH4VQBh85nYA4VcMH/WhYKQOdq?= =?us-ascii?Q?Gx8ws+HaN1eSBuW8guUyW2bK2dHuq4uzLgrFQdN6kjOWn2GtcimmgSbRqUKa?= =?us-ascii?Q?Qi0Jx4fs/i6MOj+RwV+Y7gIE5o6Hnc3DZXsp194H7JJgbGOdiD9ujvChzUQp?= =?us-ascii?Q?bUDpLulmaN0kzuMRSWtNrIITqmwan9Xrn4SRytTk08wMhKHrZZm/BaHO7Bzq?= =?us-ascii?Q?oAf/GIavnNdWLzZGM9ydRcCpqiVck94dxqeoQGYX8kghmWG1sJnUKnOVs/sQ?= =?us-ascii?Q?vwFYfpk0HSmJNt+jZqwF41N3jJzJ9o5dn06n5JMwfC+5gwolZ1mic3aTNFvk?= =?us-ascii?Q?Cv5V82MG58u4dTD4HgdkEIQ0UV9c3s/DaIClKD4JKPWUU7uVvXey5CFvIv3d?= =?us-ascii?Q?VpQoK82PcfNRNOh1Qwst4M6DpGoIku2LaRKmQpTPLZPBulpOb9sk3h/rofcN?= =?us-ascii?Q?k/brvZbdqATgaD5WWHkH+PbczEX/UyZyoQfGdN3l57X8Ljj8TnKuIZoTffaR?= =?us-ascii?Q?x580yeSsgaGqCFJQquFq0HF5rHSXlo7IhwsST0XJ/umI4Rxgb+WPh23NZD3i?= =?us-ascii?Q?E+WVM4yXBtCjyc2afm4kaaOTcrXtZVElzzpkvnV6SIDuEQwQhbaQhPQjSFOf?= =?us-ascii?Q?rpv9S8EMbXY9Hd5SqW041WsdVfcP3Gmx0g75phwwpCwotHWCouPYk0eAolXw?= =?us-ascii?Q?bQLG5noIONYOEOKNv5Y+ZyKK8pVj29RK1vYMyBBh7WRFPldsgrS3a+8316LQ?= =?us-ascii?Q?XM0r5qaxhTGLg//R40U0zejFx51b1Qus3ne+ZT77BZxWe5qFX26iFCJkNJYS?= =?us-ascii?Q?Er2mvFTGunPYnSLyi+PjcrJfZKjnt5/wShWdAB4OctcrY9EFC2dkB0JyVbwU?= =?us-ascii?Q?a5LgPfqcGTkZ/yJvkIWUH2ITgkJA7ozkNDTWs+WYdbDMFKdzjo6MzQkDhCEq?= =?us-ascii?Q?hQDZwYvboqXMvfqz9j1an9b/Q8ZmRTdB6to4RKFqbznNZSQ47mg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1580;5:8iq6ZRD1y18ADvT8vrdLUGfX0Q6ffzOXaNERvk33Xxp+/wqZUlet6EoQDdHydDd6u6/lew/FUyINF0jyAUBpCzdtXuO57baaZCiImFuQ2rvjimO4IUjLCnKREji0F/fpq2sDcxHKivvxEfx6wlp77A==;24:PjiuK9zSwH+b8dZ07o1ACNBYyTossYX1pwU8ivdXrLGyNJ/2KCvdS7uwV9wQcCE6ff+Yz4zeCxzOGwd+KN23sLPdcf6ZpdzUzpHOEgK8tw8= X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Dec 2015 10:55:28.8708 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1580 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5990 Lines: 201 Add workqueue to add/remove host driver (outside interrupt context) upon each id change, and to remove host driver upon otg initialization by changing have_hcd variable. Signed-off-by: Li Yang Signed-off-by: Ramneek Mehresh Reviewed-by: Alan Stern --- drivers/usb/host/ehci-fsl.c | 73 ++++++++++++++++++++++++++++++++------------- drivers/usb/host/ehci-fsl.h | 16 ++++++++++ include/linux/usb.h | 1 + 3 files changed, 70 insertions(+), 20 deletions(-) diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index 3b6eb21..a01860d 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -44,6 +44,31 @@ static struct hc_driver __read_mostly fsl_ehci_hc_driver; +static struct ehci_fsl *hcd_to_ehci_fsl(struct usb_hcd *hcd) +{ + return (struct ehci_fsl *)hcd_to_ehci(hcd)->priv; +} + +static void do_change_hcd(struct work_struct *work) +{ + struct ehci_fsl *ehci_fsl = container_of(work, struct ehci_fsl, + change_hcd_work); + struct usb_hcd *hcd = ehci_fsl->hcd; + void __iomem *non_ehci = hcd->regs; + int retval; + + if (ehci_fsl->hcd_add && !ehci_fsl->have_hcd) { + writel(USBMODE_CM_HOST, non_ehci + FSL_SOC_USB_USBMODE); + /* host, gadget and otg share same int line */ + retval = usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); + if (retval == 0) + ehci_fsl->have_hcd = 1; + } else if (!ehci_fsl->hcd_add && ehci_fsl->have_hcd) { + usb_remove_hcd(hcd); + ehci_fsl->have_hcd = 0; + } +} + /* configure so an HC device and id are always provided */ /* always called with process context; sleeping is OK */ @@ -147,11 +172,15 @@ static int fsl_ehci_drv_probe(struct platform_device *pdev) goto err2; device_wakeup_enable(hcd->self.controller); -#ifdef CONFIG_USB_OTG if (pdata->operating_mode == FSL_USB2_DR_OTG) { struct ehci_hcd *ehci = hcd_to_ehci(hcd); + struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); + ehci_fsl->hcd = hcd; hcd->usb_phy = usb_get_phy(USB_PHY_TYPE_USB2); + + INIT_WORK(&ehci_fsl->change_hcd_work, do_change_hcd); + dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, phy=0x%p\n", hcd, ehci, hcd->usb_phy); @@ -167,8 +196,10 @@ static int fsl_ehci_drv_probe(struct platform_device *pdev) retval = -ENODEV; goto err2; } + + ehci_fsl->have_hcd = 1; } -#endif + return retval; err2: @@ -375,15 +406,6 @@ static int ehci_fsl_setup(struct usb_hcd *hcd) return retval; } -struct ehci_fsl { - struct ehci_hcd ehci; - -#ifdef CONFIG_PM - /* Saved USB PHY settings, need to restore after deep sleep. */ - u32 usb_ctrl; -#endif -}; - #ifdef CONFIG_PM #ifdef CONFIG_PPC_MPC512x @@ -531,24 +553,26 @@ static inline int ehci_fsl_mpc512x_drv_resume(struct device *dev) } #endif /* CONFIG_PPC_MPC512x */ -static struct ehci_fsl *hcd_to_ehci_fsl(struct usb_hcd *hcd) -{ - struct ehci_hcd *ehci = hcd_to_ehci(hcd); - - return container_of(ehci, struct ehci_fsl, ehci); -} - static int ehci_fsl_drv_suspend(struct device *dev) { struct usb_hcd *hcd = dev_get_drvdata(dev); - struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); void __iomem *non_ehci = hcd->regs; + struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); + struct usb_bus *host = &hcd->self; if (of_device_is_compatible(dev->parent->of_node, "fsl,mpc5121-usb2-dr")) { return ehci_fsl_mpc512x_drv_suspend(dev); } + if (host->is_otg) { + /* remove hcd */ + ehci_fsl->hcd_add = 0; + schedule_work(&ehci_fsl->change_hcd_work); + host->is_otg = 0; + return 0; + } + ehci_prepare_ports_for_controller_suspend(hcd_to_ehci(hcd), device_may_wakeup(dev)); if (!fsl_deep_sleep()) @@ -561,15 +585,24 @@ static int ehci_fsl_drv_suspend(struct device *dev) static int ehci_fsl_drv_resume(struct device *dev) { struct usb_hcd *hcd = dev_get_drvdata(dev); - struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); struct ehci_hcd *ehci = hcd_to_ehci(hcd); void __iomem *non_ehci = hcd->regs; + struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); + struct usb_bus *host = &hcd->self; if (of_device_is_compatible(dev->parent->of_node, "fsl,mpc5121-usb2-dr")) { return ehci_fsl_mpc512x_drv_resume(dev); } + if (host->is_otg) { + /* add hcd */ + ehci_fsl->hcd_add = 1; + schedule_work(&ehci_fsl->change_hcd_work); + host->is_otg = 0; + return 0; + } + ehci_prepare_ports_for_controller_resume(ehci); if (!fsl_deep_sleep()) return 0; diff --git a/drivers/usb/host/ehci-fsl.h b/drivers/usb/host/ehci-fsl.h index 1a8a60a..64538eb 100644 --- a/drivers/usb/host/ehci-fsl.h +++ b/drivers/usb/host/ehci-fsl.h @@ -63,4 +63,20 @@ #define UTMI_PHY_EN (1<<9) #define ULPI_PHY_CLK_SEL (1<<10) #define PHY_CLK_VALID (1<<17) + +struct ehci_fsl { + /* Save USB CTRL, need to restore after deep sleep. */ + u32 usb_ctrl; + struct usb_hcd *hcd; + struct work_struct change_hcd_work; + /* + * store current hcd state for otg; + * have_hcd is true when host drv al already part of otg framework, + * otherwise false; + * hcd_add is true when otg framework wants to add host + * drv as part of otg;flase when it wants to remove it + */ + unsigned have_hcd:1; + unsigned hcd_add:1; +}; #endif /* _EHCI_FSL_H */ diff --git a/include/linux/usb.h b/include/linux/usb.h index 89533ba..b7eb033 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -359,6 +359,7 @@ struct usb_bus { * for control transfers? */ u8 otg_port; /* 0, or number of OTG/HNP port */ + unsigned is_otg:1; /* true when host is also otg */ unsigned is_b_host:1; /* true during some HNP roleswitches */ unsigned b_hnp_enable:1; /* OTG: did A-Host enable HNP? */ unsigned no_stop_on_short:1; /* -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/