usb: lowlevel interface change to support multiple controllers
authorLucas Stach <dev@lynxeye.de>
Tue, 25 Sep 2012 22:14:34 +0000 (00:14 +0200)
committerTom Rini <trini@ti.com>
Mon, 15 Oct 2012 18:54:00 +0000 (11:54 -0700)
Carry an index in the lowlevel usb functions to make specify the
respective usb controller.

Also pass through an controller struct from lowlevel_init to the
creation of the root usb device of this controller.

Signed-off-by: Lucas Stach <dev@lynxeye.de>
Reviewed-by: Marek Vasut <marex@denx.de>
17 files changed:
arch/arm/cpu/arm920t/s3c24x0/usb_ohci.c
arch/mips/cpu/mips32/au1x00/au1x00_usb_ohci.c
arch/powerpc/cpu/mpc5xxx/usb_ohci.c
arch/powerpc/cpu/ppc4xx/usb_ohci.c
arch/sparc/cpu/leon3/usb_uhci.c
arch/sparc/lib/bootm.c
board/mpl/common/usb_uhci.c
common/usb.c
common/usb_hub.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/isp116x-hcd.c
drivers/usb/host/ohci-hcd.c
drivers/usb/host/r8a66597-hcd.c
drivers/usb/host/sl811-hcd.c
drivers/usb/musb/musb_hcd.c
include/usb.h
include/usb/mv_udc.h

index cf0335c7320feac75f55b5d92364444fb75f4bb3..944bb32f579520c6a62d966d78d0fbe44ffc1197 100644 (file)
@@ -1659,7 +1659,7 @@ static void hc_release_ohci(struct ohci *ohci)
  */
 static char ohci_inited = 0;
 
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
        struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
        struct s3c24x0_gpio *gpio = s3c24x0_get_base_gpio();
@@ -1738,7 +1738,7 @@ int usb_lowlevel_init(void)
        return 0;
 }
 
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
 
index 7647e118414f111bc27719283336fccb617eb52c..c747767e1e2c9469fa226c14d5557dacc6c7644e 100644 (file)
@@ -1565,7 +1565,7 @@ static void hc_release_ohci (ohci_t *ohci)
  */
 static char ohci_inited = 0;
 
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
        u32 pin_func;
        u32 sys_freqctrl, sys_clksrc;
@@ -1707,7 +1707,7 @@ int usb_lowlevel_init(void)
        return -1;
 }
 
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        /* this gets called really early - before the controller has */
        /* even been initialized! */
index 6d915256a31f50118ddaf916550fdd362b09c7bb..607034b7c652d673446d39c2f30376edc5f475a0 100644 (file)
@@ -1561,7 +1561,7 @@ static void hc_release_ohci (ohci_t *ohci)
  */
 static char ohci_inited = 0;
 
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
 
        /* Set the USB Clock                                                 */
@@ -1629,7 +1629,7 @@ int usb_lowlevel_init(void)
        return 0;
 }
 
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        /* this gets called really early - before the controller has */
        /* even been initialized! */
index 14c6a280a6269e9912af04bb5275df7f310aac3d..4ce27262970624099119f267d602d8fca9d1afa6 100644 (file)
@@ -1566,7 +1566,7 @@ static void hc_release_ohci (ohci_t *ohci)
  */
 static char ohci_inited = 0;
 
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
        memset (&gohci, 0, sizeof (ohci_t));
        memset (&urb_priv, 0, sizeof (urb_priv_t));
@@ -1624,7 +1624,7 @@ int usb_lowlevel_init(void)
        return 0;
 }
 
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        /* this gets called really early - before the controller has */
        /* even been initialized! */
index 62cc25dc929cc461d3e98c8624aaa9767c40b6b3..b3b8a4d0bbef96f4e352d592f530638dcc8a6a9b 100644 (file)
@@ -706,7 +706,7 @@ void handle_usb_interrupt(void)
 
 /* init uhci
  */
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
        unsigned char temp;
        ambapp_ahbdev ahbdev;
@@ -745,7 +745,7 @@ int usb_lowlevel_init(void)
 
 /* stop uhci
  */
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        if (grusb_irq == -1)
                return 1;
