diff options
author | Andrew Bresticker <abrestic@chromium.org> | 2014-10-03 11:35:29 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-10-03 14:44:45 -0700 |
commit | 29e409f0f7613f9fd2235e41f0fa33e48e94544e (patch) | |
tree | 3cbc0c17d8e7bfb2c86466b4cdfaac75c4abd423 /drivers/usb | |
parent | 436e8c7d457ff4ca89beca20cf54f5884de6af61 (diff) |
xhci: Allow xHCI drivers to be built as separate modules
Instead of building all of the xHCI code into a single module, separate
it out into the core (xhci-hcd), PCI (xhci-pci, now selected by the new
config option CONFIG_USB_XHCI_PCI), and platform (xhci-plat) drivers.
Also update the PCI/platform drivers with module descriptions/licenses
and have them register their respective drivers in their initcalls.
Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/host/Kconfig | 5 | ||||
-rw-r--r-- | drivers/usb/host/Makefile | 12 | ||||
-rw-r--r-- | drivers/usb/host/xhci-pci.c | 9 | ||||
-rw-r--r-- | drivers/usb/host/xhci-plat.c | 9 | ||||
-rw-r--r-- | drivers/usb/host/xhci.c | 22 | ||||
-rw-r--r-- | drivers/usb/host/xhci.h | 19 |
6 files changed, 25 insertions, 51 deletions
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 002ba1d5bcf5..fa038a2e30b2 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -26,6 +26,11 @@ config USB_XHCI_HCD if USB_XHCI_HCD +config USB_XHCI_PCI + tristate + depends on PCI + default y + config USB_XHCI_PLATFORM tristate diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index 0336bb2c0e6f..8c6918907b15 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -15,22 +15,22 @@ fhci-$(CONFIG_FHCI_DEBUG) += fhci-dbg.o xhci-hcd-y := xhci.o xhci-mem.o xhci-hcd-y += xhci-ring.o xhci-hub.o xhci-dbg.o xhci-hcd-y += xhci-trace.o -xhci-hcd-$(CONFIG_PCI) += xhci-pci.o -ifneq ($(CONFIG_USB_XHCI_PLATFORM), ) - xhci-hcd-y += xhci-plat.o +xhci-plat-hcd-y := xhci-plat.o ifneq ($(CONFIG_USB_XHCI_MVEBU), ) - xhci-hcd-y += xhci-mvebu.o + xhci-plat-hcd-y += xhci-mvebu.o endif ifneq ($(CONFIG_USB_XHCI_RCAR), ) - xhci-hcd-y += xhci-rcar.o -endif + xhci-plat-hcd-y += xhci-rcar.o endif obj-$(CONFIG_USB_WHCI_HCD) += whci/ obj-$(CONFIG_PCI) += pci-quirks.o +obj-$(CONFIG_USB_XHCI_PCI) += xhci-pci.o +obj-$(CONFIG_USB_XHCI_PLATFORM) += xhci-plat-hcd.o + obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o obj-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o obj-$(CONFIG_USB_EHCI_HCD_PLATFORM) += ehci-platform.o diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index effa62aa4a2e..280dde93abe5 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -355,7 +355,7 @@ static struct pci_driver xhci_pci_driver = { #endif }; -int __init xhci_register_pci(void) +static int __init xhci_pci_init(void) { xhci_init_driver(&xhci_pci_hc_driver, xhci_pci_setup); #ifdef CONFIG_PM @@ -364,8 +364,13 @@ int __init xhci_register_pci(void) #endif return pci_register_driver(&xhci_pci_driver); } +module_init(xhci_pci_init); -void xhci_unregister_pci(void) +static void __exit xhci_pci_exit(void) { pci_unregister_driver(&xhci_pci_driver); } +module_exit(xhci_pci_exit); + +MODULE_DESCRIPTION("xHCI PCI Host Controller Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index f35236805a62..3d78b0cd674b 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -247,14 +247,19 @@ static struct platform_driver usb_xhci_driver = { }; MODULE_ALIAS("platform:xhci-hcd"); -int xhci_register_plat(void) +static int __init xhci_plat_init(void) { xhci_init_driver(&xhci_plat_hc_driver, xhci_plat_setup); xhci_plat_hc_driver.start = xhci_plat_start; return platform_driver_register(&usb_xhci_driver); } +module_init(xhci_plat_init); -void xhci_unregister_plat(void) +static void __exit xhci_plat_exit(void) { platform_driver_unregister(&usb_xhci_driver); } +module_exit(xhci_plat_exit); + +MODULE_DESCRIPTION("xHCI Platform Host Controller Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 3e0f5c7aed7a..2a5d45b4cb15 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -4982,18 +4982,6 @@ MODULE_LICENSE("GPL"); static int __init xhci_hcd_init(void) { - int retval; - - retval = xhci_register_pci(); - if (retval < 0) { - pr_debug("Problem registering PCI driver.\n"); - return retval; - } - retval = xhci_register_plat(); - if (retval < 0) { - pr_debug("Problem registering platform driver.\n"); - goto unreg_pci; - } /* * Check the compiler generated sizes of structures that must be laid * out in specific ways for hardware access. @@ -5012,15 +5000,5 @@ static int __init xhci_hcd_init(void) /* xhci_run_regs has eight fields and embeds 128 xhci_intr_regs */ BUILD_BUG_ON(sizeof(struct xhci_run_regs) != (8+8*128)*32/8); return 0; -unreg_pci: - xhci_unregister_pci(); - return retval; } module_init(xhci_hcd_init); - -static void __exit xhci_hcd_cleanup(void) -{ - xhci_unregister_pci(); - xhci_unregister_plat(); -} -module_exit(xhci_hcd_cleanup); diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index a099f382bee0..df76d642e719 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1731,25 +1731,6 @@ void xhci_urb_free_priv(struct xhci_hcd *xhci, struct urb_priv *urb_priv); void xhci_free_command(struct xhci_hcd *xhci, struct xhci_command *command); -#ifdef CONFIG_PCI -/* xHCI PCI glue */ -int xhci_register_pci(void); -void xhci_unregister_pci(void); -#else -static inline int xhci_register_pci(void) { return 0; } -static inline void xhci_unregister_pci(void) {} -#endif - -#if IS_ENABLED(CONFIG_USB_XHCI_PLATFORM) -int xhci_register_plat(void); -void xhci_unregister_plat(void); -#else -static inline int xhci_register_plat(void) -{ return 0; } -static inline void xhci_unregister_plat(void) -{ } -#endif - /* xHCI host controller glue */ typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); int xhci_handshake(struct xhci_hcd *xhci, void __iomem *ptr, |