lkml.org 
[lkml]   [2006]   [Apr]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
SubjectRe: [linux-usb-devel] compile error when building multiple EHCI host controllers as modules
Date
On Friday 24 March 2006 12:32 pm, Kumar Gala wrote:
> > The issue I have this is that it makes two (or more) things that were
> > independent now dependent. What about just moving the module_init/
> > exit() functions into files that are built separately. For the ehci-
> > fsl case it was trivial, need to look at ehci-pci case.
>
> Ok, my idea required exporting things I didn't really want to export, so
> what about something like this or where you thinking of some more
> sophisticated?
>
> If this is good, I'll do the same for ohci.

How about this one instead? It requires fewer per-SOC hacks in generic
code when adding a new SOC. And it also removes a platform device naming
goof for your mpc83xx support ... that's a case where you should just let
the platform device IDs distinguish things.

- Dave

Let EHCI build and link supporing both PCI and platform bus glue.

- there's now a single pair of module init/exit routines, which
do little beyond registering/unregistering one or two drivers:
* a single platform driver
* a single pci driver

- for coldplug, the non-PCI drivers also define a MODULE_ALIAS;
boot scripts can just "modprobe $(cat .../modalias)"

- renamed mpc83xx platform devices to follow normal Linux rules

au1xxx will have a compile problem, it still needs to convert to
using platform_driver.

Index: g26/drivers/usb/host/ehci-au1xxx.c
===================================================================
--- g26.orig/drivers/usb/host/ehci-au1xxx.c 2006-03-31 22:36:07.000000000 -0800
+++ g26/drivers/usb/host/ehci-au1xxx.c 2006-04-03 19:40:44.000000000 -0700
@@ -272,6 +272,8 @@ static int ehci_hcd_au1xxx_drv_resume(st
return 0;
}
*/
+MODULE_ALIAS("au1xxx-ehci");
+/* FIXME use "struct platform_driver" */
static struct device_driver ehci_hcd_au1xxx_driver = {
.name = "au1xxx-ehci",
.bus = &platform_bus_type,
@@ -280,18 +282,3 @@ static struct device_driver ehci_hcd_au1
/*.suspend = ehci_hcd_au1xxx_drv_suspend, */
/*.resume = ehci_hcd_au1xxx_drv_resume, */
};
-
-static int __init ehci_hcd_au1xxx_init(void)
-{
- pr_debug(DRIVER_INFO " (Au1xxx)\n");
-
- return driver_register(&ehci_hcd_au1xxx_driver);
-}
-
-static void __exit ehci_hcd_au1xxx_cleanup(void)
-{
- driver_unregister(&ehci_hcd_au1xxx_driver);
-}
-
-module_init(ehci_hcd_au1xxx_init);
-module_exit(ehci_hcd_au1xxx_cleanup);
Index: g26/drivers/usb/host/ehci-fsl.c
===================================================================
--- g26.orig/drivers/usb/host/ehci-fsl.c 2006-03-31 22:36:07.000000000 -0800
+++ g26/drivers/usb/host/ehci-fsl.c 2006-04-03 19:38:26.000000000 -0700
@@ -324,43 +324,12 @@ static int ehci_fsl_drv_remove(struct pl
return 0;
}

-static struct platform_driver ehci_fsl_dr_driver = {
- .probe = ehci_fsl_drv_probe,
- .remove = ehci_fsl_drv_remove,
- .driver = {
- .name = "fsl-usb2-dr",
- },
-};
+MODULE_ALIAS("fsl-ehci");

-static struct platform_driver ehci_fsl_mph_driver = {
+static struct platform_driver ehci_fsl_driver = {
.probe = ehci_fsl_drv_probe,
.remove = ehci_fsl_drv_remove,
.driver = {
- .name = "fsl-usb2-mph",
+ .name = "fsl-ehci",
},
};
-
-static int __init ehci_fsl_init(void)
-{
- int retval;
-
- pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n",
- hcd_name,
- sizeof(struct ehci_qh), sizeof(struct ehci_qtd),
- sizeof(struct ehci_itd), sizeof(struct ehci_sitd));
-
- retval = platform_driver_register(&ehci_fsl_dr_driver);
- if (retval)
- return retval;
-
- return platform_driver_register(&ehci_fsl_mph_driver);
-}
-
-static void __exit ehci_fsl_cleanup(void)
-{
- platform_driver_unregister(&ehci_fsl_mph_driver);
- platform_driver_unregister(&ehci_fsl_dr_driver);
-}
-
-module_init(ehci_fsl_init);
-module_exit(ehci_fsl_cleanup);
Index: g26/drivers/usb/host/ehci-hcd.c
===================================================================
--- g26.orig/drivers/usb/host/ehci-hcd.c 2006-03-31 22:36:07.000000000 -0800
+++ g26/drivers/usb/host/ehci-hcd.c 2006-04-03 19:46:07.000000000 -0700
@@ -889,19 +889,59 @@ MODULE_LICENSE ("GPL");

