--- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h +++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h @@ -41,6 +41,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_common.c +++ b/arch/mips/bcm63xx/boards/board_common.c @@ -166,6 +166,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); @@ -187,14 +189,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); 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;