OpenWrt – Rev 1

Subversion Repositories:
Rev:
--- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
+++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
@@ -39,6 +39,7 @@ struct board_info {
 
        /* USB config */
        struct bcm63xx_usbd_platform_data usbd;
+       unsigned int num_usbh_ports:2;
 
        /* GPIO LEDs */
        struct gpio_led leds[5];
--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_usb_ehci.h
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_usb_ehci.h
@@ -1,6 +1,6 @@
 #ifndef BCM63XX_DEV_USB_EHCI_H_
 #define BCM63XX_DEV_USB_EHCI_H_
 
-int bcm63xx_ehci_register(void);
+int bcm63xx_ehci_register(unsigned int num_ports);
 
 #endif /* BCM63XX_DEV_USB_EHCI_H_ */
--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_usb_ohci.h
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_usb_ohci.h
@@ -1,6 +1,6 @@
 #ifndef BCM63XX_DEV_USB_OHCI_H_
 #define BCM63XX_DEV_USB_OHCI_H_
 
-int bcm63xx_ohci_register(void);
+int bcm63xx_ohci_register(unsigned int num_ports);
 
 #endif /* BCM63XX_DEV_USB_OHCI_H_ */
--- a/arch/mips/bcm63xx/boards/board_common.c
+++ b/arch/mips/bcm63xx/boards/board_common.c
@@ -165,6 +165,8 @@ static struct platform_device bcm63xx_gp
  */
 int __init board_register_devices(void)
 {
+       int usbh_ports = 0;
+
        if (board.has_uart0)
                bcm63xx_uart_register(0);
 
@@ -186,14 +188,21 @@ int __init board_register_devices(void)
            !board_get_mac_address(board.enetsw.mac_addr))
                bcm63xx_enetsw_register(&board.enetsw);
 
+       if ((board.has_ohci0 || board.has_ehci0)) {
+               usbh_ports = board.num_usbh_ports;
+
+               if (!usbh_ports || WARN_ON(usbh_ports > 1 && board.has_usbd))
+                       usbh_ports = 1;
+       }
+
        if (board.has_usbd)
                bcm63xx_usbd_register(&board.usbd);
 
        if (board.has_ehci0)
-               bcm63xx_ehci_register();
+               bcm63xx_ehci_register(usbh_ports);
 
        if (board.has_ohci0)
-               bcm63xx_ohci_register();
+               bcm63xx_ohci_register(usbh_ports);
 
        /* Generate MAC address for WLAN and register our SPROM,
         * do this after registering enet devices
--- a/arch/mips/bcm63xx/dev-usb-ehci.c
+++ b/arch/mips/bcm63xx/dev-usb-ehci.c
@@ -79,12 +79,14 @@ static struct platform_device bcm63xx_eh
        },
 };
 
-int __init bcm63xx_ehci_register(void)
+int __init bcm63xx_ehci_register(unsigned int num_ports)
 {
        if (!BCMCPU_IS_6318() && !BCMCPU_IS_6328() && !BCMCPU_IS_6358() &&
                !BCMCPU_IS_6362() && !BCMCPU_IS_6368() && !BCMCPU_IS_63268())
                return 0;
 
+       bcm63xx_ehci_pdata.num_ports = num_ports;       
+
        ehci_resources[0].start = bcm63xx_regset_address(RSET_EHCI0);
        ehci_resources[0].end = ehci_resources[0].start;
        ehci_resources[0].end += RSET_EHCI_SIZE - 1;
--- a/arch/mips/bcm63xx/dev-usb-ohci.c
+++ b/arch/mips/bcm63xx/dev-usb-ohci.c
@@ -62,7 +62,6 @@ static struct usb_ohci_pdata bcm63xx_ohc
        .big_endian_desc        = 1,
        .big_endian_mmio        = 1,
        .no_big_frame_no        = 1,
-       .num_ports              = 1,
        .power_on               = bcm63xx_ohci_power_on,
        .power_off              = bcm63xx_ohci_power_off,
        .power_suspend          = bcm63xx_ohci_power_off,
@@ -80,11 +79,13 @@ static struct platform_device bcm63xx_oh
        },
 };
 
-int __init bcm63xx_ohci_register(void)
+int __init bcm63xx_ohci_register(unsigned int num_ports)
 {
        if (BCMCPU_IS_6345() || BCMCPU_IS_6338())
                return -ENODEV;
 
+       bcm63xx_ohci_pdata.num_ports = num_ports;
+
        ohci_resources[0].start = bcm63xx_regset_address(RSET_OHCI0);
        ohci_resources[0].end = ohci_resources[0].start;
        ohci_resources[0].end += RSET_OHCI_SIZE - 1;