[RFC][PATCH 6/7] USB: OHCI: make ohci-at91 a separate driver
Alan Stern
stern at rowland.harvard.edu
Fri Jun 7 14:52:34 EDT 2013
On Fri, 7 Jun 2013, Manjunath Goudar wrote:
> Separate the TI OHCI Atmel host controller driver from ohci-hcd
> host code so that it can be built as a separate driver module.
> This work is part of enabling multi-platform kernels on ARM.
> --- a/drivers/usb/host/Kconfig
> +++ b/drivers/usb/host/Kconfig
> @@ -411,6 +411,14 @@ config USB_OHCI_HCD_SPEAR
> Enables support for the on-chip OHCI controller on
> ST SPEAr chips.
>
> +config USB_OHCI_HCD_AT91
> + tristate "Support for Atmel on-chip OHCI USB controller"
> + depends on USB_OHCI_HCD && ARCH_AT91
> + default y
> + ---help---
> + Enables support for the on-chip OHCI controller on
> + Atmel chips.
Notice the "depends on" line you added here?
> diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
> index a0cb44f..b4a88a6 100644
> --- a/drivers/usb/host/ohci-at91.c
> +++ b/drivers/usb/host/ohci-at91.c
> @@ -13,16 +13,25 @@
...
> #ifndef CONFIG_ARCH_AT91
> #error "CONFIG_ARCH_AT91 must be defined."
> #endif
As a result of the "depends on" line, this test will never succeed.
You can remove these three lines.
> @@ -111,6 +126,8 @@ static void usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *);
> static int usb_hcd_at91_probe(const struct hc_driver *driver,
> struct platform_device *pdev)
> {
> + struct at91_usbh_data *board;
Tab character where it should be a space.
> + struct ohci_hcd *ohci;
> int retval;
> struct usb_hcd *hcd = NULL;
>
> @@ -163,8 +180,11 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
> goto err5;
> }
>
> + board = hcd->self.controller->platform_data;
> + ohci = hcd_to_ohci(hcd);
> + ohci->num_ports = board->ports;
> at91_start_hc(pdev);
> - ohci_hcd_init(hcd_to_ohci(hcd));
> + ohci_setup(hcd);
Don't call ohci_setup().
> @@ -727,3 +672,37 @@ static struct platform_driver ohci_hcd_at91_driver = {
> .of_match_table = of_match_ptr(at91_ohci_dt_ids),
> },
> };
> +
> +static int __init ohci_at91_init(void)
> +{
> + if (usb_disabled())
> + return -ENODEV;
> +
> + pr_info("%s: " DRIVER_DESC "\n", hcd_name);
> + ohci_init_driver(&ohci_at91_hc_driver, NULL);
> +
> + /*
> + * The Atmel HW has some unusual quirks, which require Atmel-specific
> + * workarounds. We override certain hc_driver functions here to
> + * achieve that. We explicitly do not enhance ohci_driver_overrides to
> + * allow this more easily, since this is an unusual case, and we don't
> + * want to encourage others to override these functions by making it
> + * too easy.
> + */
> +
> + ohci_at91_hc_driver.hub_status_data = ohci_at91_hub_status_data;
> + ohci_at91_hc_driver.hub_control = ohci_at91_hub_control;
Since the hub_status_data and hub_control routines aren't going to be
exported, you can't do it like this. Instead, save the values of
ohci_at91_hc_driver.hub_status_data and ohci_at91_hc_driver.hub_control
before overwriting them.
Alan Stern
More information about the linux-arm-kernel
mailing list