diff options
author | Anand Gadiyar <gadiyar@ti.com> | 2010-11-21 12:53:41 -0500 |
---|---|---|
committer | Anand Gadiyar <gadiyar@ti.com> | 2010-11-30 16:12:13 -0500 |
commit | becf0737cf25bd0084ed85ccb1ab6c902e600a3c (patch) | |
tree | 8818413b24673e32ccda57b0bfd9746dd8171f19 /arch/arm/mach-omap2 | |
parent | 811406c2e69281b0e498d25a42902817299b6b3d (diff) |
arm: omap4: usb: add platform init code for EHCI
- Add platform init code for EHCI on OMAP4
- Add pad configuration for PHY and TLL modes
Signed-off-by: Anand Gadiyar <gadiyar@ti.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r-- | arch/arm/mach-omap2/usb-ehci.c | 144 |
1 files changed, 136 insertions, 8 deletions
diff --git a/arch/arm/mach-omap2/usb-ehci.c b/arch/arm/mach-omap2/usb-ehci.c index b11bf385d360..25eeadabc39b 100644 --- a/arch/arm/mach-omap2/usb-ehci.c +++ b/arch/arm/mach-omap2/usb-ehci.c | |||
@@ -34,22 +34,15 @@ | |||
34 | 34 | ||
35 | static struct resource ehci_resources[] = { | 35 | static struct resource ehci_resources[] = { |
36 | { | 36 | { |
37 | .start = OMAP34XX_EHCI_BASE, | ||
38 | .end = OMAP34XX_EHCI_BASE + SZ_1K - 1, | ||
39 | .flags = IORESOURCE_MEM, | 37 | .flags = IORESOURCE_MEM, |
40 | }, | 38 | }, |
41 | { | 39 | { |
42 | .start = OMAP34XX_UHH_CONFIG_BASE, | ||
43 | .end = OMAP34XX_UHH_CONFIG_BASE + SZ_1K - 1, | ||
44 | .flags = IORESOURCE_MEM, | 40 | .flags = IORESOURCE_MEM, |
45 | }, | 41 | }, |
46 | { | 42 | { |
47 | .start = OMAP34XX_USBTLL_BASE, | ||
48 | .end = OMAP34XX_USBTLL_BASE + SZ_4K - 1, | ||
49 | .flags = IORESOURCE_MEM, | 43 | .flags = IORESOURCE_MEM, |
50 | }, | 44 | }, |
51 | { /* general IRQ */ | 45 | { /* general IRQ */ |
52 | .start = INT_34XX_EHCI_IRQ, | ||
53 | .flags = IORESOURCE_IRQ, | 46 | .flags = IORESOURCE_IRQ, |
54 | } | 47 | } |
55 | }; | 48 | }; |
@@ -214,13 +207,148 @@ static void setup_ehci_io_mux(const enum ehci_hcd_omap_mode *port_mode) | |||
214 | return; | 207 | return; |
215 | } | 208 | } |
216 | 209 | ||
210 | static void setup_4430ehci_io_mux(const enum ehci_hcd_omap_mode *port_mode) | ||
211 | { | ||
212 | switch (port_mode[0]) { | ||
213 | case EHCI_HCD_OMAP_MODE_PHY: | ||
214 | omap_mux_init_signal("usbb1_ulpiphy_stp", | ||
215 | OMAP_PIN_OUTPUT); | ||
216 | omap_mux_init_signal("usbb1_ulpiphy_clk", | ||
217 | OMAP_PIN_INPUT_PULLDOWN); | ||
218 | omap_mux_init_signal("usbb1_ulpiphy_dir", | ||
219 | OMAP_PIN_INPUT_PULLDOWN); | ||
220 | omap_mux_init_signal("usbb1_ulpiphy_nxt", | ||
221 | OMAP_PIN_INPUT_PULLDOWN); | ||
222 | omap_mux_init_signal("usbb1_ulpiphy_dat0", | ||
223 | OMAP_PIN_INPUT_PULLDOWN); | ||
224 | omap_mux_init_signal("usbb1_ulpiphy_dat1", | ||
225 | OMAP_PIN_INPUT_PULLDOWN); | ||
226 | omap_mux_init_signal("usbb1_ulpiphy_dat2", | ||
227 | OMAP_PIN_INPUT_PULLDOWN); | ||
228 | omap_mux_init_signal("usbb1_ulpiphy_dat3", | ||
229 | OMAP_PIN_INPUT_PULLDOWN); | ||
230 | omap_mux_init_signal("usbb1_ulpiphy_dat4", | ||
231 | OMAP_PIN_INPUT_PULLDOWN); | ||
232 | omap_mux_init_signal("usbb1_ulpiphy_dat5", | ||
233 | OMAP_PIN_INPUT_PULLDOWN); | ||
234 | omap_mux_init_signal("usbb1_ulpiphy_dat6", | ||
235 | OMAP_PIN_INPUT_PULLDOWN); | ||
236 | omap_mux_init_signal("usbb1_ulpiphy_dat7", | ||
237 | OMAP_PIN_INPUT_PULLDOWN); | ||
238 | break; | ||
239 | case EHCI_HCD_OMAP_MODE_TLL: | ||
240 | omap_mux_init_signal("usbb1_ulpitll_stp", | ||
241 | OMAP_PIN_INPUT_PULLUP); | ||
242 | omap_mux_init_signal("usbb1_ulpitll_clk", | ||
243 | OMAP_PIN_INPUT_PULLDOWN); | ||
244 | omap_mux_init_signal("usbb1_ulpitll_dir", | ||
245 | OMAP_PIN_INPUT_PULLDOWN); | ||
246 | omap_mux_init_signal("usbb1_ulpitll_nxt", | ||
247 | OMAP_PIN_INPUT_PULLDOWN); | ||
248 | omap_mux_init_signal("usbb1_ulpitll_dat0", | ||
249 | OMAP_PIN_INPUT_PULLDOWN); | ||
250 | omap_mux_init_signal("usbb1_ulpitll_dat1", | ||
251 | OMAP_PIN_INPUT_PULLDOWN); | ||
252 | omap_mux_init_signal("usbb1_ulpitll_dat2", | ||
253 | OMAP_PIN_INPUT_PULLDOWN); | ||
254 | omap_mux_init_signal("usbb1_ulpitll_dat3", | ||
255 | OMAP_PIN_INPUT_PULLDOWN); | ||
256 | omap_mux_init_signal("usbb1_ulpitll_dat4", | ||
257 | OMAP_PIN_INPUT_PULLDOWN); | ||
258 | omap_mux_init_signal("usbb1_ulpitll_dat5", | ||
259 | OMAP_PIN_INPUT_PULLDOWN); | ||
260 | omap_mux_init_signal("usbb1_ulpitll_dat6", | ||
261 | OMAP_PIN_INPUT_PULLDOWN); | ||
262 | omap_mux_init_signal("usbb1_ulpitll_dat7", | ||
263 | OMAP_PIN_INPUT_PULLDOWN); | ||
264 | break; | ||
265 | case EHCI_HCD_OMAP_MODE_UNKNOWN: | ||
266 | default: | ||
267 | break; | ||
268 | } | ||
269 | switch (port_mode[1]) { | ||
270 | case EHCI_HCD_OMAP_MODE_PHY: | ||
271 | omap_mux_init_signal("usbb2_ulpiphy_stp", | ||
272 | OMAP_PIN_OUTPUT); | ||
273 | omap_mux_init_signal("usbb2_ulpiphy_clk", | ||
274 | OMAP_PIN_INPUT_PULLDOWN); | ||
275 | omap_mux_init_signal("usbb2_ulpiphy_dir", | ||
276 | OMAP_PIN_INPUT_PULLDOWN); | ||
277 | omap_mux_init_signal("usbb2_ulpiphy_nxt", | ||
278 | OMAP_PIN_INPUT_PULLDOWN); | ||
279 | omap_mux_init_signal("usbb2_ulpiphy_dat0", | ||
280 | OMAP_PIN_INPUT_PULLDOWN); | ||
281 | omap_mux_init_signal("usbb2_ulpiphy_dat1", | ||
282 | OMAP_PIN_INPUT_PULLDOWN); | ||
283 | omap_mux_init_signal("usbb2_ulpiphy_dat2", | ||
284 | OMAP_PIN_INPUT_PULLDOWN); | ||
285 | omap_mux_init_signal("usbb2_ulpiphy_dat3", | ||
286 | OMAP_PIN_INPUT_PULLDOWN); | ||
287 | omap_mux_init_signal("usbb2_ulpiphy_dat4", | ||
288 | OMAP_PIN_INPUT_PULLDOWN); | ||
289 | omap_mux_init_signal("usbb2_ulpiphy_dat5", | ||
290 | OMAP_PIN_INPUT_PULLDOWN); | ||
291 | omap_mux_init_signal("usbb2_ulpiphy_dat6", | ||
292 | OMAP_PIN_INPUT_PULLDOWN); | ||
293 | omap_mux_init_signal("usbb2_ulpiphy_dat7", | ||
294 | OMAP_PIN_INPUT_PULLDOWN); | ||
295 | break; | ||
296 | case EHCI_HCD_OMAP_MODE_TLL: | ||
297 | omap_mux_init_signal("usbb2_ulpitll_stp", | ||
298 | OMAP_PIN_INPUT_PULLUP); | ||
299 | omap_mux_init_signal("usbb2_ulpitll_clk", | ||
300 | OMAP_PIN_INPUT_PULLDOWN); | ||
301 | omap_mux_init_signal("usbb2_ulpitll_dir", | ||
302 | OMAP_PIN_INPUT_PULLDOWN); | ||
303 | omap_mux_init_signal("usbb2_ulpitll_nxt", | ||
304 | OMAP_PIN_INPUT_PULLDOWN); | ||
305 | omap_mux_init_signal("usbb2_ulpitll_dat0", | ||
306 | OMAP_PIN_INPUT_PULLDOWN); | ||
307 | omap_mux_init_signal("usbb2_ulpitll_dat1", | ||
308 | OMAP_PIN_INPUT_PULLDOWN); | ||
309 | omap_mux_init_signal("usbb2_ulpitll_dat2", | ||
310 | OMAP_PIN_INPUT_PULLDOWN); | ||
311 | omap_mux_init_signal("usbb2_ulpitll_dat3", | ||
312 | OMAP_PIN_INPUT_PULLDOWN); | ||
313 | omap_mux_init_signal("usbb2_ulpitll_dat4", | ||
314 | OMAP_PIN_INPUT_PULLDOWN); | ||
315 | omap_mux_init_signal("usbb2_ulpitll_dat5", | ||
316 | OMAP_PIN_INPUT_PULLDOWN); | ||
317 | omap_mux_init_signal("usbb2_ulpitll_dat6", | ||
318 | OMAP_PIN_INPUT_PULLDOWN); | ||
319 | omap_mux_init_signal("usbb2_ulpitll_dat7", | ||
320 | OMAP_PIN_INPUT_PULLDOWN); | ||
321 | break; | ||
322 | case EHCI_HCD_OMAP_MODE_UNKNOWN: | ||
323 | default: | ||
324 | break; | ||
325 | } | ||
326 | } | ||
327 | |||
217 | void __init usb_ehci_init(const struct ehci_hcd_omap_platform_data *pdata) | 328 | void __init usb_ehci_init(const struct ehci_hcd_omap_platform_data *pdata) |
218 | { | 329 | { |
219 | platform_device_add_data(&ehci_device, pdata, sizeof(*pdata)); | 330 | platform_device_add_data(&ehci_device, pdata, sizeof(*pdata)); |
220 | 331 | ||
221 | /* Setup Pin IO MUX for EHCI */ | 332 | /* Setup Pin IO MUX for EHCI */ |
222 | if (cpu_is_omap34xx()) | 333 | if (cpu_is_omap34xx()) { |
334 | ehci_resources[0].start = OMAP34XX_EHCI_BASE; | ||
335 | ehci_resources[0].end = OMAP34XX_EHCI_BASE + SZ_1K - 1; | ||
336 | ehci_resources[1].start = OMAP34XX_UHH_CONFIG_BASE; | ||
337 | ehci_resources[1].end = OMAP34XX_UHH_CONFIG_BASE + SZ_1K - 1; | ||
338 | ehci_resources[2].start = OMAP34XX_USBTLL_BASE; | ||
339 | ehci_resources[2].end = OMAP34XX_USBTLL_BASE + SZ_4K - 1; | ||
340 | ehci_resources[3].start = INT_34XX_EHCI_IRQ; | ||
223 | setup_ehci_io_mux(pdata->port_mode); | 341 | setup_ehci_io_mux(pdata->port_mode); |
342 | } else if (cpu_is_omap44xx()) { | ||
343 | ehci_resources[0].start = OMAP44XX_HSUSB_EHCI_BASE; | ||
344 | ehci_resources[0].end = OMAP44XX_HSUSB_EHCI_BASE + SZ_1K - 1; | ||
345 | ehci_resources[1].start = OMAP44XX_UHH_CONFIG_BASE; | ||
346 | ehci_resources[1].end = OMAP44XX_UHH_CONFIG_BASE + SZ_2K - 1; | ||
347 | ehci_resources[2].start = OMAP44XX_USBTLL_BASE; | ||
348 | ehci_resources[2].end = OMAP44XX_USBTLL_BASE + SZ_4K - 1; | ||
349 | ehci_resources[3].start = OMAP44XX_IRQ_EHCI; | ||
350 | setup_4430ehci_io_mux(pdata->port_mode); | ||
351 | } | ||
224 | 352 | ||
225 | if (platform_device_register(&ehci_device) < 0) { | 353 | if (platform_device_register(&ehci_device) < 0) { |
226 | printk(KERN_ERR "Unable to register HS-USB (EHCI) device\n"); | 354 | printk(KERN_ERR "Unable to register HS-USB (EHCI) device\n"); |