#ifdef CONFIG_PCI
#include "ehci-pci.c"
-#define EHCI_BUS_GLUED
+#define PCI_DRIVER ehci_pci_driver
#endif

#ifdef CONFIG_PPC_83xx
#include "ehci-fsl.c"
-#define EHCI_BUS_GLUED
+#define PLATFORM_DRIVER ehci_fsl_dr_driver
#endif

#ifdef CONFIG_SOC_AU1X00
#include "ehci-au1xxx.c"
-#define EHCI_BUS_GLUED
+#define PLATFORM_DRIVER ehci_hcd_au1xxx_driver
#endif

-#ifndef EHCI_BUS_GLUED
+#if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER)
#error "missing bus glue for ehci-hcd"
#endif
+
+static int __init ehci_hcd_init(void)
+{
+ int retval = 0;
+
+ pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n",
+ hcd_name,
+ sizeof(struct ehci_qh), sizeof(struct ehci_qtd),
+ sizeof(struct ehci_itd), sizeof(struct ehci_sitd));
+
+#ifdef PLATFORM_DRIVER
+ retval = platform_driver_register(&PLATFORM_DRIVER);
+ if (retval < 0)
+ return retval;
+#endif
+
+#ifdef PCI_DRIVER
+ retval = pci_register_driver(&PCI_DRIVER);
+ if (retval < 0) {
+#ifdef PLATFORM_DRIVER
+ platform_driver_unregister(&PLATFORM_DRIVER);
+#endif
+ }
+#endif
+
+ return retval;
+}
+module_init(ehci_hcd_init);
+
+static void __exit ehci_hcd_cleanup(void)
+{
+#ifdef PLATFORM_DRIVER
+ driver_unregister(&PLATFORM_DRIVER);
+#endif
+#ifdef PCI_DRIVER
+ pci_unregister_driver(&PCI_DRIVER);
+#endif
+}
+module_exit(ehci_hcd_cleanup);
+
Index: g26/drivers/usb/host/ehci-pci.c
===================================================================
--- g26.orig/drivers/usb/host/ehci-pci.c 2006-03-31 22:36:07.000000000 -0800
+++ g26/drivers/usb/host/ehci-pci.c 2006-04-03 19:15:33.000000000 -0700
@@ -370,23 +370,3 @@ static struct pci_driver ehci_pci_driver
.resume = usb_hcd_pci_resume,
#endif
};
-
-static int __init ehci_hcd_pci_init(void)
-{
- if (usb_disabled())
- return -ENODEV;
-
- pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n",
- hcd_name,
- sizeof(struct ehci_qh), sizeof(struct ehci_qtd),
- sizeof(struct ehci_itd), sizeof(struct ehci_sitd));
-
- return pci_register_driver(&ehci_pci_driver);
-}
-module_init(ehci_hcd_pci_init);
-
-static void __exit ehci_hcd_pci_cleanup(void)
-{
- pci_unregister_driver(&ehci_pci_driver);
-}
-module_exit(ehci_hcd_pci_cleanup);
Index: g26/arch/ppc/syslib/mpc83xx_devices.c
===================================================================
--- g26.orig/arch/ppc/syslib/mpc83xx_devices.c 2006-03-31 22:35:39.000000000 -0800
+++ g26/arch/ppc/syslib/mpc83xx_devices.c 2006-04-03 19:39:10.000000000 -0700
@@ -186,7 +186,7 @@ struct platform_device ppc_sys_platform_
},
},
[MPC83xx_USB2_DR] = {
- .name = "fsl-usb2-dr",
+ .name = "fsl-ehci",
.id = 1,
.num_resources = 2,
.resource = (struct resource[]) {
@@ -203,8 +203,8 @@ struct platform_device ppc_sys_platform_
},
},
[MPC83xx_USB2_MPH] = {
- .name = "fsl-usb2-mph",
- .id = 1,
+ .name = "fsl-ehci",
+ .id = 2,
.num_resources = 2,
.resource = (struct resource[]) {
{
\
 
 \ /
  Last update: 2006-04-04 04:51    [W:0.083 / U:0.316 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site