index e5b933d1d6b0b8fa08b0b879bdd0e0eb6bdf8684..bcc63584bfe3fa5e48a28774846822c48577877e 100644 (file)
@@ -36,7 +36,7 @@ extern void srmmu_init_cpu(unsigned int entry);
 extern void prepare_bootargs(char *bootargs);
 
 #ifdef CONFIG_USB_UHCI
-extern int usb_lowlevel_stop(void);
+extern int usb_lowlevel_stop(int index);
 #endif
 
 /* sparc kernel argument (the ROM vector) */
index ddca58736986e26289fb726afc726db8d9f04502..254f263cabc338464877d8f0c1e84f887f3c53e0 100644 (file)
@@ -602,7 +602,7 @@ void handle_usb_interrupt(void)
 
 /* init uhci
  */
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
        unsigned char temp;
        int     busdevfunc;
@@ -632,7 +632,7 @@ int usb_lowlevel_init(void)
 
 /* stop uhci
  */
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        if(irqvec==-1)
                return 1;
index 1b40228b28836697b5cb4715dd269a21c995ac3e..e58b6f498f9a710f8681ceb9b89db6a8bf25315d 100644 (file)
@@ -76,6 +76,7 @@ static int running;
 static int asynch_allowed;
 
 char usb_started; /* flag for the started/stopped USB status */
+void *ctrl; /* goes away in a following commit, but don't break bisect */
 
 /**********************************************************************
  * some forward declerations...
@@ -96,7 +97,7 @@ int usb_init(void)
        usb_hub_reset();
        /* init low_level USB */
        printf("USB:   ");
-       result = usb_lowlevel_init();
+       result = usb_lowlevel_init(0, &ctrl);
        /* if lowlevel init is OK, scan the bus for devices
         * i.e. search HUBs and configure them */
        if (result == 0) {
@@ -123,7 +124,7 @@ int usb_stop(void)
                asynch_allowed = 1;
                usb_started = 0;
                usb_hub_reset();
-               res = usb_lowlevel_stop();
+               res = usb_lowlevel_stop(0);
        }
        return res;
 }
@@ -754,7 +755,7 @@ struct usb_device *usb_get_dev_index(int index)
 /* returns a pointer of a new device structure or NULL, if
  * no device struct is available
  */
-struct usb_device *usb_alloc_new_device(void)
+struct usb_device *usb_alloc_new_device(void *controller)
 {
        int i;
        USB_PRINTF("New Device %d\n", dev_index);
@@ -768,6 +769,7 @@ struct usb_device *usb_alloc_new_device(void)
        for (i = 0; i < USB_MAXCHILDREN; i++)
                usb_dev[dev_index].children[i] = NULL;
        usb_dev[dev_index].parent = NULL;
+       usb_dev[dev_index].controller = controller;
        dev_index++;
        return &usb_dev[dev_index - 1];
 }
@@ -958,7 +960,7 @@ static void usb_scan_devices(void)
        }
        dev_index = 0;
        /* device 0 is always present (root hub, so let it analyze) */
-       dev = usb_alloc_new_device();
+       dev = usb_alloc_new_device(ctrl);
        if (usb_new_device(dev))
                printf("No USB Device found\n");
        else
index 32750e8d050bf3a8cde05f6df0a6a3f9fb891057..e4a120120dc23d068686d0e69e6d8248f9b35308 100644 (file)
@@ -244,7 +244,7 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
        mdelay(200);
 
        /* Allocate a new device struct for it */
-       usb = usb_alloc_new_device();
+       usb = usb_alloc_new_device(dev->controller);
 
        if (portstatus & USB_PORT_STAT_HIGH_SPEED)
                usb->speed = USB_SPEED_HIGH;
index 392e2862245a322530424d923aff3812a45b5f6d..5d8714e688a38a4942f8f94868e17650c501ec9e 100644 (file)
@@ -829,12 +829,12 @@ unknown:
        return -1;
 }
 
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        return ehci_hcd_stop();
 }
 
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
        uint32_t reg;
        uint32_t cmd;
