Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933339AbbENNXl (ORCPT ); Thu, 14 May 2015 09:23:41 -0400 Received: from mail-bn1bon0115.outbound.protection.outlook.com ([157.56.111.115]:8864 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932912AbbENNXj (ORCPT ); Thu, 14 May 2015 09:23:39 -0400 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; From: Ramneek Mehresh To: CC: , , , Ramneek Mehresh Subject: [PATCH][v2]drivers:usb:fsl:Make fsl ehci drv an independent driver module Date: Thu, 14 May 2015 19:04:46 +0530 Message-ID: <1431610486-31818-1-git-send-email-ramneek.mehresh@freescale.com> X-Mailer: git-send-email 1.8.3.1 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD009;1:Ql1y/sA87uMEnpYgpWdDrVcnTnrJFxBSsCCrIH322d5xRO865YYY3cpsF+Byj3kfT7oK2KHSC1c6YyAPawrzXJeNCQdKiIBO/U/RvoACUuqkLoosFymGgXfKy9eqVNg815lP5QYRi2bihDRJUm/5pPnsOM90VgtX7U/5Jn+y/mXKzRDZuGqvAfoh2r51M7Z+grTzo8NwT6/8dnyaYi1R58VF23FCJU1KcBBgJNHOi73Irj5gi4afRzjTnSBoQbMiz4hx5tP6XRKFi0fUd6FEPljDF3Rm07fHH+IAKOS5IC1K9poUYv7atRZeqvUyrc0pTua81MzLX2apWhlxMYZZow== X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(339900001)(199003)(189002)(189998001)(104016003)(107886002)(110136002)(19580395003)(5001960100002)(19580405001)(48376002)(50466002)(33646002)(77096005)(105606002)(50226001)(76506005)(6806004)(87936001)(106466001)(36756003)(85426001)(46102003)(50986999)(92566002)(62966003)(77156002)(86362001)(47776003)(229853001)(2351001)(2004002)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:SN1PR0301MB1581;H:az84smr01.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;SN1PR0301MB1581;2:0ak9Y+lzVA4GLSGvzIq5wmZr2exapikXGzJE5NvAgZ0dVkUp6UJ9nUHORJZmjcUu;2:MdGhQeQdjC0ndaSq4oZd/yHzQNlHHNFP3jSROl7YeV6rU/93OvqIhICVjIgA80loHGIJpu6PP3aesW5vJIX0rG4XGbadU5rOt0DJ4wHSEoDYCsHdSD4tflH3O79lz1oPx9nOFO5ClxCmn/lsm1L9Dst3hmhTI7oRsS7ie/4e7iu+a7/m5c3C40ac/avQc3PioB7Ryn6Ssq/uA4XjSVgFfH3xetDvMBRRWHTs7Lm232k=;6:vGsWxm2Z2vDP2f0He0xjKS8ud8oBKhlRb8MKTRV0IwEAFhMbLet6am5RVlgcUKkRCWfXEeX5OQwrYExQ9vjWuxnuBnlNZRs6q/UG4EVhBLmUMezjM5Ldz4gYV8N1Yb5E06Jqjk/QbDpPlxmVVatuWLAHcM4MPOuB8VtPz+qN7oHuoIDk5y31/F2jSUJ6BJ0nLavNW3MhB1Y0v3nxYVgTRCyN4xMHMda2zZZbAS/i+qp12uVH0MracqJycMdgSpXCYsv0DT+AUBbqwihieCqr4CUUBzRMFkrrGY/xPPuBMQlQ1vruyUBxXawhapIu3RcyAViILqKmn06dREXcBcLFgQ==;3:rKCeOwvfglfxDC3eJBjf+OnKX0lTP9p9Z/nwGCluAoz5reGE+UM9Q4oHzhe9VR9HIboKG7gTdifIM4KdMcquPFg+XKgqEbNnqdHJX7yZ1aX2/c1BrUTudGvfabalv5CoOnyHu8tlQFPv4amIwJxeHC44MhswuSpTX8i1CqD5NLPMoMToYPjQqvr5+XX3pp565Us+nwUGik2Cek8cUQ6jxv9UDZoufKixOdVN8wVKHahHE2EPlxDrDVXoc4xzOVSychTAeT1y1bG1MuNnkm7BEKLs8tnw0nq5r/RSHJtyRik= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1581; 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:SN1PR0301MB1581;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1581; X-Forefront-PRVS: 0576145E86 X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1581;9:SALwe7FJxK6FIgNo7WtkcTd5iT1jmCawbGNdnr10UeprW9+nMmb0f5B/EhkZnlavTETbRzWiyiugFpFJ5FtVXXpxFfqFWuiWoyXACxc++yU0bHNnJR5YJUAbbbB8XoHHlUiGTgJ7jEPD8BNSkcZoNiTp2Gk+lcdOic31BnnwdFT6IQNa+l1oofw2+6FzqDegmEN+58SIp8RGele/rFUEwdXu1IwFLRvHuFMHTsFqeODXP5zdW3VwzeTrocRRnrJwZjXninrUbR6KnzAxMg4RWHpJ6tItnjhASvPZQo3JQESQalL8A7BGQpoU22nVNdQwhnYVnUetTdPBnwZbyk6AesTYBKeJB1DbocHBxpHJHG4wmuKqJtJM0MdH+/iFjtWUEZP8eRy4tq9ngKTBNpF6JS3ZQorkEptoAVl57N0ishRSKcM81ErPRRXUoIf43q2//FzIvFgkWkAN8fg+/O6zd1AWx6Eiv4jvzW0lKpFkU2D1NCY+601tqlbrdVTexPGIAExdCbcDuiytEBXN9TPZNEBSVlmeIa5M+ooDYGAewPHkWBFK/VQR/HBmnVVPP8mvHxsGSHHQ9JULzp3Nbg43YKMH66EttNC48qk+IK1rvNe9GMVELj8+GKL2W/W9/Y+u+d/OLs0AScc6IF9BHRwtAd6fX1+oXSBcMbklfJIMxBk/fMNQXOyiYMd9JeVPtamNxrcF1pm/bG/m8w+czcUA7wlKLxGG+iowTMq06iuAapSH23oA6z+owklJoMz2B63i8uXvGgwymVbETG1WgPXb/Gu1S4lWoEH2QYFhSlqLHcuUQOMo9Ok7OvkeLZa6Dtc+RHpsMmILieoncI8y0jY0sJmSZWdBgAcc980K8Ue1vNBphiU7eWA2cz6ShmwDJWDahPSd9BH1xsf74mUVHZA7dQ== X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1581;3:y2Hh8WFJDdzMQYmFTAQuUEmh0utgMepfNC/EQWdyFKTC7vOnAhVxGRWfreaC2nuXSbcHkzvvaaMgA4FrLHc3DeMMjzsZTPw68F8iEZZE2+liHNGH2m2AeYaFwtZJbzOhko/jNhg5sDh3HorRWMvExw==;10:CzsH9ddCGjv0TxUl/9OQZ19yw7ZlR45Io7Zdw8RdwL5j/jbZnjMUDaWrXZhv8xAOnuxJEaBquL2kU5MJI1uyJylb4HHbiGIve5z0LjMfVEQ=;6:amKP6gjY0D1/95IQJC9lcuufLJR25z3wRLPw37eK2QnP9WcFo2E096zkh2cmm3wB X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 May 2015 13:23:35.6494 (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: SN1PR0301MB1581 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9198 Lines: 310 Make Freescale EHCI driver an independent entity from ehci-hcd.c. This involves - using module_init/module_exit functions - using overrides structure - some necessary code cleanup Signed-off-by: Ramneek Mehresh --- Changes for v2: - merged previous two separate patches into one - modified DRIVER_DESC to be more descriptive - remove "driver" parameter explanation from fsl_ehci_drv_probe() - updated year in copyright drivers/usb/host/Kconfig | 2 +- drivers/usb/host/Makefile | 1 + drivers/usb/host/ehci-fsl.c | 168 +++++++++++++++++++------------------------- drivers/usb/host/ehci-hcd.c | 5 -- 4 files changed, 74 insertions(+), 102 deletions(-) diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 197a6a3..547cee8 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -137,7 +137,7 @@ config XPS_USB_HCD_XILINX devices only. config USB_EHCI_FSL - bool "Support for Freescale PPC on-chip EHCI USB controller" + tristate "Support for Freescale PPC on-chip EHCI USB controller" depends on FSL_SOC select USB_EHCI_ROOT_HUB_TT select USB_FSL_MPH_DR_OF if OF diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index 972a74a..754efaa 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -72,6 +72,7 @@ obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o obj-$(CONFIG_USB_HWA_HCD) += hwa-hc.o obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o +obj-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o obj-$(CONFIG_USB_FUSBH200_HCD) += fusbh200-hcd.o diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index ab4eee3..5352e74 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -1,6 +1,6 @@ /* * Copyright 2005-2009 MontaVista Software, Inc. - * Copyright 2008,2012 Freescale Semiconductor, Inc. + * Copyright 2008,2012,2015 Freescale Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -24,29 +24,38 @@ */ #include +#include #include #include #include #include +#include +#include +#include +#include #include #include +#include "ehci.h" #include "ehci-fsl.h" +#define DRIVER_DESC "Freescale EHCI Host controller driver" +#define DRV_NAME "ehci-fsl" + +static struct hc_driver __read_mostly fsl_ehci_hc_driver; + /* configure so an HC device and id are always provided */ /* always called with process context; sleeping is OK */ -/** - * usb_hcd_fsl_probe - initialize FSL-based HCDs - * @drvier: Driver to be used for this HCD +/* + * fsl_ehci_drv_probe - initialize FSL-based HCDs * @pdev: USB Host Controller being probed * Context: !in_interrupt() * * Allocates basic resources for this USB host controller. * */ -static int usb_hcd_fsl_probe(const struct hc_driver *driver, - struct platform_device *pdev) +static int fsl_ehci_drv_probe(struct platform_device *pdev) { struct fsl_usb2_platform_data *pdata; struct usb_hcd *hcd; @@ -86,7 +95,8 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, } irq = res->start; - hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); + hcd = usb_create_hcd(&fsl_ehci_hc_driver, &pdev->dev, + dev_name(&pdev->dev)); if (!hcd) { retval = -ENOMEM; goto err1; @@ -159,38 +169,6 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, return retval; } -/* may be called without controller electrically present */ -/* may be called with controller, bus, and devices active */ - -/** - * usb_hcd_fsl_remove - shutdown processing for FSL-based HCDs - * @dev: USB Host Controller being removed - * Context: !in_interrupt() - * - * Reverses the effect of usb_hcd_fsl_probe(). - * - */ -static void usb_hcd_fsl_remove(struct usb_hcd *hcd, - struct platform_device *pdev) -{ - struct fsl_usb2_platform_data *pdata = dev_get_platdata(&pdev->dev); - - if (!IS_ERR_OR_NULL(hcd->usb_phy)) { - otg_set_host(hcd->usb_phy->otg, NULL); - usb_put_phy(hcd->usb_phy); - } - - usb_remove_hcd(hcd); - - /* - * do platform specific un-initialization: - * release iomux pins, disable clock, etc. - */ - if (pdata->exit) - pdata->exit(pdev); - usb_put_hcd(hcd); -} - static int ehci_fsl_setup_phy(struct usb_hcd *hcd, enum fsl_usb2_phy_modes phy_mode, unsigned int port_offset) @@ -636,79 +614,77 @@ static int ehci_start_port_reset(struct usb_hcd *hcd, unsigned port) #define ehci_start_port_reset NULL #endif /* CONFIG_USB_OTG */ +static struct ehci_driver_overrides ehci_fsl_overrides __initdata = { + .extra_priv_size = sizeof(struct ehci_fsl), + .reset = ehci_fsl_setup, +}; -static const struct hc_driver ehci_fsl_hc_driver = { - .description = hcd_name, - .product_desc = "Freescale On-Chip EHCI Host Controller", - .hcd_priv_size = sizeof(struct ehci_fsl), +/** + * fsl_ehci_drv_remove - shutdown processing for FSL-based HCDs + * @dev: USB Host Controller being removed + * Context: !in_interrupt() + * + * Reverses the effect of usb_hcd_fsl_probe(). + * + */ - /* - * generic hardware linkage - */ - .irq = ehci_irq, - .flags = HCD_USB2 | HCD_MEMORY | HCD_BH, +static int fsl_ehci_drv_remove(struct platform_device *pdev) +{ + struct fsl_usb2_platform_data *pdata = dev_get_platdata(&pdev->dev); + struct usb_hcd *hcd = platform_get_drvdata(pdev); - /* - * basic lifecycle operations - */ - .reset = ehci_fsl_setup, - .start = ehci_run, - .stop = ehci_stop, - .shutdown = ehci_shutdown, + if (!IS_ERR_OR_NULL(hcd->usb_phy)) { + otg_set_host(hcd->usb_phy->otg, NULL); + usb_put_phy(hcd->usb_phy); + } - /* - * managing i/o requests and associated device resources - */ - .urb_enqueue = ehci_urb_enqueue, - .urb_dequeue = ehci_urb_dequeue, - .endpoint_disable = ehci_endpoint_disable, - .endpoint_reset = ehci_endpoint_reset, + usb_remove_hcd(hcd); /* - * scheduling support + * do platform specific un-initialization: + * release iomux pins, disable clock, etc. */ - .get_frame_number = ehci_get_frame, + if (pdata->exit) + pdata->exit(pdev); + usb_put_hcd(hcd); - /* - * root hub support - */ - .hub_status_data = ehci_hub_status_data, - .hub_control = ehci_hub_control, - .bus_suspend = ehci_bus_suspend, - .bus_resume = ehci_bus_resume, - .start_port_reset = ehci_start_port_reset, - .relinquish_port = ehci_relinquish_port, - .port_handed_over = ehci_port_handed_over, - - .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, + return 0; +} + +static struct platform_driver ehci_fsl_driver = { + .probe = fsl_ehci_drv_probe, + .remove = fsl_ehci_drv_remove, + .shutdown = usb_hcd_platform_shutdown, + .driver = { + .name = "fsl-ehci", + .pm = EHCI_FSL_PM_OPS, + }, }; -static int ehci_fsl_drv_probe(struct platform_device *pdev) +static int __init ehci_fsl_init(void) { if (usb_disabled()) return -ENODEV; - /* FIXME we only want one one probe() not two */ - return usb_hcd_fsl_probe(&ehci_fsl_hc_driver, pdev); -} + pr_info(DRV_NAME ": " DRIVER_DESC "\n"); -static int ehci_fsl_drv_remove(struct platform_device *pdev) -{ - struct usb_hcd *hcd = platform_get_drvdata(pdev); + ehci_init_driver(&fsl_ehci_hc_driver, &ehci_fsl_overrides); - /* FIXME we only want one one remove() not two */ - usb_hcd_fsl_remove(hcd, pdev); - return 0; + fsl_ehci_hc_driver.product_desc = + "Freescale On-Chip EHCI Host Controller"; + fsl_ehci_hc_driver.start_port_reset = ehci_start_port_reset; + + + return platform_driver_register(&ehci_fsl_driver); } +module_init(ehci_fsl_init); -MODULE_ALIAS("platform:fsl-ehci"); +static void __exit ehci_fsl_cleanup(void) +{ + platform_driver_unregister(&ehci_fsl_driver); +} +module_exit(ehci_fsl_cleanup); -static struct platform_driver ehci_fsl_driver = { - .probe = ehci_fsl_drv_probe, - .remove = ehci_fsl_drv_remove, - .shutdown = usb_hcd_platform_shutdown, - .driver = { - .name = "fsl-ehci", - .pm = EHCI_FSL_PM_OPS, - }, -}; +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRV_NAME); diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index f4d88df..9dd161c 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1250,11 +1250,6 @@ MODULE_DESCRIPTION(DRIVER_DESC); MODULE_AUTHOR (DRIVER_AUTHOR); MODULE_LICENSE ("GPL"); -#ifdef CONFIG_USB_EHCI_FSL -#include "ehci-fsl.c" -#define PLATFORM_DRIVER ehci_fsl_driver -#endif - #ifdef CONFIG_USB_EHCI_SH #include "ehci-sh.c" #define PLATFORM_DRIVER ehci_hcd_sh_driver -- 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/