aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/usb-host.c
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-03-25 11:41:20 -0400
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-03-25 11:41:20 -0400
commit7bf7e370d5919112c223a269462cd0b546903829 (patch)
tree03ccc715239df14ae168277dbccc9d9cf4d8a2c8 /arch/arm/mach-omap2/usb-host.c
parent68b1a1e786f29c900fa1c516a402e24f0ece622a (diff)
parentd39dd11c3e6a7af5c20bfac40594db36cf270f42 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 into for-linus-1
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6: (9356 commits) [media] rc: update for bitop name changes fs: simplify iget & friends fs: pull inode->i_lock up out of writeback_single_inode fs: rename inode_lock to inode_hash_lock fs: move i_wb_list out from under inode_lock fs: move i_sb_list out from under inode_lock fs: remove inode_lock from iput_final and prune_icache fs: Lock the inode LRU list separately fs: factor inode disposal fs: protect inode->i_state with inode->i_lock lib, arch: add filter argument to show_mem and fix private implementations SLUB: Write to per cpu data when allocating it slub: Fix debugobjects with lockless fastpath autofs4: Do not potentially dereference NULL pointer returned by fget() in autofs_dev_ioctl_setpipefd() autofs4 - remove autofs4_lock autofs4 - fix d_manage() return on rcu-walk autofs4 - fix autofs4_expire_indirect() traversal autofs4 - fix dentry leak in autofs4_expire_direct() autofs4 - reinstate last used update on access vfs - check non-mountpoint dentry might block in __follow_mount_rcu() ... NOTE! This merge commit was created to fix compilation error. The block tree was merged upstream and removed the 'elv_queue_empty()' function which the new 'mtdswap' driver is using. So a simple merge of the mtd tree with upstream does not compile. And the mtd tree has already be published, so re-basing it is not an option. To fix this unfortunate situation, I had to merge upstream into the mtd-2.6.git tree without committing, put the fixup patch on top of this, and then commit this. The result is that we do not have commits which do not compile. In other words, this merge commit "merges" 3 things: the MTD tree, the upstream tree, and the fixup patch.
Diffstat (limited to 'arch/arm/mach-omap2/usb-host.c')
-rw-r--r--arch/arm/mach-omap2/usb-host.c574
1 files changed, 574 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c
new file mode 100644
index 000000000000..89ae29847c59
--- /dev/null
+++ b/arch/arm/mach-omap2/usb-host.c
@@ -0,0 +1,574 @@
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
38static 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
65static 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
72static struct usbhs_omap_platform_data usbhs_data;
73static struct ehci_hcd_omap_platform_data ehci_data;
74static 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 */
80static 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
223static 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
341static 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
438static 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
509void __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
562init_end:
563 return;
564}
565
566#else
567
568void __init usbhs_init(const struct usbhs_omap_board_data *pdata)
569{
570}
571
572#endif
573
574