index 5ef34c30fd964e64ad1d0bb66550b6364344d0c5..19e16a4a804bbacf9efdee693ba9174f6ec6024b 100644 (file)
@@ -1391,7 +1391,7 @@ int isp116x_check_id(struct isp116x *isp116x)
        return 0;
 }
 
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller))
 {
        struct isp116x *isp116x = &isp116x_dev;
 
@@ -1428,7 +1428,7 @@ int usb_lowlevel_init(void)
        return 0;
 }
 
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        struct isp116x *isp116x = &isp116x_dev;
 
index 9f4735167ad41d3d7b29bd8f8d34b4d1365899a3..c2106adbd3bae5b6e709425b8440553c1b2c1be6 100644 (file)
@@ -1865,7 +1865,7 @@ static void hc_release_ohci(ohci_t *ohci)
  */
 static char ohci_inited = 0;
 
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
 #ifdef CONFIG_PCI_OHCI
        pci_dev_t pdev;
@@ -1971,7 +1971,7 @@ int usb_lowlevel_init(void)
        return 0;
 }
 
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        /* this gets called really early - before the controller has */
        /* even been initialized! */
index ab1b8d0d8bec8bda3d06a46e31ac95aa941a3fa2..2a4e7ff4b3720b9e1eb92acb7768f3d6ca940667 100644 (file)
@@ -908,7 +908,7 @@ int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
        return 0;
 }
 
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller))
 {
        struct r8a66597 *r8a66597 = &gr8a66597;
 
@@ -931,7 +931,7 @@ int usb_lowlevel_init(void)
        return 0;
 }
 
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        disable_controller(&gr8a66597);
 
index bb27dd514ad07443ebf88bb9e7bc77f3e7ec387f..283061604693efa58e422f09ae95537ae4d52931 100644 (file)
@@ -210,14 +210,14 @@ static int sl811_hc_reset(void)
        return 1;
 }
 
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
        root_hub_devnum = 0;
        sl811_hc_reset();
        return 0;
 }
 
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        sl811_hc_reset();
        return 0;
index 8d44c4657f493005487af6133c9fcb7f8ab6ada0..06be38d1cf96928b043f0b92fedbc8ec4d91bb9c 100644 (file)
@@ -1092,7 +1092,7 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
 /*
  * This function initializes the usb controller module.
  */
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
        u8  power;
        u32 timeout;
@@ -1144,7 +1144,7 @@ int usb_lowlevel_init(void)
 /*
  * This function stops the operation of the davinci usb module.
  */
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        /* Reset the USB module */
        musb_platform_deinit();
index ba3d169ea8cbf977aaaeb8f95e9cf331537d1d58..292a0425d85c157d276ff9101baf94bd404f896a 100644 (file)
@@ -140,6 +140,8 @@ struct usb_device {
        int portnr;
        struct usb_device *parent;
        struct usb_device *children[USB_MAXCHILDREN];
+
+       void *controller;               /* hardware controller private data */
 };
 
 /**********************************************************************
@@ -153,8 +155,9 @@ struct usb_device {
        defined(CONFIG_USB_OMAP3) || defined(CONFIG_USB_DA8XX) || \
        defined(CONFIG_USB_BLACKFIN) || defined(CONFIG_USB_AM35X)
 
-int usb_lowlevel_init(void);
-int usb_lowlevel_stop(void);
+int usb_lowlevel_init(int index, void **controller);
+int usb_lowlevel_stop(int index);
+
 int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
                        void *buffer, int transfer_len);
 int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
@@ -382,7 +385,8 @@ void usb_hub_reset(void);
 int hub_port_reset(struct usb_device *dev, int port,
                          unsigned short *portstat);
 
-struct usb_device *usb_alloc_new_device(void);
+struct usb_device *usb_alloc_new_device(void *controller);
+
 int usb_new_device(struct usb_device *dev);
 
 #endif /*_USB_H_ */
index 51d36c3f343ef5e99fb05c73781d443022ba5009..221e626391784eeaa28343b8d390afcad46b1066 100644 (file)
@@ -147,5 +147,5 @@ struct ept_queue_item {
 #define INFO_BUFFER_ERROR     (1 << 5)
 #define INFO_TX_ERROR         (1 << 3)
 
-extern int usb_lowlevel_init(void);
+extern int usb_lowlevel_init(int index, void **controller);
 #endif /* __MV_UDC_H__ */