Merge branch 'for-linus' of git://www.jni.nu/cris
[pandora-kernel.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