|
|
@@ -0,0 +1,107 @@
|
|
|
+--- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
|
|
|
++++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
|
|
|
+@@ -42,6 +42,7 @@ struct board_info {
|
|
|
+
|
|
|
+ /* USB config */
|
|
|
+ struct bcm63xx_usbd_platform_data usbd;
|
|
|
++ unsigned int num_usbh_ports:2;
|
|
|
+
|
|
|
+ /* DSP config */
|
|
|
+ struct bcm63xx_dsp_platform_data dsp;
|
|
|
+--- 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_bcm963xx.c
|
|
|
++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
|
|
|
+@@ -965,6 +965,7 @@ int __init board_register_devices(void)
|
|
|
+ {
|
|
|
+ int button_count = 0;
|
|
|
+ int led_count = 0;
|
|
|
++ int usbh_ports = 0;
|
|
|
+
|
|
|
+ if (board.has_uart0)
|
|
|
+ bcm63xx_uart_register(0);
|
|
|
+@@ -987,14 +988,21 @@ int __init board_register_devices(void)
|
|
|
+ !bcm63xx_nvram_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);
|
|
|
+
|
|
|
+ if (board.has_dsp)
|
|
|
+ bcm63xx_dsp_register(&board.dsp);
|
|
|
+--- 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;
|