Merge branch 'next/fixes' into next/cleanup
[deliverable/linux.git] / arch / arm / mach-omap2 / usb-host.c
1 /*
2 * usb-host.c - OMAP USB Host
3 *
4 * This file will contain the board specific details for the
5 * Synopsys EHCI/OHCI host controller on OMAP3430 and onwards
6 *
7 * Copyright (C) 2007-2011 Texas Instruments
8 * Author: Vikram Pandita <vikram.pandita@ti.com>
9 * Author: Keshava Munegowda <keshava_mgowda@ti.com>
10 *
11 * Generalization by:
12 * Felipe Balbi <balbi@ti.com>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License version 2 as
16 * published by the Free Software Foundation.
17 */
18
19 #include <linux/types.h>
20 #include <linux/errno.h>
21 #include <linux/delay.h>
22 #include <linux/platform_device.h>
23 #include <linux/slab.h>
24 #include <linux/dma-mapping.h>
25
26 #include <asm/io.h>
27
28 #include <mach/hardware.h>
29 #include <mach/irqs.h>
30 #include <plat/usb.h>
31
32 #include "mux.h"
33
34 #ifdef CONFIG_MFD_OMAP_USB_HOST
35
36 #define OMAP_USBHS_DEVICE "usbhs-omap"
37
38 static struct resource usbhs_resources[] = {
39 {
40 .name = "uhh",
41 .flags = IORESOURCE_MEM,
42 },
43 {
44 .name = "tll",
45 .flags = IORESOURCE_MEM,
46 },
47 {
48 .name = "ehci",
49 .flags = IORESOURCE_MEM,
50 },
51 {
52 .name = "ehci-irq",
53 .flags = IORESOURCE_IRQ,
54 },
55 {
56 .name = "ohci",
57 .flags = IORESOURCE_MEM,
58 },
59 {
60 .name = "ohci-irq",
61 .flags = IORESOURCE_IRQ,
62 }
63 };
64
65 static struct platform_device usbhs_device = {
66 .name = OMAP_USBHS_DEVICE,
67 .id = 0,
68 .num_resources = ARRAY_SIZE(usbhs_resources),
69 .resource = usbhs_resources,
70 };
71
72 static struct usbhs_omap_platform_data usbhs_data;
73 static struct ehci_hcd_omap_platform_data ehci_data;
74 static struct ohci_hcd_omap_platform_data ohci_data;
75
76 /* MUX settings for EHCI pins */
77 /*
78 * setup_ehci_io_mux - initialize IO pad mux for USBHOST
79 */
80 static void setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode)
81 {
82 switch (port_mode[0]) {
83 case OMAP_EHCI_PORT_MODE_PHY:
84 omap_mux_init_signal("hsusb1_stp", OMAP_PIN_OUTPUT);
85 omap_mux_init_signal("hsusb1_clk", OMAP_PIN_OUTPUT);
86 omap_mux_init_signal("hsusb1_dir", OMAP_PIN_INPUT_PULLDOWN);
87 omap_mux_init_signal("hsusb1_nxt", OMAP_PIN_INPUT_PULLDOWN);
88 omap_mux_init_signal("hsusb1_data0", OMAP_PIN_INPUT_PULLDOWN);
89 omap_mux_init_signal("hsusb1_data1", OMAP_PIN_INPUT_PULLDOWN);
90 omap_mux_init_signal("hsusb1_data2", OMAP_PIN_INPUT_PULLDOWN);
91 omap_mux_init_signal("hsusb1_data3", OMAP_PIN_INPUT_PULLDOWN);
92 omap_mux_init_signal("hsusb1_data4", OMAP_PIN_INPUT_PULLDOWN);
93 omap_mux_init_signal("hsusb1_data5", OMAP_PIN_INPUT_PULLDOWN);
94 omap_mux_init_signal("hsusb1_data6", OMAP_PIN_INPUT_PULLDOWN);
95 omap_mux_init_signal("hsusb1_data7", OMAP_PIN_INPUT_PULLDOWN);
96 break;
97 case OMAP_EHCI_PORT_MODE_TLL:
98 omap_mux_init_signal("hsusb1_tll_stp",
99 OMAP_PIN_INPUT_PULLUP);
100 omap_mux_init_signal("hsusb1_tll_clk",
101 OMAP_PIN_INPUT_PULLDOWN);
102 omap_mux_init_signal("hsusb1_tll_dir",
103 OMAP_PIN_INPUT_PULLDOWN);
104 omap_mux_init_signal("hsusb1_tll_nxt",
105 OMAP_PIN_INPUT_PULLDOWN);
106 omap_mux_init_signal("hsusb1_tll_data0",
107 OMAP_PIN_INPUT_PULLDOWN);
108 omap_mux_init_signal("hsusb1_tll_data1",
109 OMAP_PIN_INPUT_PULLDOWN);
110 omap_mux_init_signal("hsusb1_tll_data2",
111 OMAP_PIN_INPUT_PULLDOWN);
112 omap_mux_init_signal("hsusb1_tll_data3",
113 OMAP_PIN_INPUT_PULLDOWN);
114 omap_mux_init_signal("hsusb1_tll_data4",
115 OMAP_PIN_INPUT_PULLDOWN);
116 omap_mux_init_signal("hsusb1_tll_data5",
117 OMAP_PIN_INPUT_PULLDOWN);
118 omap_mux_init_signal("hsusb1_tll_data6",
119 OMAP_PIN_INPUT_PULLDOWN);
120 omap_mux_init_signal("hsusb1_tll_data7",
121 OMAP_PIN_INPUT_PULLDOWN);
122 break;
123 case OMAP_USBHS_PORT_MODE_UNUSED:
124 /* FALLTHROUGH */
125 default:
126 break;
127 }
128
129 switch (port_mode[1]) {
130 case OMAP_EHCI_PORT_MODE_PHY:
131 omap_mux_init_signal("hsusb2_stp", OMAP_PIN_OUTPUT);
132 omap_mux_init_signal("hsusb2_clk", OMAP_PIN_OUTPUT);
133 omap_mux_init_signal("hsusb2_dir", OMAP_PIN_INPUT_PULLDOWN);
134 omap_mux_init_signal("hsusb2_nxt", OMAP_PIN_INPUT_PULLDOWN);
135 omap_mux_init_signal("hsusb2_data0",
136 OMAP_PIN_INPUT_PULLDOWN);
137 omap_mux_init_signal("hsusb2_data1",
138 OMAP_PIN_INPUT_PULLDOWN);
139 omap_mux_init_signal("hsusb2_data2",
140 OMAP_PIN_INPUT_PULLDOWN);
141 omap_mux_init_signal("hsusb2_data3",
142 OMAP_PIN_INPUT_PULLDOWN);
143 omap_mux_init_signal("hsusb2_data4",
144 OMAP_PIN_INPUT_PULLDOWN);
145 omap_mux_init_signal("hsusb2_data5",
146 OMAP_PIN_INPUT_PULLDOWN);
147 omap_mux_init_signal("hsusb2_data6",
148 OMAP_PIN_INPUT_PULLDOWN);
149 omap_mux_init_signal("hsusb2_data7",
150 OMAP_PIN_INPUT_PULLDOWN);
151 break;
152 case OMAP_EHCI_PORT_MODE_TLL:
153 omap_mux_init_signal("hsusb2_tll_stp",
154 OMAP_PIN_INPUT_PULLUP);
155 omap_mux_init_signal("hsusb2_tll_clk",
156 OMAP_PIN_INPUT_PULLDOWN);
157 omap_mux_init_signal("hsusb2_tll_dir",
158 OMAP_PIN_INPUT_PULLDOWN);
159 omap_mux_init_signal("hsusb2_tll_nxt",
160 OMAP_PIN_INPUT_PULLDOWN);
161 omap_mux_init_signal("hsusb2_tll_data0",
162 OMAP_PIN_INPUT_PULLDOWN);
163 omap_mux_init_signal("hsusb2_tll_data1",
164 OMAP_PIN_INPUT_PULLDOWN);
165 omap_mux_init_signal("hsusb2_tll_data2",
166 OMAP_PIN_INPUT_PULLDOWN);
167 omap_mux_init_signal("hsusb2_tll_data3",
168 OMAP_PIN_INPUT_PULLDOWN);
169 omap_mux_init_signal("hsusb2_tll_data4",
170 OMAP_PIN_INPUT_PULLDOWN);
171 omap_mux_init_signal("hsusb2_tll_data5",
172 OMAP_PIN_INPUT_PULLDOWN);
173 omap_mux_init_signal("hsusb2_tll_data6",
174 OMAP_PIN_INPUT_PULLDOWN);
175 omap_mux_init_signal("hsusb2_tll_data7",
176 OMAP_PIN_INPUT_PULLDOWN);
177 break;
178 case OMAP_USBHS_PORT_MODE_UNUSED:
179 /* FALLTHROUGH */
180 default:
181 break;
182 }
183
184 switch (port_mode[2]) {
185 case OMAP_EHCI_PORT_MODE_PHY:
186 printk(KERN_WARNING "Port3 can't be used in PHY mode\n");
187 break;
188 case OMAP_EHCI_PORT_MODE_TLL:
189 omap_mux_init_signal("hsusb3_tll_stp",
190 OMAP_PIN_INPUT_PULLUP);
191 omap_mux_init_signal("hsusb3_tll_clk",
192 OMAP_PIN_INPUT_PULLDOWN);
193 omap_mux_init_signal("hsusb3_tll_dir",
194 OMAP_PIN_INPUT_PULLDOWN);
195 omap_mux_init_signal("hsusb3_tll_nxt",
196 OMAP_PIN_INPUT_PULLDOWN);
197 omap_mux_init_signal("hsusb3_tll_data0",
198 OMAP_PIN_INPUT_PULLDOWN);
199 omap_mux_init_signal("hsusb3_tll_data1",
200 OMAP_PIN_INPUT_PULLDOWN);
201 omap_mux_init_signal("hsusb3_tll_data2",
202 OMAP_PIN_INPUT_PULLDOWN);
203 omap_mux_init_signal("hsusb3_tll_data3",
204 OMAP_PIN_INPUT_PULLDOWN);
205 omap_mux_init_signal("hsusb3_tll_data4",
206 OMAP_PIN_INPUT_PULLDOWN);
207 omap_mux_init_signal("hsusb3_tll_data5",
208 OMAP_PIN_INPUT_PULLDOWN);
209 omap_mux_init_signal("hsusb3_tll_data6",
210 OMAP_PIN_INPUT_PULLDOWN);
211 omap_mux_init_signal("hsusb3_tll_data7",
212 OMAP_PIN_INPUT_PULLDOWN);
213 break;
214 case OMAP_USBHS_PORT_MODE_UNUSED:
215 /* FALLTHROUGH */
216 default:
217 break;
218 }
219
220 return;
221 }
222
223 static void setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode)
224 {
225 switch (port_mode[0]) {
226 case OMAP_EHCI_PORT_MODE_PHY:
227 omap_mux_init_signal("usbb1_ulpiphy_stp",
228 OMAP_PIN_OUTPUT);
229 omap_mux_init_signal("usbb1_ulpiphy_clk",
230 OMAP_PIN_INPUT_PULLDOWN);
231 omap_mux_init_signal("usbb1_ulpiphy_dir",
232 OMAP_PIN_INPUT_PULLDOWN);
233 omap_mux_init_signal("usbb1_ulpiphy_nxt",
234 OMAP_PIN_INPUT_PULLDOWN);
235 omap_mux_init_signal("usbb1_ulpiphy_dat0",
236 OMAP_PIN_INPUT_PULLDOWN);
237 omap_mux_init_signal("usbb1_ulpiphy_dat1",
238 OMAP_PIN_INPUT_PULLDOWN);
239 omap_mux_init_signal("usbb1_ulpiphy_dat2",
240 OMAP_PIN_INPUT_PULLDOWN);
241 omap_mux_init_signal("usbb1_ulpiphy_dat3",
242 OMAP_PIN_INPUT_PULLDOWN);
243 omap_mux_init_signal("usbb1_ulpiphy_dat4",
244 OMAP_PIN_INPUT_PULLDOWN);
245 omap_mux_init_signal("usbb1_ulpiphy_dat5",
246 OMAP_PIN_INPUT_PULLDOWN);
247 omap_mux_init_signal("usbb1_ulpiphy_dat6",
248 OMAP_PIN_INPUT_PULLDOWN);
249 omap_mux_init_signal("usbb1_ulpiphy_dat7",
250 OMAP_PIN_INPUT_PULLDOWN);
251 break;
252 case OMAP_EHCI_PORT_MODE_TLL:
253 omap_mux_init_signal("usbb1_ulpitll_stp",
254 OMAP_PIN_INPUT_PULLUP);
255 omap_mux_init_signal("usbb1_ulpitll_clk",
256 OMAP_PIN_INPUT_PULLDOWN);
257 omap_mux_init_signal("usbb1_ulpitll_dir",
258 OMAP_PIN_INPUT_PULLDOWN);
259 omap_mux_init_signal("usbb1_ulpitll_nxt",
260 OMAP_PIN_INPUT_PULLDOWN);
261 omap_mux_init_signal("usbb1_ulpitll_dat0",
262 OMAP_PIN_INPUT_PULLDOWN);
263 omap_mux_init_signal("usbb1_ulpitll_dat1",
264 OMAP_PIN_INPUT_PULLDOWN);
265 omap_mux_init_signal("usbb1_ulpitll_dat2",
266 OMAP_PIN_INPUT_PULLDOWN);
267 omap_mux_init_signal("usbb1_ulpitll_dat3",
268 OMAP_PIN_INPUT_PULLDOWN);
269 omap_mux_init_signal("usbb1_ulpitll_dat4",
270 OMAP_PIN_INPUT_PULLDOWN);
271 omap_mux_init_signal("usbb1_ulpitll_dat5",
272 OMAP_PIN_INPUT_PULLDOWN);
273 omap_mux_init_signal("usbb1_ulpitll_dat6",
274 OMAP_PIN_INPUT_PULLDOWN);
275 omap_mux_init_signal("usbb1_ulpitll_dat7",
276 OMAP_PIN_INPUT_PULLDOWN);
277 break;
278 case OMAP_USBHS_PORT_MODE_UNUSED:
279 default:
280 break;
281 }
282 switch (port_mode[1]) {
283 case OMAP_EHCI_PORT_MODE_PHY:
284 omap_mux_init_signal("usbb2_ulpiphy_stp",
285 OMAP_PIN_OUTPUT);
286 omap_mux_init_signal("usbb2_ulpiphy_clk",
287 OMAP_PIN_INPUT_PULLDOWN);
288 omap_mux_init_signal("usbb2_ulpiphy_dir",
289 OMAP_PIN_INPUT_PULLDOWN);
290 omap_mux_init_signal("usbb2_ulpiphy_nxt",
291 OMAP_PIN_INPUT_PULLDOWN);
292 omap_mux_init_signal("usbb2_ulpiphy_dat0",
293 OMAP_PIN_INPUT_PULLDOWN);
294 omap_mux_init_signal("usbb2_ulpiphy_dat1",
295 OMAP_PIN_INPUT_PULLDOWN);
296 omap_mux_init_signal("usbb2_ulpiphy_dat2",
297 OMAP_PIN_INPUT_PULLDOWN);
298 omap_mux_init_signal("usbb2_ulpiphy_dat3",
299 OMAP_PIN_INPUT_PULLDOWN);
300 omap_mux_init_signal("usbb2_ulpiphy_dat4",
301 OMAP_PIN_INPUT_PULLDOWN);
302 omap_mux_init_signal("usbb2_ulpiphy_dat5",
303 OMAP_PIN_INPUT_PULLDOWN);
304 omap_mux_init_signal("usbb2_ulpiphy_dat6",
305 OMAP_PIN_INPUT_PULLDOWN);
306 omap_mux_init_signal("usbb2_ulpiphy_dat7",
307 OMAP_PIN_INPUT_PULLDOWN);
308 break;
309 case OMAP_EHCI_PORT_MODE_TLL:
310 omap_mux_init_signal("usbb2_ulpitll_stp",
311 OMAP_PIN_INPUT_PULLUP);
312 omap_mux_init_signal("usbb2_ulpitll_clk",
313 OMAP_PIN_INPUT_PULLDOWN);
314 omap_mux_init_signal("usbb2_ulpitll_dir",
315 OMAP_PIN_INPUT_PULLDOWN);
316 omap_mux_init_signal("usbb2_ulpitll_nxt",
317 OMAP_PIN_INPUT_PULLDOWN);
318 omap_mux_init_signal("usbb2_ulpitll_dat0",
319 OMAP_PIN_INPUT_PULLDOWN);
320 omap_mux_init_signal("usbb2_ulpitll_dat1",
321 OMAP_PIN_INPUT_PULLDOWN);
322 omap_mux_init_signal("usbb2_ulpitll_dat2",
323 OMAP_PIN_INPUT_PULLDOWN);
324 omap_mux_init_signal("usbb2_ulpitll_dat3",
325 OMAP_PIN_INPUT_PULLDOWN);
326 omap_mux_init_signal("usbb2_ulpitll_dat4",
327 OMAP_PIN_INPUT_PULLDOWN);
328 omap_mux_init_signal("usbb2_ulpitll_dat5",
329 OMAP_PIN_INPUT_PULLDOWN);
330 omap_mux_init_signal("usbb2_ulpitll_dat6",
331 OMAP_PIN_INPUT_PULLDOWN);
332 omap_mux_init_signal("usbb2_ulpitll_dat7",
333 OMAP_PIN_INPUT_PULLDOWN);
334 break;
335 case OMAP_USBHS_PORT_MODE_UNUSED:
336 default:
337 break;
338 }
339 }
340
341 static void setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode)
342 {
343 switch (port_mode[0]) {
344 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
345 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM:
346 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0:
347 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM:
348 omap_mux_init_signal("mm1_rxdp",
349 OMAP_PIN_INPUT_PULLDOWN);
350 omap_mux_init_signal("mm1_rxdm",
351 OMAP_PIN_INPUT_PULLDOWN);
352 /* FALLTHROUGH */
353 case OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM:
354 case OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM:
355 omap_mux_init_signal("mm1_rxrcv",
356 OMAP_PIN_INPUT_PULLDOWN);
357 /* FALLTHROUGH */
358 case OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0:
359 case OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0:
360 omap_mux_init_signal("mm1_txen_n", OMAP_PIN_OUTPUT);
361 /* FALLTHROUGH */
362 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0:
363 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM:
364 omap_mux_init_signal("mm1_txse0",
365 OMAP_PIN_INPUT_PULLDOWN);
366 omap_mux_init_signal("mm1_txdat",
367 OMAP_PIN_INPUT_PULLDOWN);
368 break;
369 case OMAP_USBHS_PORT_MODE_UNUSED:
370 /* FALLTHROUGH */
371 default:
372 break;
373 }
374 switch (port_mode[1]) {
375 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
376 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM:
377 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0:
378 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM:
379 omap_mux_init_signal("mm2_rxdp",
380 OMAP_PIN_INPUT_PULLDOWN);
381 omap_mux_init_signal("mm2_rxdm",
382 OMAP_PIN_INPUT_PULLDOWN);
383 /* FALLTHROUGH */
384 case OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM:
385 case OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM:
386 omap_mux_init_signal("mm2_rxrcv",
387 OMAP_PIN_INPUT_PULLDOWN);
388 /* FALLTHROUGH */
389 case OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0:
390 case OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0:
391 omap_mux_init_signal("mm2_txen_n", OMAP_PIN_OUTPUT);
392 /* FALLTHROUGH */
393 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0:
394 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM:
395 omap_mux_init_signal("mm2_txse0",
396 OMAP_PIN_INPUT_PULLDOWN);
397 omap_mux_init_signal("mm2_txdat",
398 OMAP_PIN_INPUT_PULLDOWN);
399 break;
400 case OMAP_USBHS_PORT_MODE_UNUSED:
401 /* FALLTHROUGH */
402 default:
403 break;
404 }
405 switch (port_mode[2]) {
406 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
407 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM:
408 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0:
409 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM:
410 omap_mux_init_signal("mm3_rxdp",
411 OMAP_PIN_INPUT_PULLDOWN);
412 omap_mux_init_signal("mm3_rxdm",
413 OMAP_PIN_INPUT_PULLDOWN);
414 /* FALLTHROUGH */
415 case OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM:
416 case OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM:
417 omap_mux_init_signal("mm3_rxrcv",
418 OMAP_PIN_INPUT_PULLDOWN);
419 /* FALLTHROUGH */
420 case OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0:
421 case OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0:
422 omap_mux_init_signal("mm3_txen_n", OMAP_PIN_OUTPUT);
423 /* FALLTHROUGH */
424 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0:
425 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM:
426 omap_mux_init_signal("mm3_txse0",
427 OMAP_PIN_INPUT_PULLDOWN);
428 omap_mux_init_signal("mm3_txdat",
429 OMAP_PIN_INPUT_PULLDOWN);
430 break;
431 case OMAP_USBHS_PORT_MODE_UNUSED:
432 /* FALLTHROUGH */
433 default:
434 break;
435 }
436 }
437
438 static void setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode)
439 {
440 switch (port_mode[0]) {
441 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
442 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM:
443 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0:
444 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM:
445 omap_mux_init_signal("usbb1_mm_rxdp",
446 OMAP_PIN_INPUT_PULLDOWN);
447 omap_mux_init_signal("usbb1_mm_rxdm",
448 OMAP_PIN_INPUT_PULLDOWN);
449
450 case OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM:
451 case OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM:
452 omap_mux_init_signal("usbb1_mm_rxrcv",
453 OMAP_PIN_INPUT_PULLDOWN);
454
455 case OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0:
456 case OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0:
457 omap_mux_init_signal("usbb1_mm_txen",
458 OMAP_PIN_INPUT_PULLDOWN);
459
460
461 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0:
462 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM:
463 omap_mux_init_signal("usbb1_mm_txdat",
464 OMAP_PIN_INPUT_PULLDOWN);
465 omap_mux_init_signal("usbb1_mm_txse0",
466 OMAP_PIN_INPUT_PULLDOWN);
467 break;
468
469 case OMAP_USBHS_PORT_MODE_UNUSED:
470 default:
471 break;
472 }
473
474 switch (port_mode[1]) {
475 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
476 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM:
477 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0:
478 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM:
479 omap_mux_init_signal("usbb2_mm_rxdp",
480 OMAP_PIN_INPUT_PULLDOWN);
481 omap_mux_init_signal("usbb2_mm_rxdm",
482 OMAP_PIN_INPUT_PULLDOWN);
483
484 case OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM:
485 case OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM:
486 omap_mux_init_signal("usbb2_mm_rxrcv",
487 OMAP_PIN_INPUT_PULLDOWN);
488
489 case OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0:
490 case OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0:
491 omap_mux_init_signal("usbb2_mm_txen",
492 OMAP_PIN_INPUT_PULLDOWN);
493
494
495 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0:
496 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM:
497 omap_mux_init_signal("usbb2_mm_txdat",
498 OMAP_PIN_INPUT_PULLDOWN);
499 omap_mux_init_signal("usbb2_mm_txse0",
500 OMAP_PIN_INPUT_PULLDOWN);
501 break;
502
503 case OMAP_USBHS_PORT_MODE_UNUSED:
504 default:
505 break;
506 }
507 }
508
509 void __init usbhs_init(const struct usbhs_omap_board_data *pdata)
510 {
511 int i;
512
513 for (i = 0; i < OMAP3_HS_USB_PORTS; i++) {
514 usbhs_data.port_mode[i] = pdata->port_mode[i];
515 ohci_data.port_mode[i] = pdata->port_mode[i];
516 ehci_data.port_mode[i] = pdata->port_mode[i];
517 ehci_data.reset_gpio_port[i] = pdata->reset_gpio_port[i];
518 ehci_data.regulator[i] = pdata->regulator[i];
519 }
520 ehci_data.phy_reset = pdata->phy_reset;
521 ohci_data.es2_compatibility = pdata->es2_compatibility;
522 usbhs_data.ehci_data = &ehci_data;
523 usbhs_data.ohci_data = &ohci_data;
524
525 if (cpu_is_omap34xx()) {
526 usbhs_resources[0].start = OMAP34XX_UHH_CONFIG_BASE;
527 usbhs_resources[0].end = OMAP34XX_UHH_CONFIG_BASE + SZ_1K - 1;
528 usbhs_resources[1].start = OMAP34XX_USBTLL_BASE;
529 usbhs_resources[1].end = OMAP34XX_USBTLL_BASE + SZ_4K - 1;
530 usbhs_resources[2].start = OMAP34XX_EHCI_BASE;
531 usbhs_resources[2].end = OMAP34XX_EHCI_BASE + SZ_1K - 1;
532 usbhs_resources[3].start = INT_34XX_EHCI_IRQ;
533 usbhs_resources[4].start = OMAP34XX_OHCI_BASE;
534 usbhs_resources[4].end = OMAP34XX_OHCI_BASE + SZ_1K - 1;
535 usbhs_resources[5].start = INT_34XX_OHCI_IRQ;
536 setup_ehci_io_mux(pdata->port_mode);
537 setup_ohci_io_mux(pdata->port_mode);
538 } else if (cpu_is_omap44xx()) {
539 usbhs_resources[0].start = OMAP44XX_UHH_CONFIG_BASE;
540 usbhs_resources[0].end = OMAP44XX_UHH_CONFIG_BASE + SZ_1K - 1;
541 usbhs_resources[1].start = OMAP44XX_USBTLL_BASE;
542 usbhs_resources[1].end = OMAP44XX_USBTLL_BASE + SZ_4K - 1;
543 usbhs_resources[2].start = OMAP44XX_HSUSB_EHCI_BASE;
544 usbhs_resources[2].end = OMAP44XX_HSUSB_EHCI_BASE + SZ_1K - 1;
545 usbhs_resources[3].start = OMAP44XX_IRQ_EHCI;
546 usbhs_resources[4].start = OMAP44XX_HSUSB_OHCI_BASE;
547 usbhs_resources[4].end = OMAP44XX_HSUSB_OHCI_BASE + SZ_1K - 1;
548 usbhs_resources[5].start = OMAP44XX_IRQ_OHCI;
549 setup_4430ehci_io_mux(pdata->port_mode);
550 setup_4430ohci_io_mux(pdata->port_mode);
551 }
552
553 if (platform_device_add_data(&usbhs_device,
554 &usbhs_data, sizeof(usbhs_data)) < 0) {
555 printk(KERN_ERR "USBHS platform_device_add_data failed\n");
556 goto init_end;
557 }
558
559 if (platform_device_register(&usbhs_device) < 0)
560 printk(KERN_ERR "USBHS platform_device_register failed\n");
561
562 init_end:
563 return;
564 }
565
566 #else
567
568 void __init usbhs_init(const struct usbhs_omap_board_data *pdata)
569 {
570 }
571
572 #endif
573
574
This page took 0.042146 seconds and 5 git commands to generate.