提交 a76dd463 编写于 作者: M Manjunath Goudar 提交者: Greg Kroah-Hartman

USB: EHCI: make ehci-orion a separate driver

Separate the Orion host controller driver from ehci-hcd host
code into its own driver module because of following reason.

With the multiplatform changes in arm-soc tree, it becomes
possible to enable the mvebu platform (which uses
ehci-orion) at the same time as other platforms that require
a conflicting EHCI bus glue. At the moment, this results
in a warning like

drivers/usb/host/ehci-hcd.c:1297:0: warning: "PLATFORM_DRIVER" redefined [enabled by default]
drivers/usb/host/ehci-hcd.c:1277:0: note: this is the location of the previous definition
drivers/usb/host/ehci-orion.c:334:31: warning: 'ehci_orion_driver' defined but not used [-Wunused-variable]

and an ehci driver that only works on one of them.

With the infrastructure added by Alan Stern in patch 3e023203
"USB: EHCI: prepare to make ehci-hcd a library module", we can
avoid this problem by turning a bus glue into a separate
module, as we do here for the orion bus glue.

An earlier version of this patch was included in 3.9 but caused
a regression there, which has subsequently been fixed.

While we are here, use the opportunity to disabiguate the two
Marvell EHCI controller implementations in Kconfig.

In V4 (arnd):
- Improve Kconfig text

In V3:
- More detail provided in commit message regarding this patch.
- Replaced hcd_name string "ehci-orion" into "orion-ehci".
- MODULE_LICENSE is GPL v2.
- In ehci_init_driver calling second argument passed  as NULL instead of
  ehci_orion_overrides because ehci_orion_overrides is removed.

In V2:
- Tegra patch related changes removed from this patch.
Signed-off-by: NManjunath Goudar <manjunath.goudar@linaro.org>
Signed-off-by: NArnd Bergmann <arnd@arndb.de>
Acked-by: NJason Cooper <jason@lakedaemon.net>
Tested-by: NAndrew Lunn <andrew@lunn.ch>
Acked-by: NAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 58f8b6c4
...@@ -163,6 +163,17 @@ config USB_EHCI_HCD_OMAP ...@@ -163,6 +163,17 @@ config USB_EHCI_HCD_OMAP
Enables support for the on-chip EHCI controller on Enables support for the on-chip EHCI controller on
OMAP3 and later chips. OMAP3 and later chips.
config USB_EHCI_HCD_ORION
tristate "Support for Marvell EBU on-chip EHCI USB controller"
depends on USB_EHCI_HCD && PLAT_ORION
default y
---help---
Enables support for the on-chip EHCI controller on Marvell's
embedded ARM SoCs, including Orion, Kirkwood, Dove, Armada XP,
Armada 370. This is different from the EHCI implementation
on Marvell's mobile PXA and MMP SoC, see "EHCI support for
Marvell PXA/MMP USB controller" for those.
config USB_EHCI_MSM config USB_EHCI_MSM
bool "Support for MSM on-chip EHCI USB controller" bool "Support for MSM on-chip EHCI USB controller"
depends on USB_EHCI_HCD && ARCH_MSM depends on USB_EHCI_HCD && ARCH_MSM
...@@ -207,13 +218,17 @@ config USB_EHCI_S5P ...@@ -207,13 +218,17 @@ config USB_EHCI_S5P
Enable support for the S5P SOC's on-chip EHCI controller. Enable support for the S5P SOC's on-chip EHCI controller.
config USB_EHCI_MV config USB_EHCI_MV
bool "EHCI support for Marvell on-chip controller" bool "EHCI support for Marvell PXA/MMP USB controller"
depends on USB_EHCI_HCD && (ARCH_PXA || ARCH_MMP) depends on USB_EHCI_HCD && (ARCH_PXA || ARCH_MMP)
select USB_EHCI_ROOT_HUB_TT select USB_EHCI_ROOT_HUB_TT
---help--- ---help---
Enables support for Marvell (including PXA and MMP series) on-chip Enables support for Marvell (including PXA and MMP series) on-chip
USB SPH and OTG controller. SPH is a single port host, and it can USB SPH and OTG controller. SPH is a single port host, and it can
only be EHCI host. OTG is controller that can switch to host mode. only be EHCI host. OTG is controller that can switch to host mode.
Note that this driver will not work on Marvell's other EHCI
controller used by the EBU-type SoCs including Orion, Kirkwood,
Dova, Armada 370 and Armada XP. See "Support for Marvell EBU
on-chip EHCI USB controller" for those.
config USB_W90X900_EHCI config USB_W90X900_EHCI
bool "W90X900(W90P910) EHCI support" bool "W90X900(W90P910) EHCI support"
......
...@@ -28,6 +28,7 @@ obj-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o ...@@ -28,6 +28,7 @@ obj-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o
obj-$(CONFIG_USB_EHCI_HCD_PLATFORM) += ehci-platform.o obj-$(CONFIG_USB_EHCI_HCD_PLATFORM) += ehci-platform.o
obj-$(CONFIG_USB_EHCI_MXC) += ehci-mxc.o obj-$(CONFIG_USB_EHCI_MXC) += ehci-mxc.o
obj-$(CONFIG_USB_EHCI_HCD_OMAP) += ehci-omap.o obj-$(CONFIG_USB_EHCI_HCD_OMAP) += ehci-omap.o
obj-$(CONFIG_USB_EHCI_HCD_ORION) += ehci-orion.o
obj-$(CONFIG_USB_OXU210HP_HCD) += oxu210hp-hcd.o obj-$(CONFIG_USB_OXU210HP_HCD) += oxu210hp-hcd.o
obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o
......
...@@ -1249,11 +1249,6 @@ MODULE_LICENSE ("GPL"); ...@@ -1249,11 +1249,6 @@ MODULE_LICENSE ("GPL");
#define XILINX_OF_PLATFORM_DRIVER ehci_hcd_xilinx_of_driver #define XILINX_OF_PLATFORM_DRIVER ehci_hcd_xilinx_of_driver
#endif #endif
#ifdef CONFIG_PLAT_ORION
#include "ehci-orion.c"
#define PLATFORM_DRIVER ehci_orion_driver
#endif
#ifdef CONFIG_USB_W90X900_EHCI #ifdef CONFIG_USB_W90X900_EHCI
#include "ehci-w90x900.c" #include "ehci-w90x900.c"
#define PLATFORM_DRIVER ehci_hcd_w90x900_driver #define PLATFORM_DRIVER ehci_hcd_w90x900_driver
...@@ -1319,6 +1314,7 @@ MODULE_LICENSE ("GPL"); ...@@ -1319,6 +1314,7 @@ MODULE_LICENSE ("GPL");
!IS_ENABLED(CONFIG_USB_CHIPIDEA_HOST) && \ !IS_ENABLED(CONFIG_USB_CHIPIDEA_HOST) && \
!IS_ENABLED(CONFIG_USB_EHCI_MXC) && \ !IS_ENABLED(CONFIG_USB_EHCI_MXC) && \
!IS_ENABLED(CONFIG_USB_EHCI_HCD_OMAP) && \ !IS_ENABLED(CONFIG_USB_EHCI_HCD_OMAP) && \
!IS_ENABLED(CONFIG_USB_EHCI_HCD_ORION) && \
!defined(PLATFORM_DRIVER) && \ !defined(PLATFORM_DRIVER) && \
!defined(PS3_SYSTEM_BUS_DRIVER) && \ !defined(PS3_SYSTEM_BUS_DRIVER) && \
!defined(OF_PLATFORM_DRIVER) && \ !defined(OF_PLATFORM_DRIVER) && \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of_irq.h> #include <linux/of_irq.h>
#include <linux/usb.h>
#include <linux/usb/hcd.h>
#include <linux/io.h>
#include <linux/dma-mapping.h>
#include "ehci.h"
#define rdl(off) __raw_readl(hcd->regs + (off)) #define rdl(off) __raw_readl(hcd->regs + (off))
#define wrl(off, val) __raw_writel((val), hcd->regs + (off)) #define wrl(off, val) __raw_writel((val), hcd->regs + (off))
...@@ -34,6 +40,12 @@ ...@@ -34,6 +40,12 @@
#define USB_PHY_IVREF_CTRL 0x440 #define USB_PHY_IVREF_CTRL 0x440
#define USB_PHY_TST_GRP_CTRL 0x450 #define USB_PHY_TST_GRP_CTRL 0x450
#define DRIVER_DESC "EHCI orion driver"
static const char hcd_name[] = "ehci-orion";
static struct hc_driver __read_mostly ehci_orion_hc_driver;
/* /*
* Implement Orion USB controller specification guidelines * Implement Orion USB controller specification guidelines
*/ */
...@@ -104,51 +116,6 @@ static void orion_usb_phy_v1_setup(struct usb_hcd *hcd) ...@@ -104,51 +116,6 @@ static void orion_usb_phy_v1_setup(struct usb_hcd *hcd)
wrl(USB_MODE, 0x13); wrl(USB_MODE, 0x13);
} }
static const struct hc_driver ehci_orion_hc_driver = {
.description = hcd_name,
.product_desc = "Marvell Orion EHCI",
.hcd_priv_size = sizeof(struct ehci_hcd),
/*
* generic hardware linkage
*/
.irq = ehci_irq,
.flags = HCD_MEMORY | HCD_USB2,
/*
* basic lifecycle operations
*/
.reset = ehci_setup,
.start = ehci_run,
.stop = ehci_stop,
.shutdown = ehci_shutdown,
/*
* 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,
/*
* scheduling support
*/
.get_frame_number = ehci_get_frame,
/*
* 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,
.relinquish_port = ehci_relinquish_port,
.port_handed_over = ehci_port_handed_over,
.clear_tt_buffer_complete = ehci_clear_tt_buffer_complete,
};
static void static void
ehci_orion_conf_mbus_windows(struct usb_hcd *hcd, ehci_orion_conf_mbus_windows(struct usb_hcd *hcd,
const struct mbus_dram_target_info *dram) const struct mbus_dram_target_info *dram)
...@@ -323,8 +290,6 @@ static int ehci_orion_drv_remove(struct platform_device *pdev) ...@@ -323,8 +290,6 @@ static int ehci_orion_drv_remove(struct platform_device *pdev)
return 0; return 0;
} }
MODULE_ALIAS("platform:orion-ehci");
static const struct of_device_id ehci_orion_dt_ids[] = { static const struct of_device_id ehci_orion_dt_ids[] = {
{ .compatible = "marvell,orion-ehci", }, { .compatible = "marvell,orion-ehci", },
{}, {},
...@@ -341,3 +306,26 @@ static struct platform_driver ehci_orion_driver = { ...@@ -341,3 +306,26 @@ static struct platform_driver ehci_orion_driver = {
.of_match_table = of_match_ptr(ehci_orion_dt_ids), .of_match_table = of_match_ptr(ehci_orion_dt_ids),
}, },
}; };
static int __init ehci_orion_init(void)
{
if (usb_disabled())
return -ENODEV;
pr_info("%s: " DRIVER_DESC "\n", hcd_name);
ehci_init_driver(&ehci_orion_hc_driver, NULL);
return platform_driver_register(&ehci_orion_driver);
}
module_init(ehci_orion_init);
static void __exit ehci_orion_cleanup(void)
{
platform_driver_unregister(&ehci_orion_driver);
}
module_exit(ehci_orion_cleanup);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_ALIAS("platform:orion-ehci");
MODULE_AUTHOR("Tzachi Perelstein");
MODULE_LICENSE("GPL v2");
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册