Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752545AbbGOMGW (ORCPT ); Wed, 15 Jul 2015 08:06:22 -0400 Received: from mail-bl2on0139.outbound.protection.outlook.com ([65.55.169.139]:21184 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752481AbbGOMGT (ORCPT ); Wed, 15 Jul 2015 08:06:19 -0400 X-Greylist: delayed 944 seconds by postgrey-1.27 at vger.kernel.org; Wed, 15 Jul 2015 08:06:19 EDT Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; mgd.freescale.com; dkim=none (message not signed) header.d=none; From: Ramneek Mehresh To: CC: , , , , Ramneek Mehresh , Li Yang Subject: [PATCH 3/8][v2]usb:fsl:otg: Add support to add/remove usb host driver Date: Wed, 15 Jul 2015 17:32:47 +0530 Message-ID: <1436961772-11482-4-git-send-email-ramneek.mehresh@freescale.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1436961772-11482-1-git-send-email-ramneek.mehresh@freescale.com> References: <1436961772-11482-1-git-send-email-ramneek.mehresh@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD055;1:4jCRFh14BMzY1I9D330C65cM/X9irSDgE/v8VmGAoABKw8tmxTwCIocyJhzs56e5uAGRCGcEmoOlodcOo0/qqkU0co7qqraTJ8C6bi5FpttpaPHXd7TTpa9ijtXMOnRp8AuifgxvzcvV/3+CGsy8BV0E15sU0JwJBaiOuHJZp81W3NnobG5UYoL8m/Ui4Kzgt58zpqs0Hc3/2emileSi4k34NUCAo1v1Ht3T7js90pYgptaUw/Kp4BtJfF5NXMiH+T1dM5+6z5EuNpc7sfGS0XaTjcBhJiYADEPwBcYBpLtxZKZa5Hw0CZmFgVGcKZlvsIP9r8mxbJRlqW574Z7bd77V7lc7anc3ugErpR95Eli8rrRgzRK1BcSsWBCoC+v8242BXw+IJmFg2VBxO7vfvGrx4auy6oCepXLzmZPXsUSZ48Bkcwe2TCZdYSbgvGkW X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(339900001)(199003)(189002)(105606002)(46102003)(107886002)(19580395003)(5001960100002)(76506005)(110136002)(77156002)(106466001)(229853001)(2351001)(47776003)(104016003)(5003940100001)(33646002)(189998001)(36756003)(85426001)(62966003)(6806004)(87936001)(2950100001)(86362001)(19580405001)(50986999)(77096005)(76176999)(92566002)(48376002)(50226001)(50466002)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:BLUPR0301MB1571;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;MLV:sfv;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;BLUPR0301MB1571;2:cE5HcJqsTQs9Sb3lx5SFLXYK2YgnphOqhW4KlhKliM0dv9iwatUp5h0testO6IyJ;3:twzv5Yb8T8xA5gDeC0Zz2HAM6U5NtMxPMkXVxJ3Z78fn5seDLxRxexnozlrAKp9JTU243L09QqGrD4vIjDhZQLVHkjDCIsuiAhmzpldxiS9qxgNLQWvPiglqOi0zbSEmAQJZXG7nXrQV9Ur4yqQxWCwSIBPVwgYsYa2aKDrRTMBke559KapvQWzNF70v3c543bJ16v9zFTGVlBOzHO13C6r+YYUxsZmqzJOnxaxgFw0=;25:ygqF57lOZ5rungaipyqx+GKe8lGBtR0zmi5JQ++0z+jzPVYODXE2UCb3RJjYGDQ+FmIOjK1bTfLHTb5k4hONBOnA7/7Bb8IKyP3FfBEUmKSh+YMCs9tsO5ReYZg+y2AMjrejYlYCyEBr48ebRskuF/2RxMmU1RjLfY4Lb6re0y8LNUYQoXb/yH5P0xOdGdaH5pfzzNh76O3SLLtn82IA2N+HxpfJe46hPX5l1L4tNrommbqSfJkdcmP1+8OXUBceMIbd5xwVc4F6wxXVnvgxqQ==;20:GSRV+M5uBSH0T47oq5ifIVPuPXtQfjbdlITVH8kj3eVsm+wn1MzWL5YH4hhAh3vJ2Vg/UzvzP3MsqCrQR3gZo7pg+ntq7c2iMmyxxAdcyEsqxbHV9LbVwT/ynka8O6scfEI1OmA8fqbA0iGsozBNxReAswcL8sWtc+9dqqZjMvujNXlX+3KeHIRVkSzFp5mFSKl2wh/SvDUSDvMAxSWfNR1XE0OMon9gI4XqopQg+Sp8my1sBz9B/dhoLDAIWzEgeEKC1C04l7Dor7EpH3gASWXggvL7CYqAS3Y2X7d05PPVJgX8kYiSvi+pLXf4pfS6+l0hwNB+dg7UjJ8K7GcdEeAjxbQg4z8MPoHNabOSngs= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR0301MB1571; BLUPR0301MB1571: X-MS-Exchange-Organization-RulesExecuted X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(3002001);SRVR:BLUPR0301MB1571;BCL:0;PCL:0;RULEID:;SRVR:BLUPR0301MB1571; X-Microsoft-Exchange-Diagnostics: 1;BLUPR0301MB1571;4:dGFGV7gMCZL6TsKxSIus2EQ8FDv2i3n3/A0zvN96xDYZvmf0A80rfgaeosni2u66o+FdA1wnWBFPCY+n/jzhnsCW4skBmBZ6QCj+K45mLj9hkJrBJVoQt6q86TdkCVzPtwQB/wG+q/ANSkZEu3xXmt2fCaCe29wA73qCusIjMk6zH3afsep9A8RjdG+3U78nxMWhJdNhOL7rmek9meaRyEVtvH79eEvBBlHY+bHGFAEZdkdZIM4GqrhF0cQfMQvntETevjDxNsKyVQ2My+EJs66SgHxkcoP55eQIQnvjWm4= X-Forefront-PRVS: 0638FD5066 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BLUPR0301MB1571;23:CLX6fAbArCUeuS3YJ9Z1JkTaMRq2l36eQXbdsbd?= =?us-ascii?Q?BgSaWeXBFDqIUrdDr41F6O0Fewdnl867woem7uNzaynWYtwKrm2mAPG1bC6T?= =?us-ascii?Q?0SuIntEfjkl8Kz+GnD3ZRvUYlsqxKZ53cc3hYof6DXpzE0E1EtNyPFi0mcUg?= =?us-ascii?Q?WnZlQmUjO0ARqjBIYbqiiiAC0etu6g3GP6QJlCZxqtNr35xrcRQbahr6dQHC?= =?us-ascii?Q?fA9PeMme+ejUokNsmIo2XkeWvLY0b0JiyGR3NuerqAPIapL/qL0xpp0u1A43?= =?us-ascii?Q?Ck+Z8GMJ2ROi/dlez8bWJ6/12djNmZLFR+oeG5QsISc79Bv5K9JLlbUOz/Vw?= =?us-ascii?Q?L0c+uT1R4ulq3UQV/goFz5HGacfLYL9nXBh9QABN1qGIekR7+A0YNlQOoc2/?= =?us-ascii?Q?ZePACzJq4wKYljbdwfB0mnX67kMwe5a2d6rDcxFPk28oDbJVtF+yTeFbeK6o?= =?us-ascii?Q?rz33vD1NdL3iu1JnyXccwJPTYqjKpI1bTMNI6zQk8ySfBGiICBSHKBZrw9Ie?= =?us-ascii?Q?iMsgb2d3K/IzhO68LfENaik+v58m3pgygCLlvXnWdkNEdfW/FFhpUHmFHBrq?= =?us-ascii?Q?wLDeOuScpBYKa+QOMuybXBIPVixl53yZuIoby7ya7cUKk1HFDAuFqx45d1D3?= =?us-ascii?Q?f99zq4FZSO3RMDnuWKZedRH9C19//YB6slFVkXIQqok3g9O5f6R8Gll7Gm2g?= =?us-ascii?Q?iRvegha7a9kMg7XnbojW7JWaCe+xwKKmIdjiVV0I3LGj3LBSO/BW99803b5F?= =?us-ascii?Q?7rSfEVvvKCAO++dDU1I/GCsnGL/oteOQUI7WowoSkFGLlbQWfN0iAbp3iBLH?= =?us-ascii?Q?c4dtK1T3ux3VHQsmmtvZBpmzfBIHJgQ+PRfL4thIFCJdTWlFIBV16b/L21Rj?= =?us-ascii?Q?MqphhFO+ReCadgVX5OQhS/fwh4UgkkQr+8M/hq4AVTjHT/UAles8ICjoZOoQ?= =?us-ascii?Q?Yx/uJ7iZQAY8FU+t0gNXfYzUd2cKRzWW4Dw0O2MqIAN1iG8c9zbW0LFUuvyC?= =?us-ascii?Q?uKTo=3D?= X-Microsoft-Exchange-Diagnostics: 1;BLUPR0301MB1571;5:q07yanXwpQAFNDKBV9Hu724U18mtB4rf25Gx+he541SnLmVRtPns4eVw9U3TiLqYhSqGQq9i+/mFhYyGnX/wioCO/Efq7XPwpapKpOAbAyyM/FdCh9FfyLW2WkFuQHmUmUjpAb/vSswFRIkBAVxsyA==;24:J7OjO3+rb+SHLrpkeltxcCyLaWgAMQMm5NY+n44C+TPcnTMlAlJ6XADt900NEVxXLkSJpe0UUmjUyftyN19lOnSvoXDFybVQ3tElceLqKxA=;20:R33N4YFl+nTsHNkJyMezwSbLfYlHzdfGKih7QpbLSbvM42OvorwwA0ywW6rhoCuXuCcQBsatg3DwPB0CFm2hog== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Jul 2015 11:50:40.9910 (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.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR0301MB1571 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5761 Lines: 191 Add workqueue to add/remove host driver (outside interrupt context) upon each id change. Signed-off-by: Li Yang Signed-off-by: Ramneek Mehresh --- drivers/usb/host/ehci-fsl.c | 83 ++++++++++++++++++++++++++++++++++----------- drivers/usb/host/ehci-fsl.h | 20 +++++++++++ 2 files changed, 84 insertions(+), 19 deletions(-) diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index 5352e74..81e4bf5 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -44,6 +44,34 @@ static struct hc_driver __read_mostly fsl_ehci_hc_driver; +#if defined(CONFIG_FSL_USB2_OTG) || defined(CONFIG_FSL_USB2_OTG_MODULE) +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; + } +} +#endif + + /* configure so an HC device and id are always provided */ /* always called with process context; sleeping is OK */ @@ -136,11 +164,16 @@ static int fsl_ehci_drv_probe(struct platform_device *pdev) goto err2; device_wakeup_enable(hcd->self.controller); -#ifdef CONFIG_USB_OTG +#if defined(CONFIG_FSL_USB2_OTG) || defined(CONFIG_FSL_USB2_OTG_MODULE) 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); @@ -354,15 +387,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 @@ -510,24 +534,31 @@ 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; +#if defined(CONFIG_FSL_USB2_OTG) || defined(CONFIG_FSL_USB2_OTG_MODULE) + struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); + struct usb_bus host = hcd->self; +#endif + if (of_device_is_compatible(dev->parent->of_node, "fsl,mpc5121-usb2-dr")) { return ehci_fsl_mpc512x_drv_suspend(dev); } +#if defined(CONFIG_FSL_USB2_OTG) || defined(CONFIG_FSL_USB2_OTG_MODULE) + if (host.is_otg) { + /* remove hcd */ + ehci_fsl->hcd_add = 0; + schedule_work(&ehci_fsl->change_hcd_work); + host.is_otg = 0; + return 0; + } +#endif + ehci_prepare_ports_for_controller_suspend(hcd_to_ehci(hcd), device_may_wakeup(dev)); if (!fsl_deep_sleep()) @@ -540,15 +571,29 @@ 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; +#if defined(CONFIG_FSL_USB2_OTG) || defined(CONFIG_FSL_USB2_OTG_MODULE) + struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); + struct usb_bus host = hcd->self; +#endif if (of_device_is_compatible(dev->parent->of_node, "fsl,mpc5121-usb2-dr")) { return ehci_fsl_mpc512x_drv_resume(dev); } +#if defined(CONFIG_FSL_USB2_OTG) || defined(CONFIG_FSL_USB2_OTG_MODULE) + if (host.is_otg) { + /* add hcd */ + ehci_fsl->hcd_add = 1; + schedule_work(&ehci_fsl->change_hcd_work); + usb_hcd_resume_root_hub(hcd); + host.is_otg = 0; + return 0; + } +#endif + 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 dbd292e..3fd1fd0 100644 --- a/drivers/usb/host/ehci-fsl.h +++ b/drivers/usb/host/ehci-fsl.h @@ -62,4 +62,24 @@ #define UTMI_PHY_EN (1<<9) #define ULPI_PHY_CLK_SEL (1<<10) #define PHY_CLK_VALID (1<<17) + +struct ehci_fsl { +#ifdef CONFIG_PM + /* Saved USB PHY settings, need to restore after deep sleep. */ + u32 usb_ctrl; +#endif + struct usb_hcd *hcd; +#if defined(CONFIG_FSL_USB2_OTG) || defined(CONFIG_FSL_USB2_OTG_MODULE) + struct work_struct change_hcd_work; +#endif + /* + * 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 */ -- 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/