diff options
Diffstat (limited to 'arch/sh/kernel/cpu/sh2a/setup-sh7206.c')
-rw-r--r-- | arch/sh/kernel/cpu/sh2a/setup-sh7206.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7206.c b/arch/sh/kernel/cpu/sh2a/setup-sh7206.c index c46a8355726d..2fc6bff5c5fb 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-sh7206.c +++ b/arch/sh/kernel/cpu/sh2a/setup-sh7206.c | |||
@@ -12,6 +12,8 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/serial.h> | 13 | #include <linux/serial.h> |
14 | #include <linux/serial_sci.h> | 14 | #include <linux/serial_sci.h> |
15 | #include <linux/sh_timer.h> | ||
16 | #include <linux/io.h> | ||
15 | 17 | ||
16 | enum { | 18 | enum { |
17 | UNUSED = 0, | 19 | UNUSED = 0, |
@@ -165,8 +167,170 @@ static struct platform_device sci_device = { | |||
165 | }, | 167 | }, |
166 | }; | 168 | }; |
167 | 169 | ||
170 | static struct sh_timer_config cmt0_platform_data = { | ||
171 | .name = "CMT0", | ||
172 | .channel_offset = 0x02, | ||
173 | .timer_bit = 0, | ||
174 | .clk = "module_clk", | ||
175 | .clockevent_rating = 125, | ||
176 | .clocksource_rating = 0, /* disabled due to code generation issues */ | ||
177 | }; | ||
178 | |||
179 | static struct resource cmt0_resources[] = { | ||
180 | [0] = { | ||
181 | .name = "CMT0", | ||
182 | .start = 0xfffec002, | ||
183 | .end = 0xfffec007, | ||
184 | .flags = IORESOURCE_MEM, | ||
185 | }, | ||
186 | [1] = { | ||
187 | .start = 140, | ||
188 | .flags = IORESOURCE_IRQ, | ||
189 | }, | ||
190 | }; | ||
191 | |||
192 | static struct platform_device cmt0_device = { | ||
193 | .name = "sh_cmt", | ||
194 | .id = 0, | ||
195 | .dev = { | ||
196 | .platform_data = &cmt0_platform_data, | ||
197 | }, | ||
198 | .resource = cmt0_resources, | ||
199 | .num_resources = ARRAY_SIZE(cmt0_resources), | ||
200 | }; | ||
201 | |||
202 | static struct sh_timer_config cmt1_platform_data = { | ||
203 | .name = "CMT1", | ||
204 | .channel_offset = 0x08, | ||
205 | .timer_bit = 1, | ||
206 | .clk = "module_clk", | ||
207 | .clockevent_rating = 125, | ||
208 | .clocksource_rating = 0, /* disabled due to code generation issues */ | ||
209 | }; | ||
210 | |||
211 | static struct resource cmt1_resources[] = { | ||
212 | [0] = { | ||
213 | .name = "CMT1", | ||
214 | .start = 0xfffec008, | ||
215 | .end = 0xfffec00d, | ||
216 | .flags = IORESOURCE_MEM, | ||
217 | }, | ||
218 | [1] = { | ||
219 | .start = 144, | ||
220 | .flags = IORESOURCE_IRQ, | ||
221 | }, | ||
222 | }; | ||
223 | |||
224 | static struct platform_device cmt1_device = { | ||
225 | .name = "sh_cmt", | ||
226 | .id = 1, | ||
227 | .dev = { | ||
228 | .platform_data = &cmt1_platform_data, | ||
229 | }, | ||
230 | .resource = cmt1_resources, | ||
231 | .num_resources = ARRAY_SIZE(cmt1_resources), | ||
232 | }; | ||
233 | |||
234 | static struct sh_timer_config mtu2_0_platform_data = { | ||
235 | .name = "MTU2_0", | ||
236 | .channel_offset = -0x80, | ||
237 | .timer_bit = 0, | ||
238 | .clk = "module_clk", | ||
239 | .clockevent_rating = 200, | ||
240 | }; | ||
241 | |||
242 | static struct resource mtu2_0_resources[] = { | ||
243 | [0] = { | ||
244 | .name = "MTU2_0", | ||
245 | .start = 0xfffe4300, | ||
246 | .end = 0xfffe4326, | ||
247 | .flags = IORESOURCE_MEM, | ||
248 | }, | ||
249 | [1] = { | ||
250 | .start = 156, | ||
251 | .flags = IORESOURCE_IRQ, | ||
252 | }, | ||
253 | }; | ||
254 | |||
255 | static struct platform_device mtu2_0_device = { | ||
256 | .name = "sh_mtu2", | ||
257 | .id = 0, | ||
258 | .dev = { | ||
259 | .platform_data = &mtu2_0_platform_data, | ||
260 | }, | ||
261 | .resource = mtu2_0_resources, | ||
262 | .num_resources = ARRAY_SIZE(mtu2_0_resources), | ||
263 | }; | ||
264 | |||
265 | static struct sh_timer_config mtu2_1_platform_data = { | ||
266 | .name = "MTU2_1", | ||
267 | .channel_offset = -0x100, | ||
268 | .timer_bit = 1, | ||
269 | .clk = "module_clk", | ||
270 | .clockevent_rating = 200, | ||
271 | }; | ||
272 | |||
273 | static struct resource mtu2_1_resources[] = { | ||
274 | [0] = { | ||
275 | .name = "MTU2_1", | ||
276 | .start = 0xfffe4380, | ||
277 | .end = 0xfffe4390, | ||
278 | .flags = IORESOURCE_MEM, | ||
279 | }, | ||
280 | [1] = { | ||
281 | .start = 164, | ||
282 | .flags = IORESOURCE_IRQ, | ||
283 | }, | ||
284 | }; | ||
285 | |||
286 | static struct platform_device mtu2_1_device = { | ||
287 | .name = "sh_mtu2", | ||
288 | .id = 1, | ||
289 | .dev = { | ||
290 | .platform_data = &mtu2_1_platform_data, | ||
291 | }, | ||
292 | .resource = mtu2_1_resources, | ||
293 | .num_resources = ARRAY_SIZE(mtu2_1_resources), | ||
294 | }; | ||
295 | |||
296 | static struct sh_timer_config mtu2_2_platform_data = { | ||
297 | .name = "MTU2_2", | ||
298 | .channel_offset = 0x80, | ||
299 | .timer_bit = 2, | ||
300 | .clk = "module_clk", | ||
301 | .clockevent_rating = 200, | ||
302 | }; | ||
303 | |||
304 | static struct resource mtu2_2_resources[] = { | ||
305 | [0] = { | ||
306 | .name = "MTU2_2", | ||
307 | .start = 0xfffe4000, | ||
308 | .end = 0xfffe400a, | ||
309 | .flags = IORESOURCE_MEM, | ||
310 | }, | ||
311 | [1] = { | ||
312 | .start = 180, | ||
313 | .flags = IORESOURCE_IRQ, | ||
314 | }, | ||
315 | }; | ||
316 | |||
317 | static struct platform_device mtu2_2_device = { | ||
318 | .name = "sh_mtu2", | ||
319 | .id = 2, | ||
320 | .dev = { | ||
321 | .platform_data = &mtu2_2_platform_data, | ||
322 | }, | ||
323 | .resource = mtu2_2_resources, | ||
324 | .num_resources = ARRAY_SIZE(mtu2_2_resources), | ||
325 | }; | ||
326 | |||
168 | static struct platform_device *sh7206_devices[] __initdata = { | 327 | static struct platform_device *sh7206_devices[] __initdata = { |
169 | &sci_device, | 328 | &sci_device, |
329 | &cmt0_device, | ||
330 | &cmt1_device, | ||
331 | &mtu2_0_device, | ||
332 | &mtu2_1_device, | ||
333 | &mtu2_2_device, | ||
170 | }; | 334 | }; |
171 | 335 | ||
172 | static int __init sh7206_devices_setup(void) | 336 | static int __init sh7206_devices_setup(void) |
@@ -180,3 +344,26 @@ void __init plat_irq_setup(void) | |||
180 | { | 344 | { |
181 | register_intc_controller(&intc_desc); | 345 | register_intc_controller(&intc_desc); |
182 | } | 346 | } |
347 | |||
348 | static struct platform_device *sh7206_early_devices[] __initdata = { | ||
349 | &cmt0_device, | ||
350 | &cmt1_device, | ||
351 | &mtu2_0_device, | ||
352 | &mtu2_1_device, | ||
353 | &mtu2_2_device, | ||
354 | }; | ||
355 | |||
356 | #define STBCR3 0xfffe0408 | ||
357 | #define STBCR4 0xfffe040c | ||
358 | |||
359 | void __init plat_early_device_setup(void) | ||
360 | { | ||
361 | /* enable CMT clock */ | ||
362 | __raw_writeb(__raw_readb(STBCR4) & ~0x04, STBCR4); | ||
363 | |||
364 | /* enable MTU2 clock */ | ||
365 | __raw_writeb(__raw_readb(STBCR3) & ~0x20, STBCR3); | ||
366 | |||
367 | early_platform_add_devices(sh7206_early_devices, | ||
368 | ARRAY_SIZE(sh7206_early_devices)); | ||
369 | } | ||