diff options
Diffstat (limited to 'arch/mips/alchemy/common/platform.c')
-rw-r--r-- | arch/mips/alchemy/common/platform.c | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/arch/mips/alchemy/common/platform.c b/arch/mips/alchemy/common/platform.c index c0f3ce6dcb56..7af941d8e717 100644 --- a/arch/mips/alchemy/common/platform.c +++ b/arch/mips/alchemy/common/platform.c | |||
@@ -17,6 +17,8 @@ | |||
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/serial_8250.h> | 18 | #include <linux/serial_8250.h> |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/usb/ehci_pdriver.h> | ||
21 | #include <linux/usb/ohci_pdriver.h> | ||
20 | 22 | ||
21 | #include <asm/mach-au1x00/au1000.h> | 23 | #include <asm/mach-au1x00/au1000.h> |
22 | #include <asm/mach-au1x00/au1xxx_dbdma.h> | 24 | #include <asm/mach-au1x00/au1xxx_dbdma.h> |
@@ -122,6 +124,53 @@ static void __init alchemy_setup_uarts(int ctype) | |||
122 | static u64 alchemy_ohci_dmamask = DMA_BIT_MASK(32); | 124 | static u64 alchemy_ohci_dmamask = DMA_BIT_MASK(32); |
123 | static u64 __maybe_unused alchemy_ehci_dmamask = DMA_BIT_MASK(32); | 125 | static u64 __maybe_unused alchemy_ehci_dmamask = DMA_BIT_MASK(32); |
124 | 126 | ||
127 | /* Power on callback for the ehci platform driver */ | ||
128 | static int alchemy_ehci_power_on(struct platform_device *pdev) | ||
129 | { | ||
130 | return alchemy_usb_control(ALCHEMY_USB_EHCI0, 1); | ||
131 | } | ||
132 | |||
133 | /* Power off/suspend callback for the ehci platform driver */ | ||
134 | static void alchemy_ehci_power_off(struct platform_device *pdev) | ||
135 | { | ||
136 | alchemy_usb_control(ALCHEMY_USB_EHCI0, 0); | ||
137 | } | ||
138 | |||
139 | static struct usb_ehci_pdata alchemy_ehci_pdata = { | ||
140 | .no_io_watchdog = 1, | ||
141 | .power_on = alchemy_ehci_power_on, | ||
142 | .power_off = alchemy_ehci_power_off, | ||
143 | .power_suspend = alchemy_ehci_power_off, | ||
144 | }; | ||
145 | |||
146 | /* Power on callback for the ohci platform driver */ | ||
147 | static int alchemy_ohci_power_on(struct platform_device *pdev) | ||
148 | { | ||
149 | int unit; | ||
150 | |||
151 | unit = (pdev->id == 1) ? | ||
152 | ALCHEMY_USB_OHCI1 : ALCHEMY_USB_OHCI0; | ||
153 | |||
154 | return alchemy_usb_control(unit, 1); | ||
155 | } | ||
156 | |||
157 | /* Power off/suspend callback for the ohci platform driver */ | ||
158 | static void alchemy_ohci_power_off(struct platform_device *pdev) | ||
159 | { | ||
160 | int unit; | ||
161 | |||
162 | unit = (pdev->id == 1) ? | ||
163 | ALCHEMY_USB_OHCI1 : ALCHEMY_USB_OHCI0; | ||
164 | |||
165 | alchemy_usb_control(unit, 0); | ||
166 | } | ||
167 | |||
168 | static struct usb_ohci_pdata alchemy_ohci_pdata = { | ||
169 | .power_on = alchemy_ohci_power_on, | ||
170 | .power_off = alchemy_ohci_power_off, | ||
171 | .power_suspend = alchemy_ohci_power_off, | ||
172 | }; | ||
173 | |||
125 | static unsigned long alchemy_ohci_data[][2] __initdata = { | 174 | static unsigned long alchemy_ohci_data[][2] __initdata = { |
126 | [ALCHEMY_CPU_AU1000] = { AU1000_USB_OHCI_PHYS_ADDR, AU1000_USB_HOST_INT }, | 175 | [ALCHEMY_CPU_AU1000] = { AU1000_USB_OHCI_PHYS_ADDR, AU1000_USB_HOST_INT }, |
127 | [ALCHEMY_CPU_AU1500] = { AU1000_USB_OHCI_PHYS_ADDR, AU1500_USB_HOST_INT }, | 176 | [ALCHEMY_CPU_AU1500] = { AU1000_USB_OHCI_PHYS_ADDR, AU1500_USB_HOST_INT }, |
@@ -169,9 +218,10 @@ static void __init alchemy_setup_usb(int ctype) | |||
169 | res[1].start = alchemy_ohci_data[ctype][1]; | 218 | res[1].start = alchemy_ohci_data[ctype][1]; |
170 | res[1].end = res[1].start; | 219 | res[1].end = res[1].start; |
171 | res[1].flags = IORESOURCE_IRQ; | 220 | res[1].flags = IORESOURCE_IRQ; |
172 | pdev->name = "au1xxx-ohci"; | 221 | pdev->name = "ohci-platform"; |
173 | pdev->id = 0; | 222 | pdev->id = 0; |
174 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; | 223 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; |
224 | pdev->dev.platform_data = &alchemy_ohci_pdata; | ||
175 | 225 | ||
176 | if (platform_device_register(pdev)) | 226 | if (platform_device_register(pdev)) |
177 | printk(KERN_INFO "Alchemy USB: cannot add OHCI0\n"); | 227 | printk(KERN_INFO "Alchemy USB: cannot add OHCI0\n"); |
@@ -188,9 +238,10 @@ static void __init alchemy_setup_usb(int ctype) | |||
188 | res[1].start = alchemy_ehci_data[ctype][1]; | 238 | res[1].start = alchemy_ehci_data[ctype][1]; |
189 | res[1].end = res[1].start; | 239 | res[1].end = res[1].start; |
190 | res[1].flags = IORESOURCE_IRQ; | 240 | res[1].flags = IORESOURCE_IRQ; |
191 | pdev->name = "au1xxx-ehci"; | 241 | pdev->name = "ehci-platform"; |
192 | pdev->id = 0; | 242 | pdev->id = 0; |
193 | pdev->dev.dma_mask = &alchemy_ehci_dmamask; | 243 | pdev->dev.dma_mask = &alchemy_ehci_dmamask; |
244 | pdev->dev.platform_data = &alchemy_ehci_pdata; | ||
194 | 245 | ||
195 | if (platform_device_register(pdev)) | 246 | if (platform_device_register(pdev)) |
196 | printk(KERN_INFO "Alchemy USB: cannot add EHCI0\n"); | 247 | printk(KERN_INFO "Alchemy USB: cannot add EHCI0\n"); |
@@ -207,9 +258,10 @@ static void __init alchemy_setup_usb(int ctype) | |||
207 | res[1].start = AU1300_USB_INT; | 258 | res[1].start = AU1300_USB_INT; |
208 | res[1].end = res[1].start; | 259 | res[1].end = res[1].start; |
209 | res[1].flags = IORESOURCE_IRQ; | 260 | res[1].flags = IORESOURCE_IRQ; |
210 | pdev->name = "au1xxx-ohci"; | 261 | pdev->name = "ohci-platform"; |
211 | pdev->id = 1; | 262 | pdev->id = 1; |
212 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; | 263 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; |
264 | pdev->dev.platform_data = &alchemy_ohci_pdata; | ||
213 | 265 | ||
214 | if (platform_device_register(pdev)) | 266 | if (platform_device_register(pdev)) |
215 | printk(KERN_INFO "Alchemy USB: cannot add OHCI1\n"); | 267 | printk(KERN_INFO "Alchemy USB: cannot add OHCI1\n"); |