diff options
Diffstat (limited to 'arch/arm/mach-omap2/usb-musb.c')
-rw-r--r-- | arch/arm/mach-omap2/usb-musb.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c new file mode 100644 index 000000000000..34a56a136efd --- /dev/null +++ b/arch/arm/mach-omap2/usb-musb.c | |||
@@ -0,0 +1,187 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-omap2/usb-musb.c | ||
3 | * | ||
4 | * This file will contain the board specific details for the | ||
5 | * MENTOR USB OTG controller on OMAP3430 | ||
6 | * | ||
7 | * Copyright (C) 2007-2008 Texas Instruments | ||
8 | * Copyright (C) 2008 Nokia Corporation | ||
9 | * Author: Vikram Pandita | ||
10 | * | ||
11 | * Generalization by: | ||
12 | * Felipe Balbi <felipe.balbi@nokia.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/clk.h> | ||
24 | #include <linux/dma-mapping.h> | ||
25 | #include <linux/io.h> | ||
26 | |||
27 | #include <linux/usb/musb.h> | ||
28 | |||
29 | #include <mach/hardware.h> | ||
30 | #include <mach/irqs.h> | ||
31 | #include <mach/pm.h> | ||
32 | #include <mach/mux.h> | ||
33 | #include <mach/usb.h> | ||
34 | |||
35 | static struct resource musb_resources[] = { | ||
36 | [0] = { /* start and end set dynamically */ | ||
37 | .flags = IORESOURCE_MEM, | ||
38 | }, | ||
39 | [1] = { /* general IRQ */ | ||
40 | .start = INT_243X_HS_USB_MC, | ||
41 | .flags = IORESOURCE_IRQ, | ||
42 | }, | ||
43 | [2] = { /* DMA IRQ */ | ||
44 | .start = INT_243X_HS_USB_DMA, | ||
45 | .flags = IORESOURCE_IRQ, | ||
46 | }, | ||
47 | }; | ||
48 | |||
49 | static int clk_on; | ||
50 | |||
51 | static int musb_set_clock(struct clk *clk, int state) | ||
52 | { | ||
53 | if (state) { | ||
54 | if (clk_on > 0) | ||
55 | return -ENODEV; | ||
56 | |||
57 | clk_enable(clk); | ||
58 | clk_on = 1; | ||
59 | } else { | ||
60 | if (clk_on == 0) | ||
61 | return -ENODEV; | ||
62 | |||
63 | clk_disable(clk); | ||
64 | clk_on = 0; | ||
65 | } | ||
66 | |||
67 | return 0; | ||
68 | } | ||
69 | |||
70 | static struct musb_hdrc_eps_bits musb_eps[] = { | ||
71 | { "ep1_tx", 10, }, | ||
72 | { "ep1_rx", 10, }, | ||
73 | { "ep2_tx", 9, }, | ||
74 | { "ep2_rx", 9, }, | ||
75 | { "ep3_tx", 3, }, | ||
76 | { "ep3_rx", 3, }, | ||
77 | { "ep4_tx", 3, }, | ||
78 | { "ep4_rx", 3, }, | ||
79 | { "ep5_tx", 3, }, | ||
80 | { "ep5_rx", 3, }, | ||
81 | { "ep6_tx", 3, }, | ||
82 | { "ep6_rx", 3, }, | ||
83 | { "ep7_tx", 3, }, | ||
84 | { "ep7_rx", 3, }, | ||
85 | { "ep8_tx", 2, }, | ||
86 | { "ep8_rx", 2, }, | ||
87 | { "ep9_tx", 2, }, | ||
88 | { "ep9_rx", 2, }, | ||
89 | { "ep10_tx", 2, }, | ||
90 | { "ep10_rx", 2, }, | ||
91 | { "ep11_tx", 2, }, | ||
92 | { "ep11_rx", 2, }, | ||
93 | { "ep12_tx", 2, }, | ||
94 | { "ep12_rx", 2, }, | ||
95 | { "ep13_tx", 2, }, | ||
96 | { "ep13_rx", 2, }, | ||
97 | { "ep14_tx", 2, }, | ||
98 | { "ep14_rx", 2, }, | ||
99 | { "ep15_tx", 2, }, | ||
100 | { "ep15_rx", 2, }, | ||
101 | }; | ||
102 | |||
103 | static struct musb_hdrc_config musb_config = { | ||
104 | .multipoint = 1, | ||
105 | .dyn_fifo = 1, | ||
106 | .soft_con = 1, | ||
107 | .dma = 1, | ||
108 | .num_eps = 16, | ||
109 | .dma_channels = 7, | ||
110 | .dma_req_chan = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3), | ||
111 | .ram_bits = 12, | ||
112 | .eps_bits = musb_eps, | ||
113 | }; | ||
114 | |||
115 | static struct musb_hdrc_platform_data musb_plat = { | ||
116 | #ifdef CONFIG_USB_MUSB_OTG | ||
117 | .mode = MUSB_OTG, | ||
118 | #elif defined(CONFIG_USB_MUSB_HDRC_HCD) | ||
119 | .mode = MUSB_HOST, | ||
120 | #elif defined(CONFIG_USB_GADGET_MUSB_HDRC) | ||
121 | .mode = MUSB_PERIPHERAL, | ||
122 | #endif | ||
123 | /* .clock is set dynamically */ | ||
124 | .set_clock = musb_set_clock, | ||
125 | .config = &musb_config, | ||
126 | |||
127 | /* REVISIT charge pump on TWL4030 can supply up to | ||
128 | * 100 mA ... but this value is board-specific, like | ||
129 | * "mode", and should be passed to usb_musb_init(). | ||
130 | */ | ||
131 | .power = 50, /* up to 100 mA */ | ||
132 | }; | ||
133 | |||
134 | static u64 musb_dmamask = DMA_BIT_MASK(32); | ||
135 | |||
136 | static struct platform_device musb_device = { | ||
137 | .name = "musb_hdrc", | ||
138 | .id = -1, | ||
139 | .dev = { | ||
140 | .dma_mask = &musb_dmamask, | ||
141 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
142 | .platform_data = &musb_plat, | ||
143 | }, | ||
144 | .num_resources = ARRAY_SIZE(musb_resources), | ||
145 | .resource = musb_resources, | ||
146 | }; | ||
147 | |||
148 | #ifdef CONFIG_NOP_USB_XCEIV | ||
149 | static u64 nop_xceiv_dmamask = DMA_BIT_MASK(32); | ||
150 | |||
151 | static struct platform_device nop_xceiv_device = { | ||
152 | .name = "nop_usb_xceiv", | ||
153 | .id = -1, | ||
154 | .dev = { | ||
155 | .dma_mask = &nop_xceiv_dmamask, | ||
156 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
157 | .platform_data = NULL, | ||
158 | }, | ||
159 | }; | ||
160 | #endif | ||
161 | |||
162 | void __init usb_musb_init(void) | ||
163 | { | ||
164 | if (cpu_is_omap243x()) | ||
165 | musb_resources[0].start = OMAP243X_HS_BASE; | ||
166 | else | ||
167 | musb_resources[0].start = OMAP34XX_HSUSB_OTG_BASE; | ||
168 | musb_resources[0].end = musb_resources[0].start + SZ_8K - 1; | ||
169 | |||
170 | /* | ||
171 | * REVISIT: This line can be removed once all the platforms using | ||
172 | * musb_core.c have been converted to use use clkdev. | ||
173 | */ | ||
174 | musb_plat.clock = "ick"; | ||
175 | |||
176 | #ifdef CONFIG_NOP_USB_XCEIV | ||
177 | if (platform_device_register(&nop_xceiv_device) < 0) { | ||
178 | printk(KERN_ERR "Unable to register NOP-XCEIV device\n"); | ||
179 | return; | ||
180 | } | ||
181 | #endif | ||
182 | |||
183 | if (platform_device_register(&musb_device) < 0) { | ||
184 | printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n"); | ||
185 | return; | ||
186 | } | ||
187 | } | ||