diff options
author | Florian Fainelli <florian@openwrt.org> | 2012-10-08 09:11:38 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-10-22 14:29:04 -0400 |
commit | e223a4cca70fb6d3954abab7e96a5f54d64d79d4 (patch) | |
tree | aa0b34e9719429a0cbdf117f9dd13c5d19936832 /arch/mips/alchemy | |
parent | 231a72e03af68f791e3f34dbc22117ebb18bdbb0 (diff) |
MIPS: Alchemy: use the OHCI platform driver
Convert the Alchemy platform to register the ohci-platform driver, now that
the ohci-platform driver properly handles the specific ohci-au1xxx resume
from suspend case.
This also greatly simplifies the power_{on,off} callbacks and make them
work on platform device id instead of checking the OHCI controller base
address like what was done in ohci-au1xxx.c.
Impacted defconfigs are also updated accordingly to select the OHCI platform
driver.
Signed-off-by: Florian Fainelli <florian@openwrt.org>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/mips/alchemy')
-rw-r--r-- | arch/mips/alchemy/common/platform.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/arch/mips/alchemy/common/platform.c b/arch/mips/alchemy/common/platform.c index b9a5f6dd30d6..7af941d8e717 100644 --- a/arch/mips/alchemy/common/platform.c +++ b/arch/mips/alchemy/common/platform.c | |||
@@ -18,6 +18,7 @@ | |||
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> | 20 | #include <linux/usb/ehci_pdriver.h> |
21 | #include <linux/usb/ohci_pdriver.h> | ||
21 | 22 | ||
22 | #include <asm/mach-au1x00/au1000.h> | 23 | #include <asm/mach-au1x00/au1000.h> |
23 | #include <asm/mach-au1x00/au1xxx_dbdma.h> | 24 | #include <asm/mach-au1x00/au1xxx_dbdma.h> |
@@ -142,6 +143,34 @@ static struct usb_ehci_pdata alchemy_ehci_pdata = { | |||
142 | .power_suspend = alchemy_ehci_power_off, | 143 | .power_suspend = alchemy_ehci_power_off, |
143 | }; | 144 | }; |
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 | |||
145 | static unsigned long alchemy_ohci_data[][2] __initdata = { | 174 | static unsigned long alchemy_ohci_data[][2] __initdata = { |
146 | [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 }, |
147 | [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 }, |
@@ -189,9 +218,10 @@ static void __init alchemy_setup_usb(int ctype) | |||
189 | res[1].start = alchemy_ohci_data[ctype][1]; | 218 | res[1].start = alchemy_ohci_data[ctype][1]; |
190 | res[1].end = res[1].start; | 219 | res[1].end = res[1].start; |
191 | res[1].flags = IORESOURCE_IRQ; | 220 | res[1].flags = IORESOURCE_IRQ; |
192 | pdev->name = "au1xxx-ohci"; | 221 | pdev->name = "ohci-platform"; |
193 | pdev->id = 0; | 222 | pdev->id = 0; |
194 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; | 223 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; |
224 | pdev->dev.platform_data = &alchemy_ohci_pdata; | ||
195 | 225 | ||
196 | if (platform_device_register(pdev)) | 226 | if (platform_device_register(pdev)) |
197 | printk(KERN_INFO "Alchemy USB: cannot add OHCI0\n"); | 227 | printk(KERN_INFO "Alchemy USB: cannot add OHCI0\n"); |
@@ -228,9 +258,10 @@ static void __init alchemy_setup_usb(int ctype) | |||
228 | res[1].start = AU1300_USB_INT; | 258 | res[1].start = AU1300_USB_INT; |
229 | res[1].end = res[1].start; | 259 | res[1].end = res[1].start; |
230 | res[1].flags = IORESOURCE_IRQ; | 260 | res[1].flags = IORESOURCE_IRQ; |
231 | pdev->name = "au1xxx-ohci"; | 261 | pdev->name = "ohci-platform"; |
232 | pdev->id = 1; | 262 | pdev->id = 1; |
233 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; | 263 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; |
264 | pdev->dev.platform_data = &alchemy_ohci_pdata; | ||
234 | 265 | ||
235 | if (platform_device_register(pdev)) | 266 | if (platform_device_register(pdev)) |
236 | printk(KERN_INFO "Alchemy USB: cannot add OHCI1\n"); | 267 | printk(KERN_INFO "Alchemy USB: cannot add OHCI1\n"); |