summaryrefslogtreecommitdiff
path: root/target/linux/brcm63xx/patches-4.1/350-MIPS-BCM63XX-support-settings-num-usbh-ports.patch
blob: 41747da2d9618059389f357a2641e1f33383fb8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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_common.c
+++ b/arch/mips/bcm63xx/boards/board_common.c
@@ -181,6 +181,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);
@@ -203,14 +204,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;