diff options
Diffstat (limited to 'arch')
84 files changed, 1879 insertions, 2940 deletions
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index f49ce85d2448..312ea6b0409d 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c | |||
@@ -138,7 +138,7 @@ void ams_delta_latch2_write(u16 mask, u16 value) | |||
138 | static void __init ams_delta_init_irq(void) | 138 | static void __init ams_delta_init_irq(void) |
139 | { | 139 | { |
140 | omap1_init_common_hw(); | 140 | omap1_init_common_hw(); |
141 | omap_init_irq(); | 141 | omap1_init_irq(); |
142 | } | 142 | } |
143 | 143 | ||
144 | static struct map_desc ams_delta_io_desc[] __initdata = { | 144 | static struct map_desc ams_delta_io_desc[] __initdata = { |
@@ -391,7 +391,7 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)") | |||
391 | .reserve = omap_reserve, | 391 | .reserve = omap_reserve, |
392 | .init_irq = ams_delta_init_irq, | 392 | .init_irq = ams_delta_init_irq, |
393 | .init_machine = ams_delta_init, | 393 | .init_machine = ams_delta_init, |
394 | .timer = &omap_timer, | 394 | .timer = &omap1_timer, |
395 | MACHINE_END | 395 | MACHINE_END |
396 | 396 | ||
397 | EXPORT_SYMBOL(ams_delta_latch1_write); | 397 | EXPORT_SYMBOL(ams_delta_latch1_write); |
diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c index 87f173d93557..a6b1bea50371 100644 --- a/arch/arm/mach-omap1/board-fsample.c +++ b/arch/arm/mach-omap1/board-fsample.c | |||
@@ -329,7 +329,7 @@ static void __init omap_fsample_init(void) | |||
329 | static void __init omap_fsample_init_irq(void) | 329 | static void __init omap_fsample_init_irq(void) |
330 | { | 330 | { |
331 | omap1_init_common_hw(); | 331 | omap1_init_common_hw(); |
332 | omap_init_irq(); | 332 | omap1_init_irq(); |
333 | } | 333 | } |
334 | 334 | ||
335 | /* Only FPGA needs to be mapped here. All others are done with ioremap */ | 335 | /* Only FPGA needs to be mapped here. All others are done with ioremap */ |
@@ -394,5 +394,5 @@ MACHINE_START(OMAP_FSAMPLE, "OMAP730 F-Sample") | |||
394 | .reserve = omap_reserve, | 394 | .reserve = omap_reserve, |
395 | .init_irq = omap_fsample_init_irq, | 395 | .init_irq = omap_fsample_init_irq, |
396 | .init_machine = omap_fsample_init, | 396 | .init_machine = omap_fsample_init, |
397 | .timer = &omap_timer, | 397 | .timer = &omap1_timer, |
398 | MACHINE_END | 398 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index 23f4ab9e2651..04fc356c40fa 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c | |||
@@ -31,7 +31,7 @@ | |||
31 | static void __init omap_generic_init_irq(void) | 31 | static void __init omap_generic_init_irq(void) |
32 | { | 32 | { |
33 | omap1_init_common_hw(); | 33 | omap1_init_common_hw(); |
34 | omap_init_irq(); | 34 | omap1_init_irq(); |
35 | } | 35 | } |
36 | 36 | ||
37 | /* assume no Mini-AB port */ | 37 | /* assume no Mini-AB port */ |
@@ -99,5 +99,5 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710") | |||
99 | .reserve = omap_reserve, | 99 | .reserve = omap_reserve, |
100 | .init_irq = omap_generic_init_irq, | 100 | .init_irq = omap_generic_init_irq, |
101 | .init_machine = omap_generic_init, | 101 | .init_machine = omap_generic_init, |
102 | .timer = &omap_timer, | 102 | .timer = &omap1_timer, |
103 | MACHINE_END | 103 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index ba3bd09c4754..cb7fb1aa3dca 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c | |||
@@ -376,7 +376,7 @@ static struct i2c_board_info __initdata h2_i2c_board_info[] = { | |||
376 | static void __init h2_init_irq(void) | 376 | static void __init h2_init_irq(void) |
377 | { | 377 | { |
378 | omap1_init_common_hw(); | 378 | omap1_init_common_hw(); |
379 | omap_init_irq(); | 379 | omap1_init_irq(); |
380 | } | 380 | } |
381 | 381 | ||
382 | static struct omap_usb_config h2_usb_config __initdata = { | 382 | static struct omap_usb_config h2_usb_config __initdata = { |
@@ -466,5 +466,5 @@ MACHINE_START(OMAP_H2, "TI-H2") | |||
466 | .reserve = omap_reserve, | 466 | .reserve = omap_reserve, |
467 | .init_irq = h2_init_irq, | 467 | .init_irq = h2_init_irq, |
468 | .init_machine = h2_init, | 468 | .init_machine = h2_init, |
469 | .timer = &omap_timer, | 469 | .timer = &omap1_timer, |
470 | MACHINE_END | 470 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index ac48677672ee..31f34875ffad 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c | |||
@@ -439,7 +439,7 @@ static void __init h3_init(void) | |||
439 | static void __init h3_init_irq(void) | 439 | static void __init h3_init_irq(void) |
440 | { | 440 | { |
441 | omap1_init_common_hw(); | 441 | omap1_init_common_hw(); |
442 | omap_init_irq(); | 442 | omap1_init_irq(); |
443 | } | 443 | } |
444 | 444 | ||
445 | static void __init h3_map_io(void) | 445 | static void __init h3_map_io(void) |
@@ -454,5 +454,5 @@ MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board") | |||
454 | .reserve = omap_reserve, | 454 | .reserve = omap_reserve, |
455 | .init_irq = h3_init_irq, | 455 | .init_irq = h3_init_irq, |
456 | .init_machine = h3_init, | 456 | .init_machine = h3_init, |
457 | .timer = &omap_timer, | 457 | .timer = &omap1_timer, |
458 | MACHINE_END | 458 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c index ba05a51f9408..36e06ea7ec65 100644 --- a/arch/arm/mach-omap1/board-htcherald.c +++ b/arch/arm/mach-omap1/board-htcherald.c | |||
@@ -605,7 +605,7 @@ static void __init htcherald_init_irq(void) | |||
605 | { | 605 | { |
606 | printk(KERN_INFO "htcherald_init_irq.\n"); | 606 | printk(KERN_INFO "htcherald_init_irq.\n"); |
607 | omap1_init_common_hw(); | 607 | omap1_init_common_hw(); |
608 | omap_init_irq(); | 608 | omap1_init_irq(); |
609 | } | 609 | } |
610 | 610 | ||
611 | MACHINE_START(HERALD, "HTC Herald") | 611 | MACHINE_START(HERALD, "HTC Herald") |
@@ -616,5 +616,5 @@ MACHINE_START(HERALD, "HTC Herald") | |||
616 | .reserve = omap_reserve, | 616 | .reserve = omap_reserve, |
617 | .init_irq = htcherald_init_irq, | 617 | .init_irq = htcherald_init_irq, |
618 | .init_machine = htcherald_init, | 618 | .init_machine = htcherald_init, |
619 | .timer = &omap_timer, | 619 | .timer = &omap1_timer, |
620 | MACHINE_END | 620 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 2d9b8cbd7a14..0b1ba462d388 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c | |||
@@ -292,7 +292,7 @@ static void __init innovator_init_smc91x(void) | |||
292 | static void __init innovator_init_irq(void) | 292 | static void __init innovator_init_irq(void) |
293 | { | 293 | { |
294 | omap1_init_common_hw(); | 294 | omap1_init_common_hw(); |
295 | omap_init_irq(); | 295 | omap1_init_irq(); |
296 | } | 296 | } |
297 | 297 | ||
298 | #ifdef CONFIG_ARCH_OMAP15XX | 298 | #ifdef CONFIG_ARCH_OMAP15XX |
@@ -464,5 +464,5 @@ MACHINE_START(OMAP_INNOVATOR, "TI-Innovator") | |||
464 | .reserve = omap_reserve, | 464 | .reserve = omap_reserve, |
465 | .init_irq = innovator_init_irq, | 465 | .init_irq = innovator_init_irq, |
466 | .init_machine = innovator_init, | 466 | .init_machine = innovator_init, |
467 | .timer = &omap_timer, | 467 | .timer = &omap1_timer, |
468 | MACHINE_END | 468 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index cfd084926146..5469ce247ffe 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
@@ -51,7 +51,7 @@ static void __init omap_nokia770_init_irq(void) | |||
51 | omap_writew((omap_readw(0xfffb5004) & ~2), 0xfffb5004); | 51 | omap_writew((omap_readw(0xfffb5004) & ~2), 0xfffb5004); |
52 | 52 | ||
53 | omap1_init_common_hw(); | 53 | omap1_init_common_hw(); |
54 | omap_init_irq(); | 54 | omap1_init_irq(); |
55 | } | 55 | } |
56 | 56 | ||
57 | static const unsigned int nokia770_keymap[] = { | 57 | static const unsigned int nokia770_keymap[] = { |
@@ -269,5 +269,5 @@ MACHINE_START(NOKIA770, "Nokia 770") | |||
269 | .reserve = omap_reserve, | 269 | .reserve = omap_reserve, |
270 | .init_irq = omap_nokia770_init_irq, | 270 | .init_irq = omap_nokia770_init_irq, |
271 | .init_machine = omap_nokia770_init, | 271 | .init_machine = omap_nokia770_init, |
272 | .timer = &omap_timer, | 272 | .timer = &omap1_timer, |
273 | MACHINE_END | 273 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index e68dfde1918e..b08a21380772 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c | |||
@@ -282,7 +282,7 @@ static void __init osk_init_cf(void) | |||
282 | static void __init osk_init_irq(void) | 282 | static void __init osk_init_irq(void) |
283 | { | 283 | { |
284 | omap1_init_common_hw(); | 284 | omap1_init_common_hw(); |
285 | omap_init_irq(); | 285 | omap1_init_irq(); |
286 | } | 286 | } |
287 | 287 | ||
288 | static struct omap_usb_config osk_usb_config __initdata = { | 288 | static struct omap_usb_config osk_usb_config __initdata = { |
@@ -588,5 +588,5 @@ MACHINE_START(OMAP_OSK, "TI-OSK") | |||
588 | .reserve = omap_reserve, | 588 | .reserve = omap_reserve, |
589 | .init_irq = osk_init_irq, | 589 | .init_irq = osk_init_irq, |
590 | .init_machine = osk_init, | 590 | .init_machine = osk_init, |
591 | .timer = &omap_timer, | 591 | .timer = &omap1_timer, |
592 | MACHINE_END | 592 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index c9d38f47845f..459cb6bfed55 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c | |||
@@ -62,7 +62,7 @@ | |||
62 | static void __init omap_palmte_init_irq(void) | 62 | static void __init omap_palmte_init_irq(void) |
63 | { | 63 | { |
64 | omap1_init_common_hw(); | 64 | omap1_init_common_hw(); |
65 | omap_init_irq(); | 65 | omap1_init_irq(); |
66 | } | 66 | } |
67 | 67 | ||
68 | static const unsigned int palmte_keymap[] = { | 68 | static const unsigned int palmte_keymap[] = { |
@@ -280,5 +280,5 @@ MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E") | |||
280 | .reserve = omap_reserve, | 280 | .reserve = omap_reserve, |
281 | .init_irq = omap_palmte_init_irq, | 281 | .init_irq = omap_palmte_init_irq, |
282 | .init_machine = omap_palmte_init, | 282 | .init_machine = omap_palmte_init, |
283 | .timer = &omap_timer, | 283 | .timer = &omap1_timer, |
284 | MACHINE_END | 284 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-palmtt.c b/arch/arm/mach-omap1/board-palmtt.c index f04f2d36e7d3..b214f45f646c 100644 --- a/arch/arm/mach-omap1/board-palmtt.c +++ b/arch/arm/mach-omap1/board-palmtt.c | |||
@@ -266,7 +266,7 @@ static struct spi_board_info __initdata palmtt_boardinfo[] = { | |||
266 | static void __init omap_palmtt_init_irq(void) | 266 | static void __init omap_palmtt_init_irq(void) |
267 | { | 267 | { |
268 | omap1_init_common_hw(); | 268 | omap1_init_common_hw(); |
269 | omap_init_irq(); | 269 | omap1_init_irq(); |
270 | } | 270 | } |
271 | 271 | ||
272 | static struct omap_usb_config palmtt_usb_config __initdata = { | 272 | static struct omap_usb_config palmtt_usb_config __initdata = { |
@@ -326,5 +326,5 @@ MACHINE_START(OMAP_PALMTT, "OMAP1510 based Palm Tungsten|T") | |||
326 | .reserve = omap_reserve, | 326 | .reserve = omap_reserve, |
327 | .init_irq = omap_palmtt_init_irq, | 327 | .init_irq = omap_palmtt_init_irq, |
328 | .init_machine = omap_palmtt_init, | 328 | .init_machine = omap_palmtt_init, |
329 | .timer = &omap_timer, | 329 | .timer = &omap1_timer, |
330 | MACHINE_END | 330 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index 45f01d2c3a7a..9b0ea48d35fd 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c | |||
@@ -61,7 +61,7 @@ static void __init | |||
61 | omap_palmz71_init_irq(void) | 61 | omap_palmz71_init_irq(void) |
62 | { | 62 | { |
63 | omap1_init_common_hw(); | 63 | omap1_init_common_hw(); |
64 | omap_init_irq(); | 64 | omap1_init_irq(); |
65 | } | 65 | } |
66 | 66 | ||
67 | static const unsigned int palmz71_keymap[] = { | 67 | static const unsigned int palmz71_keymap[] = { |
@@ -346,5 +346,5 @@ MACHINE_START(OMAP_PALMZ71, "OMAP310 based Palm Zire71") | |||
346 | .reserve = omap_reserve, | 346 | .reserve = omap_reserve, |
347 | .init_irq = omap_palmz71_init_irq, | 347 | .init_irq = omap_palmz71_init_irq, |
348 | .init_machine = omap_palmz71_init, | 348 | .init_machine = omap_palmz71_init, |
349 | .timer = &omap_timer, | 349 | .timer = &omap1_timer, |
350 | MACHINE_END | 350 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index 3c8ee8489458..67acd4142639 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c | |||
@@ -297,7 +297,7 @@ static void __init omap_perseus2_init(void) | |||
297 | static void __init omap_perseus2_init_irq(void) | 297 | static void __init omap_perseus2_init_irq(void) |
298 | { | 298 | { |
299 | omap1_init_common_hw(); | 299 | omap1_init_common_hw(); |
300 | omap_init_irq(); | 300 | omap1_init_irq(); |
301 | } | 301 | } |
302 | /* Only FPGA needs to be mapped here. All others are done with ioremap */ | 302 | /* Only FPGA needs to be mapped here. All others are done with ioremap */ |
303 | static struct map_desc omap_perseus2_io_desc[] __initdata = { | 303 | static struct map_desc omap_perseus2_io_desc[] __initdata = { |
@@ -355,5 +355,5 @@ MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2") | |||
355 | .reserve = omap_reserve, | 355 | .reserve = omap_reserve, |
356 | .init_irq = omap_perseus2_init_irq, | 356 | .init_irq = omap_perseus2_init_irq, |
357 | .init_machine = omap_perseus2_init, | 357 | .init_machine = omap_perseus2_init, |
358 | .timer = &omap_timer, | 358 | .timer = &omap1_timer, |
359 | MACHINE_END | 359 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index 0ad781db4e66..9c3b7c52d9cf 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c | |||
@@ -411,7 +411,7 @@ static void __init omap_sx1_init(void) | |||
411 | static void __init omap_sx1_init_irq(void) | 411 | static void __init omap_sx1_init_irq(void) |
412 | { | 412 | { |
413 | omap1_init_common_hw(); | 413 | omap1_init_common_hw(); |
414 | omap_init_irq(); | 414 | omap1_init_irq(); |
415 | } | 415 | } |
416 | /*----------------------------------------*/ | 416 | /*----------------------------------------*/ |
417 | 417 | ||
@@ -426,5 +426,5 @@ MACHINE_START(SX1, "OMAP310 based Siemens SX1") | |||
426 | .reserve = omap_reserve, | 426 | .reserve = omap_reserve, |
427 | .init_irq = omap_sx1_init_irq, | 427 | .init_irq = omap_sx1_init_irq, |
428 | .init_machine = omap_sx1_init, | 428 | .init_machine = omap_sx1_init, |
429 | .timer = &omap_timer, | 429 | .timer = &omap1_timer, |
430 | MACHINE_END | 430 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index 65d24204937a..036edc0ee9b6 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c | |||
@@ -162,7 +162,7 @@ static struct omap_board_config_kernel voiceblue_config[] = { | |||
162 | static void __init voiceblue_init_irq(void) | 162 | static void __init voiceblue_init_irq(void) |
163 | { | 163 | { |
164 | omap1_init_common_hw(); | 164 | omap1_init_common_hw(); |
165 | omap_init_irq(); | 165 | omap1_init_irq(); |
166 | } | 166 | } |
167 | 167 | ||
168 | static void __init voiceblue_map_io(void) | 168 | static void __init voiceblue_map_io(void) |
@@ -306,5 +306,5 @@ MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910") | |||
306 | .reserve = omap_reserve, | 306 | .reserve = omap_reserve, |
307 | .init_irq = voiceblue_init_irq, | 307 | .init_irq = voiceblue_init_irq, |
308 | .init_machine = voiceblue_init, | 308 | .init_machine = voiceblue_init, |
309 | .timer = &omap_timer, | 309 | .timer = &omap1_timer, |
310 | MACHINE_END | 310 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c index 5d3da7a63af3..e2b9c901ab67 100644 --- a/arch/arm/mach-omap1/irq.c +++ b/arch/arm/mach-omap1/irq.c | |||
@@ -175,7 +175,7 @@ static struct irq_chip omap_irq_chip = { | |||
175 | .irq_set_wake = omap_wake_irq, | 175 | .irq_set_wake = omap_wake_irq, |
176 | }; | 176 | }; |
177 | 177 | ||
178 | void __init omap_init_irq(void) | 178 | void __init omap1_init_irq(void) |
179 | { | 179 | { |
180 | int i, j; | 180 | int i, j; |
181 | 181 | ||
diff --git a/arch/arm/mach-omap1/mcbsp.c b/arch/arm/mach-omap1/mcbsp.c index d9af9811dedd..ab7395d84bc8 100644 --- a/arch/arm/mach-omap1/mcbsp.c +++ b/arch/arm/mach-omap1/mcbsp.c | |||
@@ -38,7 +38,7 @@ static void omap1_mcbsp_request(unsigned int id) | |||
38 | * On 1510, 1610 and 1710, McBSP1 and McBSP3 | 38 | * On 1510, 1610 and 1710, McBSP1 and McBSP3 |
39 | * are DSP public peripherals. | 39 | * are DSP public peripherals. |
40 | */ | 40 | */ |
41 | if (id == OMAP_MCBSP1 || id == OMAP_MCBSP3) { | 41 | if (id == 0 || id == 2) { |
42 | if (dsp_use++ == 0) { | 42 | if (dsp_use++ == 0) { |
43 | api_clk = clk_get(NULL, "api_ck"); | 43 | api_clk = clk_get(NULL, "api_ck"); |
44 | dsp_clk = clk_get(NULL, "dsp_ck"); | 44 | dsp_clk = clk_get(NULL, "dsp_ck"); |
@@ -59,7 +59,7 @@ static void omap1_mcbsp_request(unsigned int id) | |||
59 | 59 | ||
60 | static void omap1_mcbsp_free(unsigned int id) | 60 | static void omap1_mcbsp_free(unsigned int id) |
61 | { | 61 | { |
62 | if (id == OMAP_MCBSP1 || id == OMAP_MCBSP3) { | 62 | if (id == 0 || id == 2) { |
63 | if (--dsp_use == 0) { | 63 | if (--dsp_use == 0) { |
64 | if (!IS_ERR(api_clk)) { | 64 | if (!IS_ERR(api_clk)) { |
65 | clk_disable(api_clk); | 65 | clk_disable(api_clk); |
diff --git a/arch/arm/mach-omap1/time.c b/arch/arm/mach-omap1/time.c index 03e1e1062ad4..a1837771e031 100644 --- a/arch/arm/mach-omap1/time.c +++ b/arch/arm/mach-omap1/time.c | |||
@@ -297,7 +297,7 @@ static inline int omap_32k_timer_usable(void) | |||
297 | * Timer initialization | 297 | * Timer initialization |
298 | * --------------------------------------------------------------------------- | 298 | * --------------------------------------------------------------------------- |
299 | */ | 299 | */ |
300 | static void __init omap_timer_init(void) | 300 | static void __init omap1_timer_init(void) |
301 | { | 301 | { |
302 | if (omap_32k_timer_usable()) { | 302 | if (omap_32k_timer_usable()) { |
303 | preferred_sched_clock_init(1); | 303 | preferred_sched_clock_init(1); |
@@ -307,6 +307,6 @@ static void __init omap_timer_init(void) | |||
307 | } | 307 | } |
308 | } | 308 | } |
309 | 309 | ||
310 | struct sys_timer omap_timer = { | 310 | struct sys_timer omap1_timer = { |
311 | .init = omap_timer_init, | 311 | .init = omap1_timer_init, |
312 | }; | 312 | }; |
diff --git a/arch/arm/mach-omap1/timer32k.c b/arch/arm/mach-omap1/timer32k.c index 13d7b8f145bd..96604a50c4fe 100644 --- a/arch/arm/mach-omap1/timer32k.c +++ b/arch/arm/mach-omap1/timer32k.c | |||
@@ -183,10 +183,6 @@ static __init void omap_init_32k_timer(void) | |||
183 | bool __init omap_32k_timer_init(void) | 183 | bool __init omap_32k_timer_init(void) |
184 | { | 184 | { |
185 | omap_init_clocksource_32k(); | 185 | omap_init_clocksource_32k(); |
186 | |||
187 | #ifdef CONFIG_OMAP_DM_TIMER | ||
188 | omap_dm_timer_init(); | ||
189 | #endif | ||
190 | omap_init_32k_timer(); | 186 | omap_init_32k_timer(); |
191 | 187 | ||
192 | return true; | 188 | return true; |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 19d5891c48e3..4ae6257b39a4 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -266,9 +266,10 @@ config MACH_OMAP_ZOOM3 | |||
266 | select REGULATOR_FIXED_VOLTAGE | 266 | select REGULATOR_FIXED_VOLTAGE |
267 | 267 | ||
268 | config MACH_CM_T35 | 268 | config MACH_CM_T35 |
269 | bool "CompuLab CM-T35 module" | 269 | bool "CompuLab CM-T35/CM-T3730 modules" |
270 | depends on ARCH_OMAP3 | 270 | depends on ARCH_OMAP3 |
271 | default y | 271 | default y |
272 | select MACH_CM_T3730 | ||
272 | select OMAP_PACKAGE_CUS | 273 | select OMAP_PACKAGE_CUS |
273 | 274 | ||
274 | config MACH_CM_T3517 | 275 | config MACH_CM_T3517 |
@@ -277,6 +278,9 @@ config MACH_CM_T3517 | |||
277 | default y | 278 | default y |
278 | select OMAP_PACKAGE_CBB | 279 | select OMAP_PACKAGE_CBB |
279 | 280 | ||
281 | config MACH_CM_T3730 | ||
282 | bool | ||
283 | |||
280 | config MACH_IGEP0020 | 284 | config MACH_IGEP0020 |
281 | bool "IGEP v2 board" | 285 | bool "IGEP v2 board" |
282 | depends on ARCH_OMAP3 | 286 | depends on ARCH_OMAP3 |
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index b14807794401..ff1466fbf5c5 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | # Common support | 5 | # Common support |
6 | obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o \ | 6 | obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \ |
7 | common.o gpio.o dma.o wd_timer.o | 7 | common.o gpio.o dma.o wd_timer.o |
8 | 8 | ||
9 | omap-2-3-common = irq.o sdrc.o | 9 | omap-2-3-common = irq.o sdrc.o |
@@ -269,4 +269,4 @@ obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o | |||
269 | disp-$(CONFIG_OMAP2_DSS) := display.o | 269 | disp-$(CONFIG_OMAP2_DSS) := display.o |
270 | obj-y += $(disp-m) $(disp-y) | 270 | obj-y += $(disp-m) $(disp-y) |
271 | 271 | ||
272 | obj-y += common-board-devices.o | 272 | obj-y += common-board-devices.o twl-common.o |
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index 5de6eac0a725..2028464cf5b9 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
@@ -260,7 +260,7 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board") | |||
260 | .reserve = omap_reserve, | 260 | .reserve = omap_reserve, |
261 | .map_io = omap_2430sdp_map_io, | 261 | .map_io = omap_2430sdp_map_io, |
262 | .init_early = omap_2430sdp_init_early, | 262 | .init_early = omap_2430sdp_init_early, |
263 | .init_irq = omap_init_irq, | 263 | .init_irq = omap2_init_irq, |
264 | .init_machine = omap_2430sdp_init, | 264 | .init_machine = omap_2430sdp_init, |
265 | .timer = &omap_timer, | 265 | .timer = &omap2_timer, |
266 | MACHINE_END | 266 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 5dac974be625..bd600cfb7f80 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
@@ -231,22 +231,6 @@ static void __init omap_3430sdp_init_early(void) | |||
231 | omap2_init_common_devices(hyb18m512160af6_sdrc_params, NULL); | 231 | omap2_init_common_devices(hyb18m512160af6_sdrc_params, NULL); |
232 | } | 232 | } |
233 | 233 | ||
234 | static int sdp3430_batt_table[] = { | ||
235 | /* 0 C*/ | ||
236 | 30800, 29500, 28300, 27100, | ||
237 | 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900, | ||
238 | 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100, | ||
239 | 11600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310, | ||
240 | 8020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830, | ||
241 | 5640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170, | ||
242 | 4040, 3910, 3790, 3670, 3550 | ||
243 | }; | ||
244 | |||
245 | static struct twl4030_bci_platform_data sdp3430_bci_data = { | ||
246 | .battery_tmp_tbl = sdp3430_batt_table, | ||
247 | .tblsize = ARRAY_SIZE(sdp3430_batt_table), | ||
248 | }; | ||
249 | |||
250 | static struct omap2_hsmmc_info mmc[] = { | 234 | static struct omap2_hsmmc_info mmc[] = { |
251 | { | 235 | { |
252 | .mmc = 1, | 236 | .mmc = 1, |
@@ -292,14 +276,6 @@ static struct twl4030_gpio_platform_data sdp3430_gpio_data = { | |||
292 | .setup = sdp3430_twl_gpio_setup, | 276 | .setup = sdp3430_twl_gpio_setup, |
293 | }; | 277 | }; |
294 | 278 | ||
295 | static struct twl4030_usb_data sdp3430_usb_data = { | ||
296 | .usb_mode = T2_USB_MODE_ULPI, | ||
297 | }; | ||
298 | |||
299 | static struct twl4030_madc_platform_data sdp3430_madc_data = { | ||
300 | .irq_line = 1, | ||
301 | }; | ||
302 | |||
303 | /* regulator consumer mappings */ | 279 | /* regulator consumer mappings */ |
304 | 280 | ||
305 | /* ads7846 on SPI */ | 281 | /* ads7846 on SPI */ |
@@ -307,16 +283,6 @@ static struct regulator_consumer_supply sdp3430_vaux3_supplies[] = { | |||
307 | REGULATOR_SUPPLY("vcc", "spi1.0"), | 283 | REGULATOR_SUPPLY("vcc", "spi1.0"), |
308 | }; | 284 | }; |
309 | 285 | ||
310 | static struct regulator_consumer_supply sdp3430_vdda_dac_supplies[] = { | ||
311 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"), | ||
312 | }; | ||
313 | |||
314 | /* VPLL2 for digital video outputs */ | ||
315 | static struct regulator_consumer_supply sdp3430_vpll2_supplies[] = { | ||
316 | REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||
317 | REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||
318 | }; | ||
319 | |||
320 | static struct regulator_consumer_supply sdp3430_vmmc1_supplies[] = { | 286 | static struct regulator_consumer_supply sdp3430_vmmc1_supplies[] = { |
321 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), | 287 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
322 | }; | 288 | }; |
@@ -433,54 +399,10 @@ static struct regulator_init_data sdp3430_vsim = { | |||
433 | .consumer_supplies = sdp3430_vsim_supplies, | 399 | .consumer_supplies = sdp3430_vsim_supplies, |
434 | }; | 400 | }; |
435 | 401 | ||
436 | /* VDAC for DSS driving S-Video */ | ||
437 | static struct regulator_init_data sdp3430_vdac = { | ||
438 | .constraints = { | ||
439 | .min_uV = 1800000, | ||
440 | .max_uV = 1800000, | ||
441 | .apply_uV = true, | ||
442 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
443 | | REGULATOR_MODE_STANDBY, | ||
444 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
445 | | REGULATOR_CHANGE_STATUS, | ||
446 | }, | ||
447 | .num_consumer_supplies = ARRAY_SIZE(sdp3430_vdda_dac_supplies), | ||
448 | .consumer_supplies = sdp3430_vdda_dac_supplies, | ||
449 | }; | ||
450 | |||
451 | static struct regulator_init_data sdp3430_vpll2 = { | ||
452 | .constraints = { | ||
453 | .name = "VDVI", | ||
454 | .min_uV = 1800000, | ||
455 | .max_uV = 1800000, | ||
456 | .apply_uV = true, | ||
457 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
458 | | REGULATOR_MODE_STANDBY, | ||
459 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
460 | | REGULATOR_CHANGE_STATUS, | ||
461 | }, | ||
462 | .num_consumer_supplies = ARRAY_SIZE(sdp3430_vpll2_supplies), | ||
463 | .consumer_supplies = sdp3430_vpll2_supplies, | ||
464 | }; | ||
465 | |||
466 | static struct twl4030_codec_audio_data sdp3430_audio; | ||
467 | |||
468 | static struct twl4030_codec_data sdp3430_codec = { | ||
469 | .audio_mclk = 26000000, | ||
470 | .audio = &sdp3430_audio, | ||
471 | }; | ||
472 | |||
473 | static struct twl4030_platform_data sdp3430_twldata = { | 402 | static struct twl4030_platform_data sdp3430_twldata = { |
474 | .irq_base = TWL4030_IRQ_BASE, | ||
475 | .irq_end = TWL4030_IRQ_END, | ||
476 | |||
477 | /* platform_data for children goes here */ | 403 | /* platform_data for children goes here */ |
478 | .bci = &sdp3430_bci_data, | ||
479 | .gpio = &sdp3430_gpio_data, | 404 | .gpio = &sdp3430_gpio_data, |
480 | .madc = &sdp3430_madc_data, | ||
481 | .keypad = &sdp3430_kp_data, | 405 | .keypad = &sdp3430_kp_data, |
482 | .usb = &sdp3430_usb_data, | ||
483 | .codec = &sdp3430_codec, | ||
484 | 406 | ||
485 | .vaux1 = &sdp3430_vaux1, | 407 | .vaux1 = &sdp3430_vaux1, |
486 | .vaux2 = &sdp3430_vaux2, | 408 | .vaux2 = &sdp3430_vaux2, |
@@ -489,14 +411,21 @@ static struct twl4030_platform_data sdp3430_twldata = { | |||
489 | .vmmc1 = &sdp3430_vmmc1, | 411 | .vmmc1 = &sdp3430_vmmc1, |
490 | .vmmc2 = &sdp3430_vmmc2, | 412 | .vmmc2 = &sdp3430_vmmc2, |
491 | .vsim = &sdp3430_vsim, | 413 | .vsim = &sdp3430_vsim, |
492 | .vdac = &sdp3430_vdac, | ||
493 | .vpll2 = &sdp3430_vpll2, | ||
494 | }; | 414 | }; |
495 | 415 | ||
496 | static int __init omap3430_i2c_init(void) | 416 | static int __init omap3430_i2c_init(void) |
497 | { | 417 | { |
498 | /* i2c1 for PMIC only */ | 418 | /* i2c1 for PMIC only */ |
419 | omap3_pmic_get_config(&sdp3430_twldata, | ||
420 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_BCI | | ||
421 | TWL_COMMON_PDATA_MADC | TWL_COMMON_PDATA_AUDIO, | ||
422 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); | ||
423 | sdp3430_twldata.vdac->constraints.apply_uV = true; | ||
424 | sdp3430_twldata.vpll2->constraints.apply_uV = true; | ||
425 | sdp3430_twldata.vpll2->constraints.name = "VDVI"; | ||
426 | |||
499 | omap3_pmic_init("twl4030", &sdp3430_twldata); | 427 | omap3_pmic_init("twl4030", &sdp3430_twldata); |
428 | |||
500 | /* i2c2 on camera connector (for sensor control) and optional isp1301 */ | 429 | /* i2c2 on camera connector (for sensor control) and optional isp1301 */ |
501 | omap_register_i2c_bus(2, 400, NULL, 0); | 430 | omap_register_i2c_bus(2, 400, NULL, 0); |
502 | /* i2c3 on display connector (for DVI, tfp410) */ | 431 | /* i2c3 on display connector (for DVI, tfp410) */ |
@@ -804,7 +733,7 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board") | |||
804 | .reserve = omap_reserve, | 733 | .reserve = omap_reserve, |
805 | .map_io = omap3_map_io, | 734 | .map_io = omap3_map_io, |
806 | .init_early = omap_3430sdp_init_early, | 735 | .init_early = omap_3430sdp_init_early, |
807 | .init_irq = omap_init_irq, | 736 | .init_irq = omap3_init_irq, |
808 | .init_machine = omap_3430sdp_init, | 737 | .init_machine = omap_3430sdp_init, |
809 | .timer = &omap_timer, | 738 | .timer = &omap3_timer, |
810 | MACHINE_END | 739 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c index a5933cc15caa..e4f37b57a0c4 100644 --- a/arch/arm/mach-omap2/board-3630sdp.c +++ b/arch/arm/mach-omap2/board-3630sdp.c | |||
@@ -219,7 +219,7 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board") | |||
219 | .reserve = omap_reserve, | 219 | .reserve = omap_reserve, |
220 | .map_io = omap3_map_io, | 220 | .map_io = omap3_map_io, |
221 | .init_early = omap_sdp_init_early, | 221 | .init_early = omap_sdp_init_early, |
222 | .init_irq = omap_init_irq, | 222 | .init_irq = omap3_init_irq, |
223 | .init_machine = omap_sdp_init, | 223 | .init_machine = omap_sdp_init, |
224 | .timer = &omap_timer, | 224 | .timer = &omap3_timer, |
225 | MACHINE_END | 225 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 63de2d396e2d..a7c0b31fd084 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/i2c/twl.h> | 22 | #include <linux/i2c/twl.h> |
23 | #include <linux/gpio_keys.h> | 23 | #include <linux/gpio_keys.h> |
24 | #include <linux/regulator/machine.h> | 24 | #include <linux/regulator/machine.h> |
25 | #include <linux/regulator/fixed.h> | ||
25 | #include <linux/leds.h> | 26 | #include <linux/leds.h> |
26 | #include <linux/leds_pwm.h> | 27 | #include <linux/leds_pwm.h> |
27 | 28 | ||
@@ -37,10 +38,10 @@ | |||
37 | #include <plat/mmc.h> | 38 | #include <plat/mmc.h> |
38 | #include <plat/omap4-keypad.h> | 39 | #include <plat/omap4-keypad.h> |
39 | #include <video/omapdss.h> | 40 | #include <video/omapdss.h> |
41 | #include <linux/wl12xx.h> | ||
40 | 42 | ||
41 | #include "mux.h" | 43 | #include "mux.h" |
42 | #include "hsmmc.h" | 44 | #include "hsmmc.h" |
43 | #include "timer-gp.h" | ||
44 | #include "control.h" | 45 | #include "control.h" |
45 | #include "common-board-devices.h" | 46 | #include "common-board-devices.h" |
46 | 47 | ||
@@ -52,6 +53,9 @@ | |||
52 | #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ | 53 | #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ |
53 | #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ | 54 | #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ |
54 | 55 | ||
56 | #define GPIO_WIFI_PMENA 54 | ||
57 | #define GPIO_WIFI_IRQ 53 | ||
58 | |||
55 | static const int sdp4430_keymap[] = { | 59 | static const int sdp4430_keymap[] = { |
56 | KEY(0, 0, KEY_E), | 60 | KEY(0, 0, KEY_E), |
57 | KEY(0, 1, KEY_R), | 61 | KEY(0, 1, KEY_R), |
@@ -125,6 +129,64 @@ static const int sdp4430_keymap[] = { | |||
125 | KEY(7, 6, KEY_OK), | 129 | KEY(7, 6, KEY_OK), |
126 | KEY(7, 7, KEY_DOWN), | 130 | KEY(7, 7, KEY_DOWN), |
127 | }; | 131 | }; |
132 | static struct omap_device_pad keypad_pads[] __initdata = { | ||
133 | { .name = "kpd_col1.kpd_col1", | ||
134 | .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1, | ||
135 | }, | ||
136 | { .name = "kpd_col1.kpd_col1", | ||
137 | .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1, | ||
138 | }, | ||
139 | { .name = "kpd_col2.kpd_col2", | ||
140 | .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1, | ||
141 | }, | ||
142 | { .name = "kpd_col3.kpd_col3", | ||
143 | .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1, | ||
144 | }, | ||
145 | { .name = "kpd_col4.kpd_col4", | ||
146 | .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1, | ||
147 | }, | ||
148 | { .name = "kpd_col5.kpd_col5", | ||
149 | .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1, | ||
150 | }, | ||
151 | { .name = "gpmc_a23.kpd_col7", | ||
152 | .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1, | ||
153 | }, | ||
154 | { .name = "gpmc_a22.kpd_col6", | ||
155 | .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1, | ||
156 | }, | ||
157 | { .name = "kpd_row0.kpd_row0", | ||
158 | .enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN | | ||
159 | OMAP_MUX_MODE1 | OMAP_INPUT_EN, | ||
160 | }, | ||
161 | { .name = "kpd_row1.kpd_row1", | ||
162 | .enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN | | ||
163 | OMAP_MUX_MODE1 | OMAP_INPUT_EN, | ||
164 | }, | ||
165 | { .name = "kpd_row2.kpd_row2", | ||
166 | .enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN | | ||
167 | OMAP_MUX_MODE1 | OMAP_INPUT_EN, | ||
168 | }, | ||
169 | { .name = "kpd_row3.kpd_row3", | ||
170 | .enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN | | ||
171 | OMAP_MUX_MODE1 | OMAP_INPUT_EN, | ||
172 | }, | ||
173 | { .name = "kpd_row4.kpd_row4", | ||
174 | .enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN | | ||
175 | OMAP_MUX_MODE1 | OMAP_INPUT_EN, | ||
176 | }, | ||
177 | { .name = "kpd_row5.kpd_row5", | ||
178 | .enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN | | ||
179 | OMAP_MUX_MODE1 | OMAP_INPUT_EN, | ||
180 | }, | ||
181 | { .name = "gpmc_a18.kpd_row6", | ||
182 | .enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN | | ||
183 | OMAP_MUX_MODE1 | OMAP_INPUT_EN, | ||
184 | }, | ||
185 | { .name = "gpmc_a19.kpd_row7", | ||
186 | .enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN | | ||
187 | OMAP_MUX_MODE1 | OMAP_INPUT_EN, | ||
188 | }, | ||
189 | }; | ||
128 | 190 | ||
129 | static struct matrix_keymap_data sdp4430_keymap_data = { | 191 | static struct matrix_keymap_data sdp4430_keymap_data = { |
130 | .keymap = sdp4430_keymap, | 192 | .keymap = sdp4430_keymap, |
@@ -136,6 +198,13 @@ static struct omap4_keypad_platform_data sdp4430_keypad_data = { | |||
136 | .rows = 8, | 198 | .rows = 8, |
137 | .cols = 8, | 199 | .cols = 8, |
138 | }; | 200 | }; |
201 | |||
202 | static struct omap_board_data keypad_data = { | ||
203 | .id = 1, | ||
204 | .pads = keypad_pads, | ||
205 | .pads_cnt = ARRAY_SIZE(keypad_pads), | ||
206 | }; | ||
207 | |||
139 | static struct gpio_led sdp4430_gpio_leds[] = { | 208 | static struct gpio_led sdp4430_gpio_leds[] = { |
140 | { | 209 | { |
141 | .name = "omap4:green:debug0", | 210 | .name = "omap4:green:debug0", |
@@ -295,9 +364,6 @@ static void __init omap_4430sdp_init_early(void) | |||
295 | { | 364 | { |
296 | omap2_init_common_infrastructure(); | 365 | omap2_init_common_infrastructure(); |
297 | omap2_init_common_devices(NULL, NULL); | 366 | omap2_init_common_devices(NULL, NULL); |
298 | #ifdef CONFIG_OMAP_32K_TIMER | ||
299 | omap2_gp_clockevent_set_gptimer(1); | ||
300 | #endif | ||
301 | } | 367 | } |
302 | 368 | ||
303 | static struct omap_musb_board_data musb_board_data = { | 369 | static struct omap_musb_board_data musb_board_data = { |
@@ -306,14 +372,6 @@ static struct omap_musb_board_data musb_board_data = { | |||
306 | .power = 100, | 372 | .power = 100, |
307 | }; | 373 | }; |
308 | 374 | ||
309 | static struct twl4030_usb_data omap4_usbphy_data = { | ||
310 | .phy_init = omap4430_phy_init, | ||
311 | .phy_exit = omap4430_phy_exit, | ||
312 | .phy_power = omap4430_phy_power, | ||
313 | .phy_set_clock = omap4430_phy_set_clk, | ||
314 | .phy_suspend = omap4430_phy_suspend, | ||
315 | }; | ||
316 | |||
317 | static struct omap2_hsmmc_info mmc[] = { | 375 | static struct omap2_hsmmc_info mmc[] = { |
318 | { | 376 | { |
319 | .mmc = 2, | 377 | .mmc = 2, |
@@ -327,21 +385,52 @@ static struct omap2_hsmmc_info mmc[] = { | |||
327 | { | 385 | { |
328 | .mmc = 1, | 386 | .mmc = 1, |
329 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, | 387 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, |
388 | .gpio_cd = -EINVAL, | ||
330 | .gpio_wp = -EINVAL, | 389 | .gpio_wp = -EINVAL, |
331 | }, | 390 | }, |
391 | { | ||
392 | .mmc = 5, | ||
393 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD, | ||
394 | .gpio_cd = -EINVAL, | ||
395 | .gpio_wp = -EINVAL, | ||
396 | .ocr_mask = MMC_VDD_165_195, | ||
397 | .nonremovable = true, | ||
398 | }, | ||
332 | {} /* Terminator */ | 399 | {} /* Terminator */ |
333 | }; | 400 | }; |
334 | 401 | ||
335 | static struct regulator_consumer_supply sdp4430_vaux_supply[] = { | 402 | static struct regulator_consumer_supply sdp4430_vaux_supply[] = { |
336 | { | 403 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"), |
337 | .supply = "vmmc", | 404 | }; |
338 | .dev_name = "omap_hsmmc.1", | 405 | |
406 | static struct regulator_consumer_supply omap4_sdp4430_vmmc5_supply = { | ||
407 | .supply = "vmmc", | ||
408 | .dev_name = "omap_hsmmc.4", | ||
409 | }; | ||
410 | |||
411 | static struct regulator_init_data sdp4430_vmmc5 = { | ||
412 | .constraints = { | ||
413 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
339 | }, | 414 | }, |
415 | .num_consumer_supplies = 1, | ||
416 | .consumer_supplies = &omap4_sdp4430_vmmc5_supply, | ||
340 | }; | 417 | }; |
341 | static struct regulator_consumer_supply sdp4430_vmmc_supply[] = { | 418 | |
342 | { | 419 | static struct fixed_voltage_config sdp4430_vwlan = { |
343 | .supply = "vmmc", | 420 | .supply_name = "vwl1271", |
344 | .dev_name = "omap_hsmmc.0", | 421 | .microvolts = 1800000, /* 1.8V */ |
422 | .gpio = GPIO_WIFI_PMENA, | ||
423 | .startup_delay = 70000, /* 70msec */ | ||
424 | .enable_high = 1, | ||
425 | .enabled_at_boot = 0, | ||
426 | .init_data = &sdp4430_vmmc5, | ||
427 | }; | ||
428 | |||
429 | static struct platform_device omap_vwlan_device = { | ||
430 | .name = "reg-fixed-voltage", | ||
431 | .id = 1, | ||
432 | .dev = { | ||
433 | .platform_data = &sdp4430_vwlan, | ||
345 | }, | 434 | }, |
346 | }; | 435 | }; |
347 | 436 | ||
@@ -399,65 +488,10 @@ static struct regulator_init_data sdp4430_vaux1 = { | |||
399 | | REGULATOR_CHANGE_MODE | 488 | | REGULATOR_CHANGE_MODE |
400 | | REGULATOR_CHANGE_STATUS, | 489 | | REGULATOR_CHANGE_STATUS, |
401 | }, | 490 | }, |
402 | .num_consumer_supplies = 1, | 491 | .num_consumer_supplies = ARRAY_SIZE(sdp4430_vaux_supply), |
403 | .consumer_supplies = sdp4430_vaux_supply, | 492 | .consumer_supplies = sdp4430_vaux_supply, |
404 | }; | 493 | }; |
405 | 494 | ||
406 | static struct regulator_init_data sdp4430_vaux2 = { | ||
407 | .constraints = { | ||
408 | .min_uV = 1200000, | ||
409 | .max_uV = 2800000, | ||
410 | .apply_uV = true, | ||
411 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
412 | | REGULATOR_MODE_STANDBY, | ||
413 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
414 | | REGULATOR_CHANGE_MODE | ||
415 | | REGULATOR_CHANGE_STATUS, | ||
416 | }, | ||
417 | }; | ||
418 | |||
419 | static struct regulator_init_data sdp4430_vaux3 = { | ||
420 | .constraints = { | ||
421 | .min_uV = 1000000, | ||
422 | .max_uV = 3000000, | ||
423 | .apply_uV = true, | ||
424 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
425 | | REGULATOR_MODE_STANDBY, | ||
426 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
427 | | REGULATOR_CHANGE_MODE | ||
428 | | REGULATOR_CHANGE_STATUS, | ||
429 | }, | ||
430 | }; | ||
431 | |||
432 | /* VMMC1 for MMC1 card */ | ||
433 | static struct regulator_init_data sdp4430_vmmc = { | ||
434 | .constraints = { | ||
435 | .min_uV = 1200000, | ||
436 | .max_uV = 3000000, | ||
437 | .apply_uV = true, | ||
438 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
439 | | REGULATOR_MODE_STANDBY, | ||
440 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
441 | | REGULATOR_CHANGE_MODE | ||
442 | | REGULATOR_CHANGE_STATUS, | ||
443 | }, | ||
444 | .num_consumer_supplies = 1, | ||
445 | .consumer_supplies = sdp4430_vmmc_supply, | ||
446 | }; | ||
447 | |||
448 | static struct regulator_init_data sdp4430_vpp = { | ||
449 | .constraints = { | ||
450 | .min_uV = 1800000, | ||
451 | .max_uV = 2500000, | ||
452 | .apply_uV = true, | ||
453 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
454 | | REGULATOR_MODE_STANDBY, | ||
455 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
456 | | REGULATOR_CHANGE_MODE | ||
457 | | REGULATOR_CHANGE_STATUS, | ||
458 | }, | ||
459 | }; | ||
460 | |||
461 | static struct regulator_init_data sdp4430_vusim = { | 495 | static struct regulator_init_data sdp4430_vusim = { |
462 | .constraints = { | 496 | .constraints = { |
463 | .min_uV = 1200000, | 497 | .min_uV = 1200000, |
@@ -471,74 +505,10 @@ static struct regulator_init_data sdp4430_vusim = { | |||
471 | }, | 505 | }, |
472 | }; | 506 | }; |
473 | 507 | ||
474 | static struct regulator_init_data sdp4430_vana = { | ||
475 | .constraints = { | ||
476 | .min_uV = 2100000, | ||
477 | .max_uV = 2100000, | ||
478 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
479 | | REGULATOR_MODE_STANDBY, | ||
480 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
481 | | REGULATOR_CHANGE_STATUS, | ||
482 | }, | ||
483 | }; | ||
484 | |||
485 | static struct regulator_init_data sdp4430_vcxio = { | ||
486 | .constraints = { | ||
487 | .min_uV = 1800000, | ||
488 | .max_uV = 1800000, | ||
489 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
490 | | REGULATOR_MODE_STANDBY, | ||
491 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
492 | | REGULATOR_CHANGE_STATUS, | ||
493 | }, | ||
494 | }; | ||
495 | |||
496 | static struct regulator_init_data sdp4430_vdac = { | ||
497 | .constraints = { | ||
498 | .min_uV = 1800000, | ||
499 | .max_uV = 1800000, | ||
500 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
501 | | REGULATOR_MODE_STANDBY, | ||
502 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
503 | | REGULATOR_CHANGE_STATUS, | ||
504 | }, | ||
505 | }; | ||
506 | |||
507 | static struct regulator_init_data sdp4430_vusb = { | ||
508 | .constraints = { | ||
509 | .min_uV = 3300000, | ||
510 | .max_uV = 3300000, | ||
511 | .apply_uV = true, | ||
512 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
513 | | REGULATOR_MODE_STANDBY, | ||
514 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
515 | | REGULATOR_CHANGE_STATUS, | ||
516 | }, | ||
517 | }; | ||
518 | |||
519 | static struct regulator_init_data sdp4430_clk32kg = { | ||
520 | .constraints = { | ||
521 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
522 | }, | ||
523 | }; | ||
524 | |||
525 | static struct twl4030_platform_data sdp4430_twldata = { | 508 | static struct twl4030_platform_data sdp4430_twldata = { |
526 | .irq_base = TWL6030_IRQ_BASE, | ||
527 | .irq_end = TWL6030_IRQ_END, | ||
528 | |||
529 | /* Regulators */ | 509 | /* Regulators */ |
530 | .vmmc = &sdp4430_vmmc, | ||
531 | .vpp = &sdp4430_vpp, | ||
532 | .vusim = &sdp4430_vusim, | 510 | .vusim = &sdp4430_vusim, |
533 | .vana = &sdp4430_vana, | ||
534 | .vcxio = &sdp4430_vcxio, | ||
535 | .vdac = &sdp4430_vdac, | ||
536 | .vusb = &sdp4430_vusb, | ||
537 | .vaux1 = &sdp4430_vaux1, | 511 | .vaux1 = &sdp4430_vaux1, |
538 | .vaux2 = &sdp4430_vaux2, | ||
539 | .vaux3 = &sdp4430_vaux3, | ||
540 | .clk32kg = &sdp4430_clk32kg, | ||
541 | .usb = &omap4_usbphy_data | ||
542 | }; | 512 | }; |
543 | 513 | ||
544 | static struct i2c_board_info __initdata sdp4430_i2c_3_boardinfo[] = { | 514 | static struct i2c_board_info __initdata sdp4430_i2c_3_boardinfo[] = { |
@@ -556,6 +526,16 @@ static struct i2c_board_info __initdata sdp4430_i2c_4_boardinfo[] = { | |||
556 | }; | 526 | }; |
557 | static int __init omap4_i2c_init(void) | 527 | static int __init omap4_i2c_init(void) |
558 | { | 528 | { |
529 | omap4_pmic_get_config(&sdp4430_twldata, TWL_COMMON_PDATA_USB, | ||
530 | TWL_COMMON_REGULATOR_VDAC | | ||
531 | TWL_COMMON_REGULATOR_VAUX2 | | ||
532 | TWL_COMMON_REGULATOR_VAUX3 | | ||
533 | TWL_COMMON_REGULATOR_VMMC | | ||
534 | TWL_COMMON_REGULATOR_VPP | | ||
535 | TWL_COMMON_REGULATOR_VANA | | ||
536 | TWL_COMMON_REGULATOR_VCXIO | | ||
537 | TWL_COMMON_REGULATOR_VUSB | | ||
538 | TWL_COMMON_REGULATOR_CLK32KG); | ||
559 | omap4_pmic_init("twl6030", &sdp4430_twldata); | 539 | omap4_pmic_init("twl6030", &sdp4430_twldata); |
560 | omap_register_i2c_bus(2, 400, NULL, 0); | 540 | omap_register_i2c_bus(2, 400, NULL, 0); |
561 | omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo, | 541 | omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo, |
@@ -723,6 +703,41 @@ static inline void board_serial_init(void) | |||
723 | } | 703 | } |
724 | #endif | 704 | #endif |
725 | 705 | ||
706 | static void omap4_sdp4430_wifi_mux_init(void) | ||
707 | { | ||
708 | omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT | | ||
709 | OMAP_PIN_OFF_WAKEUPENABLE); | ||
710 | omap_mux_init_gpio(GPIO_WIFI_PMENA, OMAP_PIN_OUTPUT); | ||
711 | |||
712 | omap_mux_init_signal("sdmmc5_cmd.sdmmc5_cmd", | ||
713 | OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP); | ||
714 | omap_mux_init_signal("sdmmc5_clk.sdmmc5_clk", | ||
715 | OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP); | ||
716 | omap_mux_init_signal("sdmmc5_dat0.sdmmc5_dat0", | ||
717 | OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP); | ||
718 | omap_mux_init_signal("sdmmc5_dat1.sdmmc5_dat1", | ||
719 | OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP); | ||
720 | omap_mux_init_signal("sdmmc5_dat2.sdmmc5_dat2", | ||
721 | OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP); | ||
722 | omap_mux_init_signal("sdmmc5_dat3.sdmmc5_dat3", | ||
723 | OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP); | ||
724 | |||
725 | } | ||
726 | |||
727 | static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = { | ||
728 | .irq = OMAP_GPIO_IRQ(GPIO_WIFI_IRQ), | ||
729 | .board_ref_clock = WL12XX_REFCLOCK_26, | ||
730 | .board_tcxo_clock = WL12XX_TCXOCLOCK_26, | ||
731 | }; | ||
732 | |||
733 | static void omap4_sdp4430_wifi_init(void) | ||
734 | { | ||
735 | omap4_sdp4430_wifi_mux_init(); | ||
736 | if (wl12xx_set_platform_data(&omap4_sdp4430_wlan_data)) | ||
737 | pr_err("Error setting wl12xx data\n"); | ||
738 | platform_device_register(&omap_vwlan_device); | ||
739 | } | ||
740 | |||
726 | static void __init omap_4430sdp_init(void) | 741 | static void __init omap_4430sdp_init(void) |
727 | { | 742 | { |
728 | int status; | 743 | int status; |
@@ -739,6 +754,7 @@ static void __init omap_4430sdp_init(void) | |||
739 | omap_sfh7741prox_init(); | 754 | omap_sfh7741prox_init(); |
740 | platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices)); | 755 | platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices)); |
741 | board_serial_init(); | 756 | board_serial_init(); |
757 | omap4_sdp4430_wifi_init(); | ||
742 | omap4_twl6030_hsmmc_init(mmc); | 758 | omap4_twl6030_hsmmc_init(mmc); |
743 | 759 | ||
744 | usb_musb_init(&musb_board_data); | 760 | usb_musb_init(&musb_board_data); |
@@ -752,7 +768,7 @@ static void __init omap_4430sdp_init(void) | |||
752 | ARRAY_SIZE(sdp4430_spi_board_info)); | 768 | ARRAY_SIZE(sdp4430_spi_board_info)); |
753 | } | 769 | } |
754 | 770 | ||
755 | status = omap4_keyboard_init(&sdp4430_keypad_data); | 771 | status = omap4_keyboard_init(&sdp4430_keypad_data, &keypad_data); |
756 | if (status) | 772 | if (status) |
757 | pr_err("Keypad initialization failed: %d\n", status); | 773 | pr_err("Keypad initialization failed: %d\n", status); |
758 | 774 | ||
@@ -773,5 +789,5 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board") | |||
773 | .init_early = omap_4430sdp_init_early, | 789 | .init_early = omap_4430sdp_init_early, |
774 | .init_irq = gic_init_irq, | 790 | .init_irq = gic_init_irq, |
775 | .init_machine = omap_4430sdp_init, | 791 | .init_machine = omap_4430sdp_init, |
776 | .timer = &omap_timer, | 792 | .timer = &omap4_timer, |
777 | MACHINE_END | 793 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c index 5e438a77cd72..5f2b55ff04ff 100644 --- a/arch/arm/mach-omap2/board-am3517crane.c +++ b/arch/arm/mach-omap2/board-am3517crane.c | |||
@@ -104,7 +104,7 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD") | |||
104 | .reserve = omap_reserve, | 104 | .reserve = omap_reserve, |
105 | .map_io = omap3_map_io, | 105 | .map_io = omap3_map_io, |
106 | .init_early = am3517_crane_init_early, | 106 | .init_early = am3517_crane_init_early, |
107 | .init_irq = omap_init_irq, | 107 | .init_irq = omap3_init_irq, |
108 | .init_machine = am3517_crane_init, | 108 | .init_machine = am3517_crane_init, |
109 | .timer = &omap_timer, | 109 | .timer = &omap3_timer, |
110 | MACHINE_END | 110 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index 63af4171c043..f3006c304150 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c | |||
@@ -494,7 +494,7 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM") | |||
494 | .reserve = omap_reserve, | 494 | .reserve = omap_reserve, |
495 | .map_io = omap3_map_io, | 495 | .map_io = omap3_map_io, |
496 | .init_early = am3517_evm_init_early, | 496 | .init_early = am3517_evm_init_early, |
497 | .init_irq = omap_init_irq, | 497 | .init_irq = omap3_init_irq, |
498 | .init_machine = am3517_evm_init, | 498 | .init_machine = am3517_evm_init, |
499 | .timer = &omap_timer, | 499 | .timer = &omap3_timer, |
500 | MACHINE_END | 500 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index b124bdfb4239..70211703ff9f 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c | |||
@@ -354,7 +354,7 @@ MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon") | |||
354 | .reserve = omap_reserve, | 354 | .reserve = omap_reserve, |
355 | .map_io = omap_apollon_map_io, | 355 | .map_io = omap_apollon_map_io, |
356 | .init_early = omap_apollon_init_early, | 356 | .init_early = omap_apollon_init_early, |
357 | .init_irq = omap_init_irq, | 357 | .init_irq = omap2_init_irq, |
358 | .init_machine = omap_apollon_init, | 358 | .init_machine = omap_apollon_init, |
359 | .timer = &omap_timer, | 359 | .timer = &omap2_timer, |
360 | MACHINE_END | 360 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index 77456dec93ea..3af8aab435b5 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
@@ -1,8 +1,9 @@ | |||
1 | /* | 1 | /* |
2 | * board-cm-t35.c (CompuLab CM-T35 module) | 2 | * CompuLab CM-T35/CM-T3730 modules support |
3 | * | 3 | * |
4 | * Copyright (C) 2009 CompuLab, Ltd. | 4 | * Copyright (C) 2009-2011 CompuLab, Ltd. |
5 | * Author: Mike Rapoport <mike@compulab.co.il> | 5 | * Authors: Mike Rapoport <mike@compulab.co.il> |
6 | * Igor Grinberg <grinberg@compulab.co.il> | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or | 8 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License | 9 | * modify it under the terms of the GNU General Public License |
@@ -13,11 +14,6 @@ | |||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * General Public License for more details. | 15 | * General Public License for more details. |
15 | * | 16 | * |
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
19 | * 02110-1301 USA | ||
20 | * | ||
21 | */ | 17 | */ |
22 | 18 | ||
23 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
@@ -149,12 +145,12 @@ static struct mtd_partition cm_t35_nand_partitions[] = { | |||
149 | }, | 145 | }, |
150 | { | 146 | { |
151 | .name = "linux", | 147 | .name = "linux", |
152 | .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */ | 148 | .offset = MTDPART_OFS_APPEND, /* Offset = 0x2A0000 */ |
153 | .size = 32 * NAND_BLOCK_SIZE, | 149 | .size = 32 * NAND_BLOCK_SIZE, |
154 | }, | 150 | }, |
155 | { | 151 | { |
156 | .name = "rootfs", | 152 | .name = "rootfs", |
157 | .offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */ | 153 | .offset = MTDPART_OFS_APPEND, /* Offset = 0x6A0000 */ |
158 | .size = MTDPART_SIZ_FULL, | 154 | .size = MTDPART_SIZ_FULL, |
159 | }, | 155 | }, |
160 | }; | 156 | }; |
@@ -162,9 +158,7 @@ static struct mtd_partition cm_t35_nand_partitions[] = { | |||
162 | static struct omap_nand_platform_data cm_t35_nand_data = { | 158 | static struct omap_nand_platform_data cm_t35_nand_data = { |
163 | .parts = cm_t35_nand_partitions, | 159 | .parts = cm_t35_nand_partitions, |
164 | .nr_parts = ARRAY_SIZE(cm_t35_nand_partitions), | 160 | .nr_parts = ARRAY_SIZE(cm_t35_nand_partitions), |
165 | .dma_channel = -1, /* disable DMA in OMAP NAND driver */ | ||
166 | .cs = 0, | 161 | .cs = 0, |
167 | |||
168 | }; | 162 | }; |
169 | 163 | ||
170 | static void __init cm_t35_init_nand(void) | 164 | static void __init cm_t35_init_nand(void) |
@@ -337,19 +331,17 @@ static void __init cm_t35_init_display(void) | |||
337 | } | 331 | } |
338 | } | 332 | } |
339 | 333 | ||
340 | static struct regulator_consumer_supply cm_t35_vmmc1_supply = { | 334 | static struct regulator_consumer_supply cm_t35_vmmc1_supply[] = { |
341 | .supply = "vmmc", | 335 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
342 | }; | 336 | }; |
343 | 337 | ||
344 | static struct regulator_consumer_supply cm_t35_vsim_supply = { | 338 | static struct regulator_consumer_supply cm_t35_vsim_supply[] = { |
345 | .supply = "vmmc_aux", | 339 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"), |
346 | }; | 340 | }; |
347 | 341 | ||
348 | static struct regulator_consumer_supply cm_t35_vdac_supply = | 342 | static struct regulator_consumer_supply cm_t35_vdvi_supply[] = { |
349 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); | 343 | REGULATOR_SUPPLY("vdvi", "omapdss"), |
350 | 344 | }; | |
351 | static struct regulator_consumer_supply cm_t35_vdvi_supply = | ||
352 | REGULATOR_SUPPLY("vdvi", "omapdss"); | ||
353 | 345 | ||
354 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ | 346 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ |
355 | static struct regulator_init_data cm_t35_vmmc1 = { | 347 | static struct regulator_init_data cm_t35_vmmc1 = { |
@@ -362,8 +354,8 @@ static struct regulator_init_data cm_t35_vmmc1 = { | |||
362 | | REGULATOR_CHANGE_MODE | 354 | | REGULATOR_CHANGE_MODE |
363 | | REGULATOR_CHANGE_STATUS, | 355 | | REGULATOR_CHANGE_STATUS, |
364 | }, | 356 | }, |
365 | .num_consumer_supplies = 1, | 357 | .num_consumer_supplies = ARRAY_SIZE(cm_t35_vmmc1_supply), |
366 | .consumer_supplies = &cm_t35_vmmc1_supply, | 358 | .consumer_supplies = cm_t35_vmmc1_supply, |
367 | }; | 359 | }; |
368 | 360 | ||
369 | /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ | 361 | /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ |
@@ -377,41 +369,8 @@ static struct regulator_init_data cm_t35_vsim = { | |||
377 | | REGULATOR_CHANGE_MODE | 369 | | REGULATOR_CHANGE_MODE |
378 | | REGULATOR_CHANGE_STATUS, | 370 | | REGULATOR_CHANGE_STATUS, |
379 | }, | 371 | }, |
380 | .num_consumer_supplies = 1, | 372 | .num_consumer_supplies = ARRAY_SIZE(cm_t35_vsim_supply), |
381 | .consumer_supplies = &cm_t35_vsim_supply, | 373 | .consumer_supplies = cm_t35_vsim_supply, |
382 | }; | ||
383 | |||
384 | /* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */ | ||
385 | static struct regulator_init_data cm_t35_vdac = { | ||
386 | .constraints = { | ||
387 | .min_uV = 1800000, | ||
388 | .max_uV = 1800000, | ||
389 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
390 | | REGULATOR_MODE_STANDBY, | ||
391 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
392 | | REGULATOR_CHANGE_STATUS, | ||
393 | }, | ||
394 | .num_consumer_supplies = 1, | ||
395 | .consumer_supplies = &cm_t35_vdac_supply, | ||
396 | }; | ||
397 | |||
398 | /* VPLL2 for digital video outputs */ | ||
399 | static struct regulator_init_data cm_t35_vpll2 = { | ||
400 | .constraints = { | ||
401 | .name = "VDVI", | ||
402 | .min_uV = 1800000, | ||
403 | .max_uV = 1800000, | ||
404 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
405 | | REGULATOR_MODE_STANDBY, | ||
406 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
407 | | REGULATOR_CHANGE_STATUS, | ||
408 | }, | ||
409 | .num_consumer_supplies = 1, | ||
410 | .consumer_supplies = &cm_t35_vdvi_supply, | ||
411 | }; | ||
412 | |||
413 | static struct twl4030_usb_data cm_t35_usb_data = { | ||
414 | .usb_mode = T2_USB_MODE_ULPI, | ||
415 | }; | 374 | }; |
416 | 375 | ||
417 | static uint32_t cm_t35_keymap[] = { | 376 | static uint32_t cm_t35_keymap[] = { |
@@ -470,9 +429,9 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio, | |||
470 | if (gpio_request_one(wlan_rst, GPIOF_OUT_INIT_HIGH, "WLAN RST") == 0) { | 429 | if (gpio_request_one(wlan_rst, GPIOF_OUT_INIT_HIGH, "WLAN RST") == 0) { |
471 | gpio_export(wlan_rst, 0); | 430 | gpio_export(wlan_rst, 0); |
472 | udelay(10); | 431 | udelay(10); |
473 | gpio_set_value(wlan_rst, 0); | 432 | gpio_set_value_cansleep(wlan_rst, 0); |
474 | udelay(10); | 433 | udelay(10); |
475 | gpio_set_value(wlan_rst, 1); | 434 | gpio_set_value_cansleep(wlan_rst, 1); |
476 | } else { | 435 | } else { |
477 | pr_err("CM-T35: could not obtain gpio for WiFi reset\n"); | 436 | pr_err("CM-T35: could not obtain gpio for WiFi reset\n"); |
478 | } | 437 | } |
@@ -481,10 +440,6 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio, | |||
481 | mmc[0].gpio_cd = gpio + 0; | 440 | mmc[0].gpio_cd = gpio + 0; |
482 | omap2_hsmmc_init(mmc); | 441 | omap2_hsmmc_init(mmc); |
483 | 442 | ||
484 | /* link regulators to MMC adapters */ | ||
485 | cm_t35_vmmc1_supply.dev = mmc[0].dev; | ||
486 | cm_t35_vsim_supply.dev = mmc[0].dev; | ||
487 | |||
488 | return 0; | 443 | return 0; |
489 | } | 444 | } |
490 | 445 | ||
@@ -496,21 +451,23 @@ static struct twl4030_gpio_platform_data cm_t35_gpio_data = { | |||
496 | }; | 451 | }; |
497 | 452 | ||
498 | static struct twl4030_platform_data cm_t35_twldata = { | 453 | static struct twl4030_platform_data cm_t35_twldata = { |
499 | .irq_base = TWL4030_IRQ_BASE, | ||
500 | .irq_end = TWL4030_IRQ_END, | ||
501 | |||
502 | /* platform_data for children goes here */ | 454 | /* platform_data for children goes here */ |
503 | .keypad = &cm_t35_kp_data, | 455 | .keypad = &cm_t35_kp_data, |
504 | .usb = &cm_t35_usb_data, | ||
505 | .gpio = &cm_t35_gpio_data, | 456 | .gpio = &cm_t35_gpio_data, |
506 | .vmmc1 = &cm_t35_vmmc1, | 457 | .vmmc1 = &cm_t35_vmmc1, |
507 | .vsim = &cm_t35_vsim, | 458 | .vsim = &cm_t35_vsim, |
508 | .vdac = &cm_t35_vdac, | ||
509 | .vpll2 = &cm_t35_vpll2, | ||
510 | }; | 459 | }; |
511 | 460 | ||
512 | static void __init cm_t35_init_i2c(void) | 461 | static void __init cm_t35_init_i2c(void) |
513 | { | 462 | { |
463 | omap3_pmic_get_config(&cm_t35_twldata, TWL_COMMON_PDATA_USB, | ||
464 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); | ||
465 | |||
466 | cm_t35_twldata.vpll2->constraints.name = "VDVI"; | ||
467 | cm_t35_twldata.vpll2->num_consumer_supplies = | ||
468 | ARRAY_SIZE(cm_t35_vdvi_supply); | ||
469 | cm_t35_twldata.vpll2->consumer_supplies = cm_t35_vdvi_supply; | ||
470 | |||
514 | omap3_pmic_init("tps65930", &cm_t35_twldata); | 471 | omap3_pmic_init("tps65930", &cm_t35_twldata); |
515 | } | 472 | } |
516 | 473 | ||
@@ -578,17 +535,11 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
578 | OMAP3_MUX(UART1_TX, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 535 | OMAP3_MUX(UART1_TX, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
579 | OMAP3_MUX(UART1_RX, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), | 536 | OMAP3_MUX(UART1_RX, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), |
580 | 537 | ||
581 | /* DSS */ | 538 | /* common DSS */ |
582 | OMAP3_MUX(DSS_PCLK, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 539 | OMAP3_MUX(DSS_PCLK, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
583 | OMAP3_MUX(DSS_HSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 540 | OMAP3_MUX(DSS_HSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
584 | OMAP3_MUX(DSS_VSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 541 | OMAP3_MUX(DSS_VSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
585 | OMAP3_MUX(DSS_ACBIAS, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 542 | OMAP3_MUX(DSS_ACBIAS, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
586 | OMAP3_MUX(DSS_DATA0, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
587 | OMAP3_MUX(DSS_DATA1, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
588 | OMAP3_MUX(DSS_DATA2, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
589 | OMAP3_MUX(DSS_DATA3, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
590 | OMAP3_MUX(DSS_DATA4, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
591 | OMAP3_MUX(DSS_DATA5, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
592 | OMAP3_MUX(DSS_DATA6, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 543 | OMAP3_MUX(DSS_DATA6, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
593 | OMAP3_MUX(DSS_DATA7, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 544 | OMAP3_MUX(DSS_DATA7, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
594 | OMAP3_MUX(DSS_DATA8, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 545 | OMAP3_MUX(DSS_DATA8, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
@@ -601,12 +552,6 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
601 | OMAP3_MUX(DSS_DATA15, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 552 | OMAP3_MUX(DSS_DATA15, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
602 | OMAP3_MUX(DSS_DATA16, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 553 | OMAP3_MUX(DSS_DATA16, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
603 | OMAP3_MUX(DSS_DATA17, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | 554 | OMAP3_MUX(DSS_DATA17, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), |
604 | OMAP3_MUX(DSS_DATA18, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
605 | OMAP3_MUX(DSS_DATA19, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
606 | OMAP3_MUX(DSS_DATA20, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
607 | OMAP3_MUX(DSS_DATA21, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
608 | OMAP3_MUX(DSS_DATA22, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
609 | OMAP3_MUX(DSS_DATA23, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
610 | 555 | ||
611 | /* display controls */ | 556 | /* display controls */ |
612 | OMAP3_MUX(MCBSP1_FSR, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), | 557 | OMAP3_MUX(MCBSP1_FSR, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), |
@@ -619,19 +564,53 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
619 | 564 | ||
620 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 565 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
621 | }; | 566 | }; |
567 | |||
568 | static void __init cm_t3x_common_dss_mux_init(int mux_mode) | ||
569 | { | ||
570 | omap_mux_init_signal("dss_data18", mux_mode); | ||
571 | omap_mux_init_signal("dss_data19", mux_mode); | ||
572 | omap_mux_init_signal("dss_data20", mux_mode); | ||
573 | omap_mux_init_signal("dss_data21", mux_mode); | ||
574 | omap_mux_init_signal("dss_data22", mux_mode); | ||
575 | omap_mux_init_signal("dss_data23", mux_mode); | ||
576 | } | ||
577 | |||
578 | static void __init cm_t35_init_mux(void) | ||
579 | { | ||
580 | omap_mux_init_signal("gpio_70", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT); | ||
581 | omap_mux_init_signal("gpio_71", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT); | ||
582 | omap_mux_init_signal("gpio_72", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT); | ||
583 | omap_mux_init_signal("gpio_73", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT); | ||
584 | omap_mux_init_signal("gpio_74", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT); | ||
585 | omap_mux_init_signal("gpio_75", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT); | ||
586 | cm_t3x_common_dss_mux_init(OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT); | ||
587 | } | ||
588 | |||
589 | static void __init cm_t3730_init_mux(void) | ||
590 | { | ||
591 | omap_mux_init_signal("sys_boot0", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT); | ||
592 | omap_mux_init_signal("sys_boot1", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT); | ||
593 | omap_mux_init_signal("sys_boot3", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT); | ||
594 | omap_mux_init_signal("sys_boot4", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT); | ||
595 | omap_mux_init_signal("sys_boot5", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT); | ||
596 | omap_mux_init_signal("sys_boot6", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT); | ||
597 | cm_t3x_common_dss_mux_init(OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT); | ||
598 | } | ||
599 | #else | ||
600 | static inline void cm_t35_init_mux(void) {} | ||
601 | static inline void cm_t3730_init_mux(void) {} | ||
622 | #endif | 602 | #endif |
623 | 603 | ||
624 | static struct omap_board_config_kernel cm_t35_config[] __initdata = { | 604 | static struct omap_board_config_kernel cm_t35_config[] __initdata = { |
625 | }; | 605 | }; |
626 | 606 | ||
627 | static void __init cm_t35_init(void) | 607 | static void __init cm_t3x_common_init(void) |
628 | { | 608 | { |
629 | omap_board_config = cm_t35_config; | 609 | omap_board_config = cm_t35_config; |
630 | omap_board_config_size = ARRAY_SIZE(cm_t35_config); | 610 | omap_board_config_size = ARRAY_SIZE(cm_t35_config); |
631 | omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); | 611 | omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); |
632 | omap_serial_init(); | 612 | omap_serial_init(); |
633 | cm_t35_init_i2c(); | 613 | cm_t35_init_i2c(); |
634 | cm_t35_init_nand(); | ||
635 | omap_ads7846_init(1, CM_T35_GPIO_PENDOWN, 0, NULL); | 614 | omap_ads7846_init(1, CM_T35_GPIO_PENDOWN, 0, NULL); |
636 | cm_t35_init_ethernet(); | 615 | cm_t35_init_ethernet(); |
637 | cm_t35_init_led(); | 616 | cm_t35_init_led(); |
@@ -641,12 +620,35 @@ static void __init cm_t35_init(void) | |||
641 | usbhs_init(&usbhs_bdata); | 620 | usbhs_init(&usbhs_bdata); |
642 | } | 621 | } |
643 | 622 | ||
623 | static void __init cm_t35_init(void) | ||
624 | { | ||
625 | cm_t3x_common_init(); | ||
626 | cm_t35_init_mux(); | ||
627 | cm_t35_init_nand(); | ||
628 | } | ||
629 | |||
630 | static void __init cm_t3730_init(void) | ||
631 | { | ||
632 | cm_t3x_common_init(); | ||
633 | cm_t3730_init_mux(); | ||
634 | } | ||
635 | |||
644 | MACHINE_START(CM_T35, "Compulab CM-T35") | 636 | MACHINE_START(CM_T35, "Compulab CM-T35") |
645 | .boot_params = 0x80000100, | 637 | .boot_params = 0x80000100, |
646 | .reserve = omap_reserve, | 638 | .reserve = omap_reserve, |
647 | .map_io = omap3_map_io, | 639 | .map_io = omap3_map_io, |
648 | .init_early = cm_t35_init_early, | 640 | .init_early = cm_t35_init_early, |
649 | .init_irq = omap_init_irq, | 641 | .init_irq = omap3_init_irq, |
650 | .init_machine = cm_t35_init, | 642 | .init_machine = cm_t35_init, |
651 | .timer = &omap_timer, | 643 | .timer = &omap3_timer, |
644 | MACHINE_END | ||
645 | |||
646 | MACHINE_START(CM_T3730, "Compulab CM-T3730") | ||
647 | .boot_params = 0x80000100, | ||
648 | .reserve = omap_reserve, | ||
649 | .map_io = omap3_map_io, | ||
650 | .init_early = cm_t35_init_early, | ||
651 | .init_irq = omap3_init_irq, | ||
652 | .init_machine = cm_t3730_init, | ||
653 | .timer = &omap3_timer, | ||
652 | MACHINE_END | 654 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index c3a9fd35034a..05c72f4c1b57 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c | |||
@@ -236,7 +236,6 @@ static struct mtd_partition cm_t3517_nand_partitions[] = { | |||
236 | static struct omap_nand_platform_data cm_t3517_nand_data = { | 236 | static struct omap_nand_platform_data cm_t3517_nand_data = { |
237 | .parts = cm_t3517_nand_partitions, | 237 | .parts = cm_t3517_nand_partitions, |
238 | .nr_parts = ARRAY_SIZE(cm_t3517_nand_partitions), | 238 | .nr_parts = ARRAY_SIZE(cm_t3517_nand_partitions), |
239 | .dma_channel = -1, /* disable DMA in OMAP NAND driver */ | ||
240 | .cs = 0, | 239 | .cs = 0, |
241 | }; | 240 | }; |
242 | 241 | ||
@@ -304,7 +303,7 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517") | |||
304 | .reserve = omap_reserve, | 303 | .reserve = omap_reserve, |
305 | .map_io = omap3_map_io, | 304 | .map_io = omap3_map_io, |
306 | .init_early = cm_t3517_init_early, | 305 | .init_early = cm_t3517_init_early, |
307 | .init_irq = omap_init_irq, | 306 | .init_irq = omap3_init_irq, |
308 | .init_machine = cm_t3517_init, | 307 | .init_machine = cm_t3517_init, |
309 | .timer = &omap_timer, | 308 | .timer = &omap3_timer, |
310 | MACHINE_END | 309 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index 34956ec83296..b6002ec31c6a 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c | |||
@@ -58,7 +58,6 @@ | |||
58 | 58 | ||
59 | #include "mux.h" | 59 | #include "mux.h" |
60 | #include "hsmmc.h" | 60 | #include "hsmmc.h" |
61 | #include "timer-gp.h" | ||
62 | #include "common-board-devices.h" | 61 | #include "common-board-devices.h" |
63 | 62 | ||
64 | #define OMAP_DM9000_GPIO_IRQ 25 | 63 | #define OMAP_DM9000_GPIO_IRQ 25 |
@@ -130,13 +129,14 @@ static void devkit8000_panel_disable_dvi(struct omap_dss_device *dssdev) | |||
130 | gpio_set_value_cansleep(dssdev->reset_gpio, 0); | 129 | gpio_set_value_cansleep(dssdev->reset_gpio, 0); |
131 | } | 130 | } |
132 | 131 | ||
133 | static struct regulator_consumer_supply devkit8000_vmmc1_supply = | 132 | static struct regulator_consumer_supply devkit8000_vmmc1_supply[] = { |
134 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"); | 133 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
135 | 134 | }; | |
136 | 135 | ||
137 | /* ads7846 on SPI */ | 136 | /* ads7846 on SPI */ |
138 | static struct regulator_consumer_supply devkit8000_vio_supply = | 137 | static struct regulator_consumer_supply devkit8000_vio_supply[] = { |
139 | REGULATOR_SUPPLY("vcc", "spi2.0"); | 138 | REGULATOR_SUPPLY("vcc", "spi2.0"), |
139 | }; | ||
140 | 140 | ||
141 | static struct panel_generic_dpi_data lcd_panel = { | 141 | static struct panel_generic_dpi_data lcd_panel = { |
142 | .name = "generic", | 142 | .name = "generic", |
@@ -186,9 +186,6 @@ static struct omap_dss_board_info devkit8000_dss_data = { | |||
186 | .default_device = &devkit8000_lcd_device, | 186 | .default_device = &devkit8000_lcd_device, |
187 | }; | 187 | }; |
188 | 188 | ||
189 | static struct regulator_consumer_supply devkit8000_vdda_dac_supply = | ||
190 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); | ||
191 | |||
192 | static uint32_t board_keymap[] = { | 189 | static uint32_t board_keymap[] = { |
193 | KEY(0, 0, KEY_1), | 190 | KEY(0, 0, KEY_1), |
194 | KEY(1, 0, KEY_2), | 191 | KEY(1, 0, KEY_2), |
@@ -284,22 +281,8 @@ static struct regulator_init_data devkit8000_vmmc1 = { | |||
284 | | REGULATOR_CHANGE_MODE | 281 | | REGULATOR_CHANGE_MODE |
285 | | REGULATOR_CHANGE_STATUS, | 282 | | REGULATOR_CHANGE_STATUS, |
286 | }, | 283 | }, |
287 | .num_consumer_supplies = 1, | 284 | .num_consumer_supplies = ARRAY_SIZE(devkit8000_vmmc1_supply), |
288 | .consumer_supplies = &devkit8000_vmmc1_supply, | 285 | .consumer_supplies = devkit8000_vmmc1_supply, |
289 | }; | ||
290 | |||
291 | /* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */ | ||
292 | static struct regulator_init_data devkit8000_vdac = { | ||
293 | .constraints = { | ||
294 | .min_uV = 1800000, | ||
295 | .max_uV = 1800000, | ||
296 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
297 | | REGULATOR_MODE_STANDBY, | ||
298 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
299 | | REGULATOR_CHANGE_STATUS, | ||
300 | }, | ||
301 | .num_consumer_supplies = 1, | ||
302 | .consumer_supplies = &devkit8000_vdda_dac_supply, | ||
303 | }; | 286 | }; |
304 | 287 | ||
305 | /* VPLL1 for digital video outputs */ | 288 | /* VPLL1 for digital video outputs */ |
@@ -327,31 +310,14 @@ static struct regulator_init_data devkit8000_vio = { | |||
327 | .valid_ops_mask = REGULATOR_CHANGE_MODE | 310 | .valid_ops_mask = REGULATOR_CHANGE_MODE |
328 | | REGULATOR_CHANGE_STATUS, | 311 | | REGULATOR_CHANGE_STATUS, |
329 | }, | 312 | }, |
330 | .num_consumer_supplies = 1, | 313 | .num_consumer_supplies = ARRAY_SIZE(devkit8000_vio_supply), |
331 | .consumer_supplies = &devkit8000_vio_supply, | 314 | .consumer_supplies = devkit8000_vio_supply, |
332 | }; | ||
333 | |||
334 | static struct twl4030_usb_data devkit8000_usb_data = { | ||
335 | .usb_mode = T2_USB_MODE_ULPI, | ||
336 | }; | ||
337 | |||
338 | static struct twl4030_codec_audio_data devkit8000_audio_data; | ||
339 | |||
340 | static struct twl4030_codec_data devkit8000_codec_data = { | ||
341 | .audio_mclk = 26000000, | ||
342 | .audio = &devkit8000_audio_data, | ||
343 | }; | 315 | }; |
344 | 316 | ||
345 | static struct twl4030_platform_data devkit8000_twldata = { | 317 | static struct twl4030_platform_data devkit8000_twldata = { |
346 | .irq_base = TWL4030_IRQ_BASE, | ||
347 | .irq_end = TWL4030_IRQ_END, | ||
348 | |||
349 | /* platform_data for children goes here */ | 318 | /* platform_data for children goes here */ |
350 | .usb = &devkit8000_usb_data, | ||
351 | .gpio = &devkit8000_gpio_data, | 319 | .gpio = &devkit8000_gpio_data, |
352 | .codec = &devkit8000_codec_data, | ||
353 | .vmmc1 = &devkit8000_vmmc1, | 320 | .vmmc1 = &devkit8000_vmmc1, |
354 | .vdac = &devkit8000_vdac, | ||
355 | .vpll1 = &devkit8000_vpll1, | 321 | .vpll1 = &devkit8000_vpll1, |
356 | .vio = &devkit8000_vio, | 322 | .vio = &devkit8000_vio, |
357 | .keypad = &devkit8000_kp_data, | 323 | .keypad = &devkit8000_kp_data, |
@@ -359,6 +325,9 @@ static struct twl4030_platform_data devkit8000_twldata = { | |||
359 | 325 | ||
360 | static int __init devkit8000_i2c_init(void) | 326 | static int __init devkit8000_i2c_init(void) |
361 | { | 327 | { |
328 | omap3_pmic_get_config(&devkit8000_twldata, | ||
329 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO, | ||
330 | TWL_COMMON_REGULATOR_VDAC); | ||
362 | omap3_pmic_init("tps65930", &devkit8000_twldata); | 331 | omap3_pmic_init("tps65930", &devkit8000_twldata); |
363 | /* Bus 3 is attached to the DVI port where devices like the pico DLP | 332 | /* Bus 3 is attached to the DVI port where devices like the pico DLP |
364 | * projector don't work reliably with 400kHz */ | 333 | * projector don't work reliably with 400kHz */ |
@@ -438,10 +407,7 @@ static void __init devkit8000_init_early(void) | |||
438 | 407 | ||
439 | static void __init devkit8000_init_irq(void) | 408 | static void __init devkit8000_init_irq(void) |
440 | { | 409 | { |
441 | omap_init_irq(); | 410 | omap3_init_irq(); |
442 | #ifdef CONFIG_OMAP_32K_TIMER | ||
443 | omap2_gp_clockevent_set_gptimer(12); | ||
444 | #endif | ||
445 | } | 411 | } |
446 | 412 | ||
447 | #define OMAP_DM9000_BASE 0x2c000000 | 413 | #define OMAP_DM9000_BASE 0x2c000000 |
@@ -707,5 +673,5 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000") | |||
707 | .init_early = devkit8000_init_early, | 673 | .init_early = devkit8000_init_early, |
708 | .init_irq = devkit8000_init_irq, | 674 | .init_irq = devkit8000_init_irq, |
709 | .init_machine = devkit8000_init, | 675 | .init_machine = devkit8000_init, |
710 | .timer = &omap_timer, | 676 | .timer = &omap3_secure_timer, |
711 | MACHINE_END | 677 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-flash.c b/arch/arm/mach-omap2/board-flash.c index 729892fdcf2e..aa1b0cbe19d2 100644 --- a/arch/arm/mach-omap2/board-flash.c +++ b/arch/arm/mach-omap2/board-flash.c | |||
@@ -132,11 +132,7 @@ static struct gpmc_timings nand_timings = { | |||
132 | }; | 132 | }; |
133 | 133 | ||
134 | static struct omap_nand_platform_data board_nand_data = { | 134 | static struct omap_nand_platform_data board_nand_data = { |
135 | .nand_setup = NULL, | ||
136 | .gpmc_t = &nand_timings, | 135 | .gpmc_t = &nand_timings, |
137 | .dma_channel = -1, /* disable DMA in OMAP NAND driver */ | ||
138 | .dev_ready = NULL, | ||
139 | .devsize = 0, /* '0' for 8-bit, '1' for 16-bit device */ | ||
140 | }; | 136 | }; |
141 | 137 | ||
142 | void | 138 | void |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 73e3c31e8508..c6ecf607ebd6 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
@@ -70,7 +70,7 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP24xx") | |||
70 | .reserve = omap_reserve, | 70 | .reserve = omap_reserve, |
71 | .map_io = omap_generic_map_io, | 71 | .map_io = omap_generic_map_io, |
72 | .init_early = omap_generic_init_early, | 72 | .init_early = omap_generic_init_early, |
73 | .init_irq = omap_init_irq, | 73 | .init_irq = omap2_init_irq, |
74 | .init_machine = omap_generic_init, | 74 | .init_machine = omap_generic_init, |
75 | .timer = &omap_timer, | 75 | .timer = &omap3_timer, |
76 | MACHINE_END | 76 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index bac7933b8cbb..45de2b319ec9 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
@@ -298,7 +298,7 @@ static void __init omap_h4_init_early(void) | |||
298 | 298 | ||
299 | static void __init omap_h4_init_irq(void) | 299 | static void __init omap_h4_init_irq(void) |
300 | { | 300 | { |
301 | omap_init_irq(); | 301 | omap2_init_irq(); |
302 | } | 302 | } |
303 | 303 | ||
304 | static struct at24_platform_data m24c01 = { | 304 | static struct at24_platform_data m24c01 = { |
@@ -388,5 +388,5 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board") | |||
388 | .init_early = omap_h4_init_early, | 388 | .init_early = omap_h4_init_early, |
389 | .init_irq = omap_h4_init_irq, | 389 | .init_irq = omap_h4_init_irq, |
390 | .init_machine = omap_h4_init, | 390 | .init_machine = omap_h4_init, |
391 | .timer = &omap_timer, | 391 | .timer = &omap2_timer, |
392 | MACHINE_END | 392 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 0c1bfca3f731..35be778caf1b 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
@@ -222,8 +222,9 @@ static inline void __init igep2_init_smsc911x(void) | |||
222 | static inline void __init igep2_init_smsc911x(void) { } | 222 | static inline void __init igep2_init_smsc911x(void) { } |
223 | #endif | 223 | #endif |
224 | 224 | ||
225 | static struct regulator_consumer_supply igep_vmmc1_supply = | 225 | static struct regulator_consumer_supply igep_vmmc1_supply[] = { |
226 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"); | 226 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
227 | }; | ||
227 | 228 | ||
228 | /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ | 229 | /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ |
229 | static struct regulator_init_data igep_vmmc1 = { | 230 | static struct regulator_init_data igep_vmmc1 = { |
@@ -236,12 +237,13 @@ static struct regulator_init_data igep_vmmc1 = { | |||
236 | | REGULATOR_CHANGE_MODE | 237 | | REGULATOR_CHANGE_MODE |
237 | | REGULATOR_CHANGE_STATUS, | 238 | | REGULATOR_CHANGE_STATUS, |
238 | }, | 239 | }, |
239 | .num_consumer_supplies = 1, | 240 | .num_consumer_supplies = ARRAY_SIZE(igep_vmmc1_supply), |
240 | .consumer_supplies = &igep_vmmc1_supply, | 241 | .consumer_supplies = igep_vmmc1_supply, |
241 | }; | 242 | }; |
242 | 243 | ||
243 | static struct regulator_consumer_supply igep_vio_supply = | 244 | static struct regulator_consumer_supply igep_vio_supply[] = { |
244 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"); | 245 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"), |
246 | }; | ||
245 | 247 | ||
246 | static struct regulator_init_data igep_vio = { | 248 | static struct regulator_init_data igep_vio = { |
247 | .constraints = { | 249 | .constraints = { |
@@ -254,20 +256,21 @@ static struct regulator_init_data igep_vio = { | |||
254 | | REGULATOR_CHANGE_MODE | 256 | | REGULATOR_CHANGE_MODE |
255 | | REGULATOR_CHANGE_STATUS, | 257 | | REGULATOR_CHANGE_STATUS, |
256 | }, | 258 | }, |
257 | .num_consumer_supplies = 1, | 259 | .num_consumer_supplies = ARRAY_SIZE(igep_vio_supply), |
258 | .consumer_supplies = &igep_vio_supply, | 260 | .consumer_supplies = igep_vio_supply, |
259 | }; | 261 | }; |
260 | 262 | ||
261 | static struct regulator_consumer_supply igep_vmmc2_supply = | 263 | static struct regulator_consumer_supply igep_vmmc2_supply[] = { |
262 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"); | 264 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"), |
265 | }; | ||
263 | 266 | ||
264 | static struct regulator_init_data igep_vmmc2 = { | 267 | static struct regulator_init_data igep_vmmc2 = { |
265 | .constraints = { | 268 | .constraints = { |
266 | .valid_modes_mask = REGULATOR_MODE_NORMAL, | 269 | .valid_modes_mask = REGULATOR_MODE_NORMAL, |
267 | .always_on = 1, | 270 | .always_on = 1, |
268 | }, | 271 | }, |
269 | .num_consumer_supplies = 1, | 272 | .num_consumer_supplies = ARRAY_SIZE(igep_vmmc2_supply), |
270 | .consumer_supplies = &igep_vmmc2_supply, | 273 | .consumer_supplies = igep_vmmc2_supply, |
271 | }; | 274 | }; |
272 | 275 | ||
273 | static struct fixed_voltage_config igep_vwlan = { | 276 | static struct fixed_voltage_config igep_vwlan = { |
@@ -440,10 +443,6 @@ static struct twl4030_gpio_platform_data igep_twl4030_gpio_pdata = { | |||
440 | .setup = igep_twl_gpio_setup, | 443 | .setup = igep_twl_gpio_setup, |
441 | }; | 444 | }; |
442 | 445 | ||
443 | static struct twl4030_usb_data igep_usb_data = { | ||
444 | .usb_mode = T2_USB_MODE_ULPI, | ||
445 | }; | ||
446 | |||
447 | static int igep2_enable_dvi(struct omap_dss_device *dssdev) | 446 | static int igep2_enable_dvi(struct omap_dss_device *dssdev) |
448 | { | 447 | { |
449 | gpio_direction_output(IGEP2_GPIO_DVI_PUP, 1); | 448 | gpio_direction_output(IGEP2_GPIO_DVI_PUP, 1); |
@@ -480,26 +479,6 @@ static struct omap_dss_board_info igep2_dss_data = { | |||
480 | .default_device = &igep2_dvi_device, | 479 | .default_device = &igep2_dvi_device, |
481 | }; | 480 | }; |
482 | 481 | ||
483 | static struct regulator_consumer_supply igep2_vpll2_supplies[] = { | ||
484 | REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||
485 | REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||
486 | }; | ||
487 | |||
488 | static struct regulator_init_data igep2_vpll2 = { | ||
489 | .constraints = { | ||
490 | .name = "VDVI", | ||
491 | .min_uV = 1800000, | ||
492 | .max_uV = 1800000, | ||
493 | .apply_uV = true, | ||
494 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
495 | | REGULATOR_MODE_STANDBY, | ||
496 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
497 | | REGULATOR_CHANGE_STATUS, | ||
498 | }, | ||
499 | .num_consumer_supplies = ARRAY_SIZE(igep2_vpll2_supplies), | ||
500 | .consumer_supplies = igep2_vpll2_supplies, | ||
501 | }; | ||
502 | |||
503 | static void __init igep2_display_init(void) | 482 | static void __init igep2_display_init(void) |
504 | { | 483 | { |
505 | int err = gpio_request_one(IGEP2_GPIO_DVI_PUP, GPIOF_OUT_INIT_HIGH, | 484 | int err = gpio_request_one(IGEP2_GPIO_DVI_PUP, GPIOF_OUT_INIT_HIGH, |
@@ -519,13 +498,6 @@ static void __init igep_init_early(void) | |||
519 | m65kxxxxam_sdrc_params); | 498 | m65kxxxxam_sdrc_params); |
520 | } | 499 | } |
521 | 500 | ||
522 | static struct twl4030_codec_audio_data igep2_audio_data; | ||
523 | |||
524 | static struct twl4030_codec_data igep2_codec_data = { | ||
525 | .audio_mclk = 26000000, | ||
526 | .audio = &igep2_audio_data, | ||
527 | }; | ||
528 | |||
529 | static int igep2_keymap[] = { | 501 | static int igep2_keymap[] = { |
530 | KEY(0, 0, KEY_LEFT), | 502 | KEY(0, 0, KEY_LEFT), |
531 | KEY(0, 1, KEY_RIGHT), | 503 | KEY(0, 1, KEY_RIGHT), |
@@ -558,11 +530,7 @@ static struct twl4030_keypad_data igep2_keypad_pdata = { | |||
558 | }; | 530 | }; |
559 | 531 | ||
560 | static struct twl4030_platform_data igep_twldata = { | 532 | static struct twl4030_platform_data igep_twldata = { |
561 | .irq_base = TWL4030_IRQ_BASE, | ||
562 | .irq_end = TWL4030_IRQ_END, | ||
563 | |||
564 | /* platform_data for children goes here */ | 533 | /* platform_data for children goes here */ |
565 | .usb = &igep_usb_data, | ||
566 | .gpio = &igep_twl4030_gpio_pdata, | 534 | .gpio = &igep_twl4030_gpio_pdata, |
567 | .vmmc1 = &igep_vmmc1, | 535 | .vmmc1 = &igep_vmmc1, |
568 | .vio = &igep_vio, | 536 | .vio = &igep_vio, |
@@ -578,6 +546,8 @@ static void __init igep_i2c_init(void) | |||
578 | { | 546 | { |
579 | int ret; | 547 | int ret; |
580 | 548 | ||
549 | omap3_pmic_get_config(&igep_twldata, TWL_COMMON_PDATA_USB, 0); | ||
550 | |||
581 | if (machine_is_igep0020()) { | 551 | if (machine_is_igep0020()) { |
582 | /* | 552 | /* |
583 | * Bus 3 is attached to the DVI port where devices like the | 553 | * Bus 3 is attached to the DVI port where devices like the |
@@ -588,9 +558,12 @@ static void __init igep_i2c_init(void) | |||
588 | if (ret) | 558 | if (ret) |
589 | pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret); | 559 | pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret); |
590 | 560 | ||
591 | igep_twldata.codec = &igep2_codec_data; | ||
592 | igep_twldata.keypad = &igep2_keypad_pdata; | 561 | igep_twldata.keypad = &igep2_keypad_pdata; |
593 | igep_twldata.vpll2 = &igep2_vpll2; | 562 | /* Get common pmic data */ |
563 | omap3_pmic_get_config(&igep_twldata, TWL_COMMON_PDATA_AUDIO, | ||
564 | TWL_COMMON_REGULATOR_VPLL2); | ||
565 | igep_twldata.vpll2->constraints.apply_uV = true; | ||
566 | igep_twldata.vpll2->constraints.name = "VDVI"; | ||
594 | } | 567 | } |
595 | 568 | ||
596 | omap3_pmic_init("twl4030", &igep_twldata); | 569 | omap3_pmic_init("twl4030", &igep_twldata); |
@@ -703,9 +676,9 @@ MACHINE_START(IGEP0020, "IGEP v2 board") | |||
703 | .reserve = omap_reserve, | 676 | .reserve = omap_reserve, |
704 | .map_io = omap3_map_io, | 677 | .map_io = omap3_map_io, |
705 | .init_early = igep_init_early, | 678 | .init_early = igep_init_early, |
706 | .init_irq = omap_init_irq, | 679 | .init_irq = omap3_init_irq, |
707 | .init_machine = igep_init, | 680 | .init_machine = igep_init, |
708 | .timer = &omap_timer, | 681 | .timer = &omap3_timer, |
709 | MACHINE_END | 682 | MACHINE_END |
710 | 683 | ||
711 | MACHINE_START(IGEP0030, "IGEP OMAP3 module") | 684 | MACHINE_START(IGEP0030, "IGEP OMAP3 module") |
@@ -713,7 +686,7 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module") | |||
713 | .reserve = omap_reserve, | 686 | .reserve = omap_reserve, |
714 | .map_io = omap3_map_io, | 687 | .map_io = omap3_map_io, |
715 | .init_early = igep_init_early, | 688 | .init_early = igep_init_early, |
716 | .init_irq = omap_init_irq, | 689 | .init_irq = omap3_init_irq, |
717 | .init_machine = igep_init, | 690 | .init_machine = igep_init, |
718 | .timer = &omap_timer, | 691 | .timer = &omap3_timer, |
719 | MACHINE_END | 692 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index f7d6038075f0..218764c9377e 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
@@ -199,22 +199,14 @@ static void __init omap_ldp_init_early(void) | |||
199 | omap2_init_common_devices(NULL, NULL); | 199 | omap2_init_common_devices(NULL, NULL); |
200 | } | 200 | } |
201 | 201 | ||
202 | static struct twl4030_usb_data ldp_usb_data = { | ||
203 | .usb_mode = T2_USB_MODE_ULPI, | ||
204 | }; | ||
205 | |||
206 | static struct twl4030_gpio_platform_data ldp_gpio_data = { | 202 | static struct twl4030_gpio_platform_data ldp_gpio_data = { |
207 | .gpio_base = OMAP_MAX_GPIO_LINES, | 203 | .gpio_base = OMAP_MAX_GPIO_LINES, |
208 | .irq_base = TWL4030_GPIO_IRQ_BASE, | 204 | .irq_base = TWL4030_GPIO_IRQ_BASE, |
209 | .irq_end = TWL4030_GPIO_IRQ_END, | 205 | .irq_end = TWL4030_GPIO_IRQ_END, |
210 | }; | 206 | }; |
211 | 207 | ||
212 | static struct twl4030_madc_platform_data ldp_madc_data = { | 208 | static struct regulator_consumer_supply ldp_vmmc1_supply[] = { |
213 | .irq_line = 1, | 209 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
214 | }; | ||
215 | |||
216 | static struct regulator_consumer_supply ldp_vmmc1_supply = { | ||
217 | .supply = "vmmc", | ||
218 | }; | 210 | }; |
219 | 211 | ||
220 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ | 212 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ |
@@ -228,8 +220,8 @@ static struct regulator_init_data ldp_vmmc1 = { | |||
228 | | REGULATOR_CHANGE_MODE | 220 | | REGULATOR_CHANGE_MODE |
229 | | REGULATOR_CHANGE_STATUS, | 221 | | REGULATOR_CHANGE_STATUS, |
230 | }, | 222 | }, |
231 | .num_consumer_supplies = 1, | 223 | .num_consumer_supplies = ARRAY_SIZE(ldp_vmmc1_supply), |
232 | .consumer_supplies = &ldp_vmmc1_supply, | 224 | .consumer_supplies = ldp_vmmc1_supply, |
233 | }; | 225 | }; |
234 | 226 | ||
235 | /* ads7846 on SPI */ | 227 | /* ads7846 on SPI */ |
@@ -253,12 +245,7 @@ static struct regulator_init_data ldp_vaux1 = { | |||
253 | }; | 245 | }; |
254 | 246 | ||
255 | static struct twl4030_platform_data ldp_twldata = { | 247 | static struct twl4030_platform_data ldp_twldata = { |
256 | .irq_base = TWL4030_IRQ_BASE, | ||
257 | .irq_end = TWL4030_IRQ_END, | ||
258 | |||
259 | /* platform_data for children goes here */ | 248 | /* platform_data for children goes here */ |
260 | .madc = &ldp_madc_data, | ||
261 | .usb = &ldp_usb_data, | ||
262 | .vmmc1 = &ldp_vmmc1, | 249 | .vmmc1 = &ldp_vmmc1, |
263 | .vaux1 = &ldp_vaux1, | 250 | .vaux1 = &ldp_vaux1, |
264 | .gpio = &ldp_gpio_data, | 251 | .gpio = &ldp_gpio_data, |
@@ -267,6 +254,8 @@ static struct twl4030_platform_data ldp_twldata = { | |||
267 | 254 | ||
268 | static int __init omap_i2c_init(void) | 255 | static int __init omap_i2c_init(void) |
269 | { | 256 | { |
257 | omap3_pmic_get_config(&ldp_twldata, | ||
258 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC, 0); | ||
270 | omap3_pmic_init("twl4030", &ldp_twldata); | 259 | omap3_pmic_init("twl4030", &ldp_twldata); |
271 | omap_register_i2c_bus(2, 400, NULL, 0); | 260 | omap_register_i2c_bus(2, 400, NULL, 0); |
272 | omap_register_i2c_bus(3, 400, NULL, 0); | 261 | omap_register_i2c_bus(3, 400, NULL, 0); |
@@ -341,8 +330,6 @@ static void __init omap_ldp_init(void) | |||
341 | ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0); | 330 | ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0); |
342 | 331 | ||
343 | omap2_hsmmc_init(mmc); | 332 | omap2_hsmmc_init(mmc); |
344 | /* link regulators to MMC adapters */ | ||
345 | ldp_vmmc1_supply.dev = mmc[0].dev; | ||
346 | } | 333 | } |
347 | 334 | ||
348 | MACHINE_START(OMAP_LDP, "OMAP LDP board") | 335 | MACHINE_START(OMAP_LDP, "OMAP LDP board") |
@@ -350,7 +337,7 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board") | |||
350 | .reserve = omap_reserve, | 337 | .reserve = omap_reserve, |
351 | .map_io = omap3_map_io, | 338 | .map_io = omap3_map_io, |
352 | .init_early = omap_ldp_init_early, | 339 | .init_early = omap_ldp_init_early, |
353 | .init_irq = omap_init_irq, | 340 | .init_irq = omap3_init_irq, |
354 | .init_machine = omap_ldp_init, | 341 | .init_machine = omap_ldp_init, |
355 | .timer = &omap_timer, | 342 | .timer = &omap3_timer, |
356 | MACHINE_END | 343 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index 8d74318ed495..e11f0c5d608a 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c | |||
@@ -699,9 +699,9 @@ MACHINE_START(NOKIA_N800, "Nokia N800") | |||
699 | .reserve = omap_reserve, | 699 | .reserve = omap_reserve, |
700 | .map_io = n8x0_map_io, | 700 | .map_io = n8x0_map_io, |
701 | .init_early = n8x0_init_early, | 701 | .init_early = n8x0_init_early, |
702 | .init_irq = omap_init_irq, | 702 | .init_irq = omap2_init_irq, |
703 | .init_machine = n8x0_init_machine, | 703 | .init_machine = n8x0_init_machine, |
704 | .timer = &omap_timer, | 704 | .timer = &omap2_timer, |
705 | MACHINE_END | 705 | MACHINE_END |
706 | 706 | ||
707 | MACHINE_START(NOKIA_N810, "Nokia N810") | 707 | MACHINE_START(NOKIA_N810, "Nokia N810") |
@@ -709,9 +709,9 @@ MACHINE_START(NOKIA_N810, "Nokia N810") | |||
709 | .reserve = omap_reserve, | 709 | .reserve = omap_reserve, |
710 | .map_io = n8x0_map_io, | 710 | .map_io = n8x0_map_io, |
711 | .init_early = n8x0_init_early, | 711 | .init_early = n8x0_init_early, |
712 | .init_irq = omap_init_irq, | 712 | .init_irq = omap2_init_irq, |
713 | .init_machine = n8x0_init_machine, | 713 | .init_machine = n8x0_init_machine, |
714 | .timer = &omap_timer, | 714 | .timer = &omap2_timer, |
715 | MACHINE_END | 715 | MACHINE_END |
716 | 716 | ||
717 | MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") | 717 | MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") |
@@ -719,7 +719,7 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") | |||
719 | .reserve = omap_reserve, | 719 | .reserve = omap_reserve, |
720 | .map_io = n8x0_map_io, | 720 | .map_io = n8x0_map_io, |
721 | .init_early = n8x0_init_early, | 721 | .init_early = n8x0_init_early, |
722 | .init_irq = omap_init_irq, | 722 | .init_irq = omap2_init_irq, |
723 | .init_machine = n8x0_init_machine, | 723 | .init_machine = n8x0_init_machine, |
724 | .timer = &omap_timer, | 724 | .timer = &omap2_timer, |
725 | MACHINE_END | 725 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 7f21d24bd437..32f5f895568a 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
@@ -50,7 +50,6 @@ | |||
50 | 50 | ||
51 | #include "mux.h" | 51 | #include "mux.h" |
52 | #include "hsmmc.h" | 52 | #include "hsmmc.h" |
53 | #include "timer-gp.h" | ||
54 | #include "pm.h" | 53 | #include "pm.h" |
55 | #include "common-board-devices.h" | 54 | #include "common-board-devices.h" |
56 | 55 | ||
@@ -61,7 +60,8 @@ | |||
61 | * AXBX = GPIO173, GPIO172, GPIO171: 1 1 1 | 60 | * AXBX = GPIO173, GPIO172, GPIO171: 1 1 1 |
62 | * C1_3 = GPIO173, GPIO172, GPIO171: 1 1 0 | 61 | * C1_3 = GPIO173, GPIO172, GPIO171: 1 1 0 |
63 | * C4 = GPIO173, GPIO172, GPIO171: 1 0 1 | 62 | * C4 = GPIO173, GPIO172, GPIO171: 1 0 1 |
64 | * XM = GPIO173, GPIO172, GPIO171: 0 0 0 | 63 | * XMA/XMB = GPIO173, GPIO172, GPIO171: 0 0 0 |
64 | * XMC = GPIO173, GPIO172, GPIO171: 0 1 0 | ||
65 | */ | 65 | */ |
66 | enum { | 66 | enum { |
67 | OMAP3BEAGLE_BOARD_UNKN = 0, | 67 | OMAP3BEAGLE_BOARD_UNKN = 0, |
@@ -69,14 +69,26 @@ enum { | |||
69 | OMAP3BEAGLE_BOARD_C1_3, | 69 | OMAP3BEAGLE_BOARD_C1_3, |
70 | OMAP3BEAGLE_BOARD_C4, | 70 | OMAP3BEAGLE_BOARD_C4, |
71 | OMAP3BEAGLE_BOARD_XM, | 71 | OMAP3BEAGLE_BOARD_XM, |
72 | OMAP3BEAGLE_BOARD_XMC, | ||
72 | }; | 73 | }; |
73 | 74 | ||
74 | static u8 omap3_beagle_version; | 75 | static u8 omap3_beagle_version; |
75 | 76 | ||
76 | static u8 omap3_beagle_get_rev(void) | 77 | /* |
77 | { | 78 | * Board-specific configuration |
78 | return omap3_beagle_version; | 79 | * Defaults to BeagleBoard-xMC |
79 | } | 80 | */ |
81 | static struct { | ||
82 | int mmc1_gpio_wp; | ||
83 | int usb_pwr_level; | ||
84 | int reset_gpio; | ||
85 | int usr_button_gpio; | ||
86 | } beagle_config = { | ||
87 | .mmc1_gpio_wp = -EINVAL, | ||
88 | .usb_pwr_level = GPIOF_OUT_INIT_LOW, | ||
89 | .reset_gpio = 129, | ||
90 | .usr_button_gpio = 4, | ||
91 | }; | ||
80 | 92 | ||
81 | static struct gpio omap3_beagle_rev_gpios[] __initdata = { | 93 | static struct gpio omap3_beagle_rev_gpios[] __initdata = { |
82 | { 171, GPIOF_IN, "rev_id_0" }, | 94 | { 171, GPIOF_IN, "rev_id_0" }, |
@@ -111,18 +123,32 @@ static void __init omap3_beagle_init_rev(void) | |||
111 | case 7: | 123 | case 7: |
112 | printk(KERN_INFO "OMAP3 Beagle Rev: Ax/Bx\n"); | 124 | printk(KERN_INFO "OMAP3 Beagle Rev: Ax/Bx\n"); |
113 | omap3_beagle_version = OMAP3BEAGLE_BOARD_AXBX; | 125 | omap3_beagle_version = OMAP3BEAGLE_BOARD_AXBX; |
126 | beagle_config.mmc1_gpio_wp = 29; | ||
127 | beagle_config.reset_gpio = 170; | ||
128 | beagle_config.usr_button_gpio = 7; | ||
114 | break; | 129 | break; |
115 | case 6: | 130 | case 6: |
116 | printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n"); | 131 | printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n"); |
117 | omap3_beagle_version = OMAP3BEAGLE_BOARD_C1_3; | 132 | omap3_beagle_version = OMAP3BEAGLE_BOARD_C1_3; |
133 | beagle_config.mmc1_gpio_wp = 23; | ||
134 | beagle_config.reset_gpio = 170; | ||
135 | beagle_config.usr_button_gpio = 7; | ||
118 | break; | 136 | break; |
119 | case 5: | 137 | case 5: |
120 | printk(KERN_INFO "OMAP3 Beagle Rev: C4\n"); | 138 | printk(KERN_INFO "OMAP3 Beagle Rev: C4\n"); |
121 | omap3_beagle_version = OMAP3BEAGLE_BOARD_C4; | 139 | omap3_beagle_version = OMAP3BEAGLE_BOARD_C4; |
140 | beagle_config.mmc1_gpio_wp = 23; | ||
141 | beagle_config.reset_gpio = 170; | ||
142 | beagle_config.usr_button_gpio = 7; | ||
122 | break; | 143 | break; |
123 | case 0: | 144 | case 0: |
124 | printk(KERN_INFO "OMAP3 Beagle Rev: xM\n"); | 145 | printk(KERN_INFO "OMAP3 Beagle Rev: xM Ax/Bx\n"); |
125 | omap3_beagle_version = OMAP3BEAGLE_BOARD_XM; | 146 | omap3_beagle_version = OMAP3BEAGLE_BOARD_XM; |
147 | beagle_config.usb_pwr_level = GPIOF_OUT_INIT_HIGH; | ||
148 | break; | ||
149 | case 2: | ||
150 | printk(KERN_INFO "OMAP3 Beagle Rev: xM C\n"); | ||
151 | omap3_beagle_version = OMAP3BEAGLE_BOARD_XMC; | ||
126 | break; | 152 | break; |
127 | default: | 153 | default: |
128 | printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev); | 154 | printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev); |
@@ -210,14 +236,6 @@ static struct omap_dss_board_info beagle_dss_data = { | |||
210 | .default_device = &beagle_dvi_device, | 236 | .default_device = &beagle_dvi_device, |
211 | }; | 237 | }; |
212 | 238 | ||
213 | static struct regulator_consumer_supply beagle_vdac_supply = | ||
214 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); | ||
215 | |||
216 | static struct regulator_consumer_supply beagle_vdvi_supplies[] = { | ||
217 | REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||
218 | REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||
219 | }; | ||
220 | |||
221 | static void __init beagle_display_init(void) | 239 | static void __init beagle_display_init(void) |
222 | { | 240 | { |
223 | int r; | 241 | int r; |
@@ -234,17 +252,17 @@ static struct omap2_hsmmc_info mmc[] = { | |||
234 | { | 252 | { |
235 | .mmc = 1, | 253 | .mmc = 1, |
236 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, | 254 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, |
237 | .gpio_wp = 29, | 255 | .gpio_wp = -EINVAL, |
238 | }, | 256 | }, |
239 | {} /* Terminator */ | 257 | {} /* Terminator */ |
240 | }; | 258 | }; |
241 | 259 | ||
242 | static struct regulator_consumer_supply beagle_vmmc1_supply = { | 260 | static struct regulator_consumer_supply beagle_vmmc1_supply[] = { |
243 | .supply = "vmmc", | 261 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
244 | }; | 262 | }; |
245 | 263 | ||
246 | static struct regulator_consumer_supply beagle_vsim_supply = { | 264 | static struct regulator_consumer_supply beagle_vsim_supply[] = { |
247 | .supply = "vmmc_aux", | 265 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"), |
248 | }; | 266 | }; |
249 | 267 | ||
250 | static struct gpio_led gpio_leds[]; | 268 | static struct gpio_led gpio_leds[]; |
@@ -252,33 +270,22 @@ static struct gpio_led gpio_leds[]; | |||
252 | static int beagle_twl_gpio_setup(struct device *dev, | 270 | static int beagle_twl_gpio_setup(struct device *dev, |
253 | unsigned gpio, unsigned ngpio) | 271 | unsigned gpio, unsigned ngpio) |
254 | { | 272 | { |
255 | int r, usb_pwr_level; | 273 | int r; |
256 | 274 | ||
257 | if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { | 275 | if (beagle_config.mmc1_gpio_wp != -EINVAL) |
258 | mmc[0].gpio_wp = -EINVAL; | 276 | omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT); |
259 | } else if ((omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_C1_3) || | 277 | mmc[0].gpio_wp = beagle_config.mmc1_gpio_wp; |
260 | (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_C4)) { | ||
261 | omap_mux_init_gpio(23, OMAP_PIN_INPUT); | ||
262 | mmc[0].gpio_wp = 23; | ||
263 | } else { | ||
264 | omap_mux_init_gpio(29, OMAP_PIN_INPUT); | ||
265 | } | ||
266 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ | 278 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ |
267 | mmc[0].gpio_cd = gpio + 0; | 279 | mmc[0].gpio_cd = gpio + 0; |
268 | omap2_hsmmc_init(mmc); | 280 | omap2_hsmmc_init(mmc); |
269 | 281 | ||
270 | /* link regulators to MMC adapters */ | ||
271 | beagle_vmmc1_supply.dev = mmc[0].dev; | ||
272 | beagle_vsim_supply.dev = mmc[0].dev; | ||
273 | |||
274 | /* | 282 | /* |
275 | * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active | 283 | * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active |
276 | * high / others active low) | 284 | * high / others active low) |
277 | * DVI reset GPIO is different between beagle revisions | 285 | * DVI reset GPIO is different between beagle revisions |
278 | */ | 286 | */ |
279 | if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { | 287 | /* Valid for all -xM revisions */ |
280 | usb_pwr_level = GPIOF_OUT_INIT_HIGH; | 288 | if (cpu_is_omap3630()) { |
281 | beagle_dvi_device.reset_gpio = 129; | ||
282 | /* | 289 | /* |
283 | * gpio + 1 on Xm controls the TFP410's enable line (active low) | 290 | * gpio + 1 on Xm controls the TFP410's enable line (active low) |
284 | * gpio + 2 control varies depending on the board rev as below: | 291 | * gpio + 2 control varies depending on the board rev as below: |
@@ -296,8 +303,6 @@ static int beagle_twl_gpio_setup(struct device *dev, | |||
296 | pr_err("%s: unable to configure DVI_LDO_EN\n", | 303 | pr_err("%s: unable to configure DVI_LDO_EN\n", |
297 | __func__); | 304 | __func__); |
298 | } else { | 305 | } else { |
299 | usb_pwr_level = GPIOF_OUT_INIT_LOW; | ||
300 | beagle_dvi_device.reset_gpio = 170; | ||
301 | /* | 306 | /* |
302 | * REVISIT: need ehci-omap hooks for external VBUS | 307 | * REVISIT: need ehci-omap hooks for external VBUS |
303 | * power switch and overcurrent detect | 308 | * power switch and overcurrent detect |
@@ -305,8 +310,10 @@ static int beagle_twl_gpio_setup(struct device *dev, | |||
305 | if (gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC")) | 310 | if (gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC")) |
306 | pr_err("%s: unable to configure EHCI_nOC\n", __func__); | 311 | pr_err("%s: unable to configure EHCI_nOC\n", __func__); |
307 | } | 312 | } |
313 | beagle_dvi_device.reset_gpio = beagle_config.reset_gpio; | ||
308 | 314 | ||
309 | gpio_request_one(gpio + TWL4030_GPIO_MAX, usb_pwr_level, "nEN_USB_PWR"); | 315 | gpio_request_one(gpio + TWL4030_GPIO_MAX, beagle_config.usb_pwr_level, |
316 | "nEN_USB_PWR"); | ||
310 | 317 | ||
311 | /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ | 318 | /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ |
312 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; | 319 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; |
@@ -336,8 +343,8 @@ static struct regulator_init_data beagle_vmmc1 = { | |||
336 | | REGULATOR_CHANGE_MODE | 343 | | REGULATOR_CHANGE_MODE |
337 | | REGULATOR_CHANGE_STATUS, | 344 | | REGULATOR_CHANGE_STATUS, |
338 | }, | 345 | }, |
339 | .num_consumer_supplies = 1, | 346 | .num_consumer_supplies = ARRAY_SIZE(beagle_vmmc1_supply), |
340 | .consumer_supplies = &beagle_vmmc1_supply, | 347 | .consumer_supplies = beagle_vmmc1_supply, |
341 | }; | 348 | }; |
342 | 349 | ||
343 | /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ | 350 | /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ |
@@ -351,62 +358,15 @@ static struct regulator_init_data beagle_vsim = { | |||
351 | | REGULATOR_CHANGE_MODE | 358 | | REGULATOR_CHANGE_MODE |
352 | | REGULATOR_CHANGE_STATUS, | 359 | | REGULATOR_CHANGE_STATUS, |
353 | }, | 360 | }, |
354 | .num_consumer_supplies = 1, | 361 | .num_consumer_supplies = ARRAY_SIZE(beagle_vsim_supply), |
355 | .consumer_supplies = &beagle_vsim_supply, | 362 | .consumer_supplies = beagle_vsim_supply, |
356 | }; | ||
357 | |||
358 | /* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */ | ||
359 | static struct regulator_init_data beagle_vdac = { | ||
360 | .constraints = { | ||
361 | .min_uV = 1800000, | ||
362 | .max_uV = 1800000, | ||
363 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
364 | | REGULATOR_MODE_STANDBY, | ||
365 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
366 | | REGULATOR_CHANGE_STATUS, | ||
367 | }, | ||
368 | .num_consumer_supplies = 1, | ||
369 | .consumer_supplies = &beagle_vdac_supply, | ||
370 | }; | ||
371 | |||
372 | /* VPLL2 for digital video outputs */ | ||
373 | static struct regulator_init_data beagle_vpll2 = { | ||
374 | .constraints = { | ||
375 | .name = "VDVI", | ||
376 | .min_uV = 1800000, | ||
377 | .max_uV = 1800000, | ||
378 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
379 | | REGULATOR_MODE_STANDBY, | ||
380 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
381 | | REGULATOR_CHANGE_STATUS, | ||
382 | }, | ||
383 | .num_consumer_supplies = ARRAY_SIZE(beagle_vdvi_supplies), | ||
384 | .consumer_supplies = beagle_vdvi_supplies, | ||
385 | }; | ||
386 | |||
387 | static struct twl4030_usb_data beagle_usb_data = { | ||
388 | .usb_mode = T2_USB_MODE_ULPI, | ||
389 | }; | ||
390 | |||
391 | static struct twl4030_codec_audio_data beagle_audio_data; | ||
392 | |||
393 | static struct twl4030_codec_data beagle_codec_data = { | ||
394 | .audio_mclk = 26000000, | ||
395 | .audio = &beagle_audio_data, | ||
396 | }; | 363 | }; |
397 | 364 | ||
398 | static struct twl4030_platform_data beagle_twldata = { | 365 | static struct twl4030_platform_data beagle_twldata = { |
399 | .irq_base = TWL4030_IRQ_BASE, | ||
400 | .irq_end = TWL4030_IRQ_END, | ||
401 | |||
402 | /* platform_data for children goes here */ | 366 | /* platform_data for children goes here */ |
403 | .usb = &beagle_usb_data, | ||
404 | .gpio = &beagle_gpio_data, | 367 | .gpio = &beagle_gpio_data, |
405 | .codec = &beagle_codec_data, | ||
406 | .vmmc1 = &beagle_vmmc1, | 368 | .vmmc1 = &beagle_vmmc1, |
407 | .vsim = &beagle_vsim, | 369 | .vsim = &beagle_vsim, |
408 | .vdac = &beagle_vdac, | ||
409 | .vpll2 = &beagle_vpll2, | ||
410 | }; | 370 | }; |
411 | 371 | ||
412 | static struct i2c_board_info __initdata beagle_i2c_eeprom[] = { | 372 | static struct i2c_board_info __initdata beagle_i2c_eeprom[] = { |
@@ -417,6 +377,12 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = { | |||
417 | 377 | ||
418 | static int __init omap3_beagle_i2c_init(void) | 378 | static int __init omap3_beagle_i2c_init(void) |
419 | { | 379 | { |
380 | omap3_pmic_get_config(&beagle_twldata, | ||
381 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO, | ||
382 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); | ||
383 | |||
384 | beagle_twldata.vpll2->constraints.name = "VDVI"; | ||
385 | |||
420 | omap3_pmic_init("twl4030", &beagle_twldata); | 386 | omap3_pmic_init("twl4030", &beagle_twldata); |
421 | /* Bus 3 is attached to the DVI port where devices like the pico DLP | 387 | /* Bus 3 is attached to the DVI port where devices like the pico DLP |
422 | * projector don't work reliably with 400kHz */ | 388 | * projector don't work reliably with 400kHz */ |
@@ -458,7 +424,8 @@ static struct platform_device leds_gpio = { | |||
458 | static struct gpio_keys_button gpio_buttons[] = { | 424 | static struct gpio_keys_button gpio_buttons[] = { |
459 | { | 425 | { |
460 | .code = BTN_EXTRA, | 426 | .code = BTN_EXTRA, |
461 | .gpio = 7, | 427 | /* Dynamically assigned depending on board */ |
428 | .gpio = -EINVAL, | ||
462 | .desc = "user", | 429 | .desc = "user", |
463 | .wakeup = 1, | 430 | .wakeup = 1, |
464 | }, | 431 | }, |
@@ -486,10 +453,7 @@ static void __init omap3_beagle_init_early(void) | |||
486 | 453 | ||
487 | static void __init omap3_beagle_init_irq(void) | 454 | static void __init omap3_beagle_init_irq(void) |
488 | { | 455 | { |
489 | omap_init_irq(); | 456 | omap3_init_irq(); |
490 | #ifdef CONFIG_OMAP_32K_TIMER | ||
491 | omap2_gp_clockevent_set_gptimer(12); | ||
492 | #endif | ||
493 | } | 457 | } |
494 | 458 | ||
495 | static struct platform_device *omap3_beagle_devices[] __initdata = { | 459 | static struct platform_device *omap3_beagle_devices[] __initdata = { |
@@ -525,8 +489,8 @@ static void __init beagle_opp_init(void) | |||
525 | return; | 489 | return; |
526 | } | 490 | } |
527 | 491 | ||
528 | /* Custom OPP enabled for XM */ | 492 | /* Custom OPP enabled for all xM versions */ |
529 | if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { | 493 | if (cpu_is_omap3630()) { |
530 | struct omap_hwmod *mh = omap_hwmod_lookup("mpu"); | 494 | struct omap_hwmod *mh = omap_hwmod_lookup("mpu"); |
531 | struct omap_hwmod *dh = omap_hwmod_lookup("iva"); | 495 | struct omap_hwmod *dh = omap_hwmod_lookup("iva"); |
532 | struct device *dev; | 496 | struct device *dev; |
@@ -566,6 +530,9 @@ static void __init omap3_beagle_init(void) | |||
566 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 530 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
567 | omap3_beagle_init_rev(); | 531 | omap3_beagle_init_rev(); |
568 | omap3_beagle_i2c_init(); | 532 | omap3_beagle_i2c_init(); |
533 | |||
534 | gpio_buttons[0].gpio = beagle_config.usr_button_gpio; | ||
535 | |||
569 | platform_add_devices(omap3_beagle_devices, | 536 | platform_add_devices(omap3_beagle_devices, |
570 | ARRAY_SIZE(omap3_beagle_devices)); | 537 | ARRAY_SIZE(omap3_beagle_devices)); |
571 | omap_display_init(&beagle_dss_data); | 538 | omap_display_init(&beagle_dss_data); |
@@ -599,5 +566,5 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") | |||
599 | .init_early = omap3_beagle_init_early, | 566 | .init_early = omap3_beagle_init_early, |
600 | .init_irq = omap3_beagle_init_irq, | 567 | .init_irq = omap3_beagle_init_irq, |
601 | .init_machine = omap3_beagle_init, | 568 | .init_machine = omap3_beagle_init, |
602 | .timer = &omap_timer, | 569 | .timer = &omap3_secure_timer, |
603 | MACHINE_END | 570 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index b4d43464a303..c452b3f3331a 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
@@ -273,12 +273,12 @@ static struct omap_dss_board_info omap3_evm_dss_data = { | |||
273 | .default_device = &omap3_evm_lcd_device, | 273 | .default_device = &omap3_evm_lcd_device, |
274 | }; | 274 | }; |
275 | 275 | ||
276 | static struct regulator_consumer_supply omap3evm_vmmc1_supply = { | 276 | static struct regulator_consumer_supply omap3evm_vmmc1_supply[] = { |
277 | .supply = "vmmc", | 277 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
278 | }; | 278 | }; |
279 | 279 | ||
280 | static struct regulator_consumer_supply omap3evm_vsim_supply = { | 280 | static struct regulator_consumer_supply omap3evm_vsim_supply[] = { |
281 | .supply = "vmmc_aux", | 281 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"), |
282 | }; | 282 | }; |
283 | 283 | ||
284 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ | 284 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ |
@@ -292,8 +292,8 @@ static struct regulator_init_data omap3evm_vmmc1 = { | |||
292 | | REGULATOR_CHANGE_MODE | 292 | | REGULATOR_CHANGE_MODE |
293 | | REGULATOR_CHANGE_STATUS, | 293 | | REGULATOR_CHANGE_STATUS, |
294 | }, | 294 | }, |
295 | .num_consumer_supplies = 1, | 295 | .num_consumer_supplies = ARRAY_SIZE(omap3evm_vmmc1_supply), |
296 | .consumer_supplies = &omap3evm_vmmc1_supply, | 296 | .consumer_supplies = omap3evm_vmmc1_supply, |
297 | }; | 297 | }; |
298 | 298 | ||
299 | /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ | 299 | /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ |
@@ -307,8 +307,8 @@ static struct regulator_init_data omap3evm_vsim = { | |||
307 | | REGULATOR_CHANGE_MODE | 307 | | REGULATOR_CHANGE_MODE |
308 | | REGULATOR_CHANGE_STATUS, | 308 | | REGULATOR_CHANGE_STATUS, |
309 | }, | 309 | }, |
310 | .num_consumer_supplies = 1, | 310 | .num_consumer_supplies = ARRAY_SIZE(omap3evm_vsim_supply), |
311 | .consumer_supplies = &omap3evm_vsim_supply, | 311 | .consumer_supplies = omap3evm_vsim_supply, |
312 | }; | 312 | }; |
313 | 313 | ||
314 | static struct omap2_hsmmc_info mmc[] = { | 314 | static struct omap2_hsmmc_info mmc[] = { |
@@ -365,10 +365,6 @@ static int omap3evm_twl_gpio_setup(struct device *dev, | |||
365 | mmc[0].gpio_cd = gpio + 0; | 365 | mmc[0].gpio_cd = gpio + 0; |
366 | omap2_hsmmc_init(mmc); | 366 | omap2_hsmmc_init(mmc); |
367 | 367 | ||
368 | /* link regulators to MMC adapters */ | ||
369 | omap3evm_vmmc1_supply.dev = mmc[0].dev; | ||
370 | omap3evm_vsim_supply.dev = mmc[0].dev; | ||
371 | |||
372 | /* | 368 | /* |
373 | * Most GPIOs are for USB OTG. Some are mostly sent to | 369 | * Most GPIOs are for USB OTG. Some are mostly sent to |
374 | * the P2 connector; notably LEDA for the LCD backlight. | 370 | * the P2 connector; notably LEDA for the LCD backlight. |
@@ -400,10 +396,6 @@ static struct twl4030_gpio_platform_data omap3evm_gpio_data = { | |||
400 | .setup = omap3evm_twl_gpio_setup, | 396 | .setup = omap3evm_twl_gpio_setup, |
401 | }; | 397 | }; |
402 | 398 | ||
403 | static struct twl4030_usb_data omap3evm_usb_data = { | ||
404 | .usb_mode = T2_USB_MODE_ULPI, | ||
405 | }; | ||
406 | |||
407 | static uint32_t board_keymap[] = { | 399 | static uint32_t board_keymap[] = { |
408 | KEY(0, 0, KEY_LEFT), | 400 | KEY(0, 0, KEY_LEFT), |
409 | KEY(0, 1, KEY_DOWN), | 401 | KEY(0, 1, KEY_DOWN), |
@@ -438,58 +430,10 @@ static struct twl4030_keypad_data omap3evm_kp_data = { | |||
438 | .rep = 1, | 430 | .rep = 1, |
439 | }; | 431 | }; |
440 | 432 | ||
441 | static struct twl4030_madc_platform_data omap3evm_madc_data = { | ||
442 | .irq_line = 1, | ||
443 | }; | ||
444 | |||
445 | static struct twl4030_codec_audio_data omap3evm_audio_data; | ||
446 | |||
447 | static struct twl4030_codec_data omap3evm_codec_data = { | ||
448 | .audio_mclk = 26000000, | ||
449 | .audio = &omap3evm_audio_data, | ||
450 | }; | ||
451 | |||
452 | static struct regulator_consumer_supply omap3_evm_vdda_dac_supply = | ||
453 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); | ||
454 | |||
455 | /* VDAC for DSS driving S-Video */ | ||
456 | static struct regulator_init_data omap3_evm_vdac = { | ||
457 | .constraints = { | ||
458 | .min_uV = 1800000, | ||
459 | .max_uV = 1800000, | ||
460 | .apply_uV = true, | ||
461 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
462 | | REGULATOR_MODE_STANDBY, | ||
463 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
464 | | REGULATOR_CHANGE_STATUS, | ||
465 | }, | ||
466 | .num_consumer_supplies = 1, | ||
467 | .consumer_supplies = &omap3_evm_vdda_dac_supply, | ||
468 | }; | ||
469 | |||
470 | /* VPLL2 for digital video outputs */ | ||
471 | static struct regulator_consumer_supply omap3_evm_vpll2_supplies[] = { | ||
472 | REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||
473 | REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||
474 | }; | ||
475 | |||
476 | static struct regulator_init_data omap3_evm_vpll2 = { | ||
477 | .constraints = { | ||
478 | .min_uV = 1800000, | ||
479 | .max_uV = 1800000, | ||
480 | .apply_uV = true, | ||
481 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
482 | | REGULATOR_MODE_STANDBY, | ||
483 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
484 | | REGULATOR_CHANGE_STATUS, | ||
485 | }, | ||
486 | .num_consumer_supplies = ARRAY_SIZE(omap3_evm_vpll2_supplies), | ||
487 | .consumer_supplies = omap3_evm_vpll2_supplies, | ||
488 | }; | ||
489 | |||
490 | /* ads7846 on SPI */ | 433 | /* ads7846 on SPI */ |
491 | static struct regulator_consumer_supply omap3evm_vio_supply = | 434 | static struct regulator_consumer_supply omap3evm_vio_supply[] = { |
492 | REGULATOR_SUPPLY("vcc", "spi1.0"); | 435 | REGULATOR_SUPPLY("vcc", "spi1.0"), |
436 | }; | ||
493 | 437 | ||
494 | /* VIO for ads7846 */ | 438 | /* VIO for ads7846 */ |
495 | static struct regulator_init_data omap3evm_vio = { | 439 | static struct regulator_init_data omap3evm_vio = { |
@@ -502,8 +446,8 @@ static struct regulator_init_data omap3evm_vio = { | |||
502 | .valid_ops_mask = REGULATOR_CHANGE_MODE | 446 | .valid_ops_mask = REGULATOR_CHANGE_MODE |
503 | | REGULATOR_CHANGE_STATUS, | 447 | | REGULATOR_CHANGE_STATUS, |
504 | }, | 448 | }, |
505 | .num_consumer_supplies = 1, | 449 | .num_consumer_supplies = ARRAY_SIZE(omap3evm_vio_supply), |
506 | .consumer_supplies = &omap3evm_vio_supply, | 450 | .consumer_supplies = omap3evm_vio_supply, |
507 | }; | 451 | }; |
508 | 452 | ||
509 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | 453 | #ifdef CONFIG_WL12XX_PLATFORM_DATA |
@@ -511,16 +455,17 @@ static struct regulator_init_data omap3evm_vio = { | |||
511 | #define OMAP3EVM_WLAN_PMENA_GPIO (150) | 455 | #define OMAP3EVM_WLAN_PMENA_GPIO (150) |
512 | #define OMAP3EVM_WLAN_IRQ_GPIO (149) | 456 | #define OMAP3EVM_WLAN_IRQ_GPIO (149) |
513 | 457 | ||
514 | static struct regulator_consumer_supply omap3evm_vmmc2_supply = | 458 | static struct regulator_consumer_supply omap3evm_vmmc2_supply[] = { |
515 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"); | 459 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"), |
460 | }; | ||
516 | 461 | ||
517 | /* VMMC2 for driving the WL12xx module */ | 462 | /* VMMC2 for driving the WL12xx module */ |
518 | static struct regulator_init_data omap3evm_vmmc2 = { | 463 | static struct regulator_init_data omap3evm_vmmc2 = { |
519 | .constraints = { | 464 | .constraints = { |
520 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 465 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
521 | }, | 466 | }, |
522 | .num_consumer_supplies = 1, | 467 | .num_consumer_supplies = ARRAY_SIZE(omap3evm_vmmc2_supply), |
523 | .consumer_supplies = &omap3evm_vmmc2_supply, | 468 | .consumer_supplies = omap3evm_vmmc2_supply, |
524 | }; | 469 | }; |
525 | 470 | ||
526 | static struct fixed_voltage_config omap3evm_vwlan = { | 471 | static struct fixed_voltage_config omap3evm_vwlan = { |
@@ -548,17 +493,9 @@ struct wl12xx_platform_data omap3evm_wlan_data __initdata = { | |||
548 | #endif | 493 | #endif |
549 | 494 | ||
550 | static struct twl4030_platform_data omap3evm_twldata = { | 495 | static struct twl4030_platform_data omap3evm_twldata = { |
551 | .irq_base = TWL4030_IRQ_BASE, | ||
552 | .irq_end = TWL4030_IRQ_END, | ||
553 | |||
554 | /* platform_data for children goes here */ | 496 | /* platform_data for children goes here */ |
555 | .keypad = &omap3evm_kp_data, | 497 | .keypad = &omap3evm_kp_data, |
556 | .madc = &omap3evm_madc_data, | ||
557 | .usb = &omap3evm_usb_data, | ||
558 | .gpio = &omap3evm_gpio_data, | 498 | .gpio = &omap3evm_gpio_data, |
559 | .codec = &omap3evm_codec_data, | ||
560 | .vdac = &omap3_evm_vdac, | ||
561 | .vpll2 = &omap3_evm_vpll2, | ||
562 | .vio = &omap3evm_vio, | 499 | .vio = &omap3evm_vio, |
563 | .vmmc1 = &omap3evm_vmmc1, | 500 | .vmmc1 = &omap3evm_vmmc1, |
564 | .vsim = &omap3evm_vsim, | 501 | .vsim = &omap3evm_vsim, |
@@ -566,6 +503,14 @@ static struct twl4030_platform_data omap3evm_twldata = { | |||
566 | 503 | ||
567 | static int __init omap3_evm_i2c_init(void) | 504 | static int __init omap3_evm_i2c_init(void) |
568 | { | 505 | { |
506 | omap3_pmic_get_config(&omap3evm_twldata, | ||
507 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC | | ||
508 | TWL_COMMON_PDATA_AUDIO, | ||
509 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); | ||
510 | |||
511 | omap3evm_twldata.vdac->constraints.apply_uV = true; | ||
512 | omap3evm_twldata.vpll2->constraints.apply_uV = true; | ||
513 | |||
569 | omap3_pmic_init("twl4030", &omap3evm_twldata); | 514 | omap3_pmic_init("twl4030", &omap3evm_twldata); |
570 | omap_register_i2c_bus(2, 400, NULL, 0); | 515 | omap_register_i2c_bus(2, 400, NULL, 0); |
571 | omap_register_i2c_bus(3, 400, NULL, 0); | 516 | omap_register_i2c_bus(3, 400, NULL, 0); |
@@ -740,7 +685,7 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM") | |||
740 | .reserve = omap_reserve, | 685 | .reserve = omap_reserve, |
741 | .map_io = omap3_map_io, | 686 | .map_io = omap3_map_io, |
742 | .init_early = omap3_evm_init_early, | 687 | .init_early = omap3_evm_init_early, |
743 | .init_irq = omap_init_irq, | 688 | .init_irq = omap3_init_irq, |
744 | .init_machine = omap3_evm_init, | 689 | .init_machine = omap3_evm_init, |
745 | .timer = &omap_timer, | 690 | .timer = &omap3_timer, |
746 | MACHINE_END | 691 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index 60d9be49dbab..703aeb5b8fd4 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c | |||
@@ -35,7 +35,6 @@ | |||
35 | 35 | ||
36 | #include "mux.h" | 36 | #include "mux.h" |
37 | #include "hsmmc.h" | 37 | #include "hsmmc.h" |
38 | #include "timer-gp.h" | ||
39 | #include "control.h" | 38 | #include "control.h" |
40 | #include "common-board-devices.h" | 39 | #include "common-board-devices.h" |
41 | 40 | ||
@@ -55,8 +54,8 @@ | |||
55 | #define OMAP3_TORPEDO_MMC_GPIO_CD 127 | 54 | #define OMAP3_TORPEDO_MMC_GPIO_CD 127 |
56 | #define OMAP3_TORPEDO_SMSC911X_GPIO_IRQ 129 | 55 | #define OMAP3_TORPEDO_SMSC911X_GPIO_IRQ 129 |
57 | 56 | ||
58 | static struct regulator_consumer_supply omap3logic_vmmc1_supply = { | 57 | static struct regulator_consumer_supply omap3logic_vmmc1_supply[] = { |
59 | .supply = "vmmc", | 58 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
60 | }; | 59 | }; |
61 | 60 | ||
62 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ | 61 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ |
@@ -71,8 +70,8 @@ static struct regulator_init_data omap3logic_vmmc1 = { | |||
71 | | REGULATOR_CHANGE_MODE | 70 | | REGULATOR_CHANGE_MODE |
72 | | REGULATOR_CHANGE_STATUS, | 71 | | REGULATOR_CHANGE_STATUS, |
73 | }, | 72 | }, |
74 | .num_consumer_supplies = 1, | 73 | .num_consumer_supplies = ARRAY_SIZE(omap3logic_vmmc1_supply), |
75 | .consumer_supplies = &omap3logic_vmmc1_supply, | 74 | .consumer_supplies = omap3logic_vmmc1_supply, |
76 | }; | 75 | }; |
77 | 76 | ||
78 | static struct twl4030_gpio_platform_data omap3logic_gpio_data = { | 77 | static struct twl4030_gpio_platform_data omap3logic_gpio_data = { |
@@ -130,8 +129,6 @@ static void __init board_mmc_init(void) | |||
130 | } | 129 | } |
131 | 130 | ||
132 | omap2_hsmmc_init(board_mmc_info); | 131 | omap2_hsmmc_init(board_mmc_info); |
133 | /* link regulators to MMC adapters */ | ||
134 | omap3logic_vmmc1_supply.dev = board_mmc_info[0].dev; | ||
135 | } | 132 | } |
136 | 133 | ||
137 | static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = { | 134 | static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = { |
@@ -215,16 +212,16 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board") | |||
215 | .boot_params = 0x80000100, | 212 | .boot_params = 0x80000100, |
216 | .map_io = omap3_map_io, | 213 | .map_io = omap3_map_io, |
217 | .init_early = omap3logic_init_early, | 214 | .init_early = omap3logic_init_early, |
218 | .init_irq = omap_init_irq, | 215 | .init_irq = omap3_init_irq, |
219 | .init_machine = omap3logic_init, | 216 | .init_machine = omap3logic_init, |
220 | .timer = &omap_timer, | 217 | .timer = &omap3_timer, |
221 | MACHINE_END | 218 | MACHINE_END |
222 | 219 | ||
223 | MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") | 220 | MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") |
224 | .boot_params = 0x80000100, | 221 | .boot_params = 0x80000100, |
225 | .map_io = omap3_map_io, | 222 | .map_io = omap3_map_io, |
226 | .init_early = omap3logic_init_early, | 223 | .init_early = omap3logic_init_early, |
227 | .init_irq = omap_init_irq, | 224 | .init_irq = omap3_init_irq, |
228 | .init_machine = omap3logic_init, | 225 | .init_machine = omap3logic_init, |
229 | .timer = &omap_timer, | 226 | .timer = &omap3_timer, |
230 | MACHINE_END | 227 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index 23f71d40883e..080d7bd6795e 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
@@ -320,17 +320,17 @@ static struct twl4030_gpio_platform_data omap3pandora_gpio_data = { | |||
320 | .setup = omap3pandora_twl_gpio_setup, | 320 | .setup = omap3pandora_twl_gpio_setup, |
321 | }; | 321 | }; |
322 | 322 | ||
323 | static struct regulator_consumer_supply pandora_vmmc1_supply = | 323 | static struct regulator_consumer_supply pandora_vmmc1_supply[] = { |
324 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"); | 324 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
325 | 325 | }; | |
326 | static struct regulator_consumer_supply pandora_vmmc2_supply = | ||
327 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"); | ||
328 | 326 | ||
329 | static struct regulator_consumer_supply pandora_vmmc3_supply = | 327 | static struct regulator_consumer_supply pandora_vmmc2_supply[] = { |
330 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"); | 328 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1") |
329 | }; | ||
331 | 330 | ||
332 | static struct regulator_consumer_supply pandora_vdda_dac_supply = | 331 | static struct regulator_consumer_supply pandora_vmmc3_supply[] = { |
333 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); | 332 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"), |
333 | }; | ||
334 | 334 | ||
335 | static struct regulator_consumer_supply pandora_vdds_supplies[] = { | 335 | static struct regulator_consumer_supply pandora_vdds_supplies[] = { |
336 | REGULATOR_SUPPLY("vdds_sdi", "omapdss"), | 336 | REGULATOR_SUPPLY("vdds_sdi", "omapdss"), |
@@ -338,11 +338,13 @@ static struct regulator_consumer_supply pandora_vdds_supplies[] = { | |||
338 | REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | 338 | REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), |
339 | }; | 339 | }; |
340 | 340 | ||
341 | static struct regulator_consumer_supply pandora_vcc_lcd_supply = | 341 | static struct regulator_consumer_supply pandora_vcc_lcd_supply[] = { |
342 | REGULATOR_SUPPLY("vcc", "display0"); | 342 | REGULATOR_SUPPLY("vcc", "display0"), |
343 | }; | ||
343 | 344 | ||
344 | static struct regulator_consumer_supply pandora_usb_phy_supply = | 345 | static struct regulator_consumer_supply pandora_usb_phy_supply[] = { |
345 | REGULATOR_SUPPLY("hsusb0", "ehci-omap.0"); | 346 | REGULATOR_SUPPLY("hsusb0", "ehci-omap.0"), |
347 | }; | ||
346 | 348 | ||
347 | /* ads7846 on SPI and 2 nub controllers on I2C */ | 349 | /* ads7846 on SPI and 2 nub controllers on I2C */ |
348 | static struct regulator_consumer_supply pandora_vaux4_supplies[] = { | 350 | static struct regulator_consumer_supply pandora_vaux4_supplies[] = { |
@@ -351,8 +353,9 @@ static struct regulator_consumer_supply pandora_vaux4_supplies[] = { | |||
351 | REGULATOR_SUPPLY("vcc", "3-0067"), | 353 | REGULATOR_SUPPLY("vcc", "3-0067"), |
352 | }; | 354 | }; |
353 | 355 | ||
354 | static struct regulator_consumer_supply pandora_adac_supply = | 356 | static struct regulator_consumer_supply pandora_adac_supply[] = { |
355 | REGULATOR_SUPPLY("vcc", "soc-audio"); | 357 | REGULATOR_SUPPLY("vcc", "soc-audio"), |
358 | }; | ||
356 | 359 | ||
357 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ | 360 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ |
358 | static struct regulator_init_data pandora_vmmc1 = { | 361 | static struct regulator_init_data pandora_vmmc1 = { |
@@ -365,8 +368,8 @@ static struct regulator_init_data pandora_vmmc1 = { | |||
365 | | REGULATOR_CHANGE_MODE | 368 | | REGULATOR_CHANGE_MODE |
366 | | REGULATOR_CHANGE_STATUS, | 369 | | REGULATOR_CHANGE_STATUS, |
367 | }, | 370 | }, |
368 | .num_consumer_supplies = 1, | 371 | .num_consumer_supplies = ARRAY_SIZE(pandora_vmmc1_supply), |
369 | .consumer_supplies = &pandora_vmmc1_supply, | 372 | .consumer_supplies = pandora_vmmc1_supply, |
370 | }; | 373 | }; |
371 | 374 | ||
372 | /* VMMC2 for MMC2 pins CMD, CLK, DAT0..DAT3 (max 100 mA) */ | 375 | /* VMMC2 for MMC2 pins CMD, CLK, DAT0..DAT3 (max 100 mA) */ |
@@ -380,38 +383,8 @@ static struct regulator_init_data pandora_vmmc2 = { | |||
380 | | REGULATOR_CHANGE_MODE | 383 | | REGULATOR_CHANGE_MODE |
381 | | REGULATOR_CHANGE_STATUS, | 384 | | REGULATOR_CHANGE_STATUS, |
382 | }, | 385 | }, |
383 | .num_consumer_supplies = 1, | 386 | .num_consumer_supplies = ARRAY_SIZE(pandora_vmmc2_supply), |
384 | .consumer_supplies = &pandora_vmmc2_supply, | 387 | .consumer_supplies = pandora_vmmc2_supply, |
385 | }; | ||
386 | |||
387 | /* VDAC for DSS driving S-Video */ | ||
388 | static struct regulator_init_data pandora_vdac = { | ||
389 | .constraints = { | ||
390 | .min_uV = 1800000, | ||
391 | .max_uV = 1800000, | ||
392 | .apply_uV = true, | ||
393 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
394 | | REGULATOR_MODE_STANDBY, | ||
395 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
396 | | REGULATOR_CHANGE_STATUS, | ||
397 | }, | ||
398 | .num_consumer_supplies = 1, | ||
399 | .consumer_supplies = &pandora_vdda_dac_supply, | ||
400 | }; | ||
401 | |||
402 | /* VPLL2 for digital video outputs */ | ||
403 | static struct regulator_init_data pandora_vpll2 = { | ||
404 | .constraints = { | ||
405 | .min_uV = 1800000, | ||
406 | .max_uV = 1800000, | ||
407 | .apply_uV = true, | ||
408 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
409 | | REGULATOR_MODE_STANDBY, | ||
410 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
411 | | REGULATOR_CHANGE_STATUS, | ||
412 | }, | ||
413 | .num_consumer_supplies = ARRAY_SIZE(pandora_vdds_supplies), | ||
414 | .consumer_supplies = pandora_vdds_supplies, | ||
415 | }; | 388 | }; |
416 | 389 | ||
417 | /* VAUX1 for LCD */ | 390 | /* VAUX1 for LCD */ |
@@ -425,8 +398,8 @@ static struct regulator_init_data pandora_vaux1 = { | |||
425 | .valid_ops_mask = REGULATOR_CHANGE_MODE | 398 | .valid_ops_mask = REGULATOR_CHANGE_MODE |
426 | | REGULATOR_CHANGE_STATUS, | 399 | | REGULATOR_CHANGE_STATUS, |
427 | }, | 400 | }, |
428 | .num_consumer_supplies = 1, | 401 | .num_consumer_supplies = ARRAY_SIZE(pandora_vcc_lcd_supply), |
429 | .consumer_supplies = &pandora_vcc_lcd_supply, | 402 | .consumer_supplies = pandora_vcc_lcd_supply, |
430 | }; | 403 | }; |
431 | 404 | ||
432 | /* VAUX2 for USB host PHY */ | 405 | /* VAUX2 for USB host PHY */ |
@@ -440,8 +413,8 @@ static struct regulator_init_data pandora_vaux2 = { | |||
440 | .valid_ops_mask = REGULATOR_CHANGE_MODE | 413 | .valid_ops_mask = REGULATOR_CHANGE_MODE |
441 | | REGULATOR_CHANGE_STATUS, | 414 | | REGULATOR_CHANGE_STATUS, |
442 | }, | 415 | }, |
443 | .num_consumer_supplies = 1, | 416 | .num_consumer_supplies = ARRAY_SIZE(pandora_usb_phy_supply), |
444 | .consumer_supplies = &pandora_usb_phy_supply, | 417 | .consumer_supplies = pandora_usb_phy_supply, |
445 | }; | 418 | }; |
446 | 419 | ||
447 | /* VAUX4 for ads7846 and nubs */ | 420 | /* VAUX4 for ads7846 and nubs */ |
@@ -470,8 +443,8 @@ static struct regulator_init_data pandora_vsim = { | |||
470 | .valid_ops_mask = REGULATOR_CHANGE_MODE | 443 | .valid_ops_mask = REGULATOR_CHANGE_MODE |
471 | | REGULATOR_CHANGE_STATUS, | 444 | | REGULATOR_CHANGE_STATUS, |
472 | }, | 445 | }, |
473 | .num_consumer_supplies = 1, | 446 | .num_consumer_supplies = ARRAY_SIZE(pandora_adac_supply), |
474 | .consumer_supplies = &pandora_adac_supply, | 447 | .consumer_supplies = pandora_adac_supply, |
475 | }; | 448 | }; |
476 | 449 | ||
477 | /* Fixed regulator internal to Wifi module */ | 450 | /* Fixed regulator internal to Wifi module */ |
@@ -479,8 +452,8 @@ static struct regulator_init_data pandora_vmmc3 = { | |||
479 | .constraints = { | 452 | .constraints = { |
480 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 453 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
481 | }, | 454 | }, |
482 | .num_consumer_supplies = 1, | 455 | .num_consumer_supplies = ARRAY_SIZE(pandora_vmmc3_supply), |
483 | .consumer_supplies = &pandora_vmmc3_supply, | 456 | .consumer_supplies = pandora_vmmc3_supply, |
484 | }; | 457 | }; |
485 | 458 | ||
486 | static struct fixed_voltage_config pandora_vwlan = { | 459 | static struct fixed_voltage_config pandora_vwlan = { |
@@ -501,29 +474,12 @@ static struct platform_device pandora_vwlan_device = { | |||
501 | }, | 474 | }, |
502 | }; | 475 | }; |
503 | 476 | ||
504 | static struct twl4030_usb_data omap3pandora_usb_data = { | ||
505 | .usb_mode = T2_USB_MODE_ULPI, | ||
506 | }; | ||
507 | |||
508 | static struct twl4030_codec_audio_data omap3pandora_audio_data; | ||
509 | |||
510 | static struct twl4030_codec_data omap3pandora_codec_data = { | ||
511 | .audio_mclk = 26000000, | ||
512 | .audio = &omap3pandora_audio_data, | ||
513 | }; | ||
514 | |||
515 | static struct twl4030_bci_platform_data pandora_bci_data; | 477 | static struct twl4030_bci_platform_data pandora_bci_data; |
516 | 478 | ||
517 | static struct twl4030_platform_data omap3pandora_twldata = { | 479 | static struct twl4030_platform_data omap3pandora_twldata = { |
518 | .irq_base = TWL4030_IRQ_BASE, | ||
519 | .irq_end = TWL4030_IRQ_END, | ||
520 | .gpio = &omap3pandora_gpio_data, | 480 | .gpio = &omap3pandora_gpio_data, |
521 | .usb = &omap3pandora_usb_data, | ||
522 | .codec = &omap3pandora_codec_data, | ||
523 | .vmmc1 = &pandora_vmmc1, | 481 | .vmmc1 = &pandora_vmmc1, |
524 | .vmmc2 = &pandora_vmmc2, | 482 | .vmmc2 = &pandora_vmmc2, |
525 | .vdac = &pandora_vdac, | ||
526 | .vpll2 = &pandora_vpll2, | ||
527 | .vaux1 = &pandora_vaux1, | 483 | .vaux1 = &pandora_vaux1, |
528 | .vaux2 = &pandora_vaux2, | 484 | .vaux2 = &pandora_vaux2, |
529 | .vaux4 = &pandora_vaux4, | 485 | .vaux4 = &pandora_vaux4, |
@@ -541,6 +497,17 @@ static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = { | |||
541 | 497 | ||
542 | static int __init omap3pandora_i2c_init(void) | 498 | static int __init omap3pandora_i2c_init(void) |
543 | { | 499 | { |
500 | omap3_pmic_get_config(&omap3pandora_twldata, | ||
501 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO, | ||
502 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); | ||
503 | |||
504 | omap3pandora_twldata.vdac->constraints.apply_uV = true; | ||
505 | |||
506 | omap3pandora_twldata.vpll2->constraints.apply_uV = true; | ||
507 | omap3pandora_twldata.vpll2->num_consumer_supplies = | ||
508 | ARRAY_SIZE(pandora_vdds_supplies); | ||
509 | omap3pandora_twldata.vpll2->consumer_supplies = pandora_vdds_supplies; | ||
510 | |||
544 | omap3_pmic_init("tps65950", &omap3pandora_twldata); | 511 | omap3_pmic_init("tps65950", &omap3pandora_twldata); |
545 | /* i2c2 pins are not connected */ | 512 | /* i2c2 pins are not connected */ |
546 | omap_register_i2c_bus(3, 100, omap3pandora_i2c3_boardinfo, | 513 | omap_register_i2c_bus(3, 100, omap3pandora_i2c3_boardinfo, |
@@ -643,7 +610,7 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console") | |||
643 | .reserve = omap_reserve, | 610 | .reserve = omap_reserve, |
644 | .map_io = omap3_map_io, | 611 | .map_io = omap3_map_io, |
645 | .init_early = omap3pandora_init_early, | 612 | .init_early = omap3pandora_init_early, |
646 | .init_irq = omap_init_irq, | 613 | .init_irq = omap3_init_irq, |
647 | .init_machine = omap3pandora_init, | 614 | .init_machine = omap3pandora_init, |
648 | .timer = &omap_timer, | 615 | .timer = &omap3_timer, |
649 | MACHINE_END | 616 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index 0c108a212ea2..8e104980ea26 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
@@ -52,7 +52,6 @@ | |||
52 | #include "sdram-micron-mt46h32m32lf-6.h" | 52 | #include "sdram-micron-mt46h32m32lf-6.h" |
53 | #include "mux.h" | 53 | #include "mux.h" |
54 | #include "hsmmc.h" | 54 | #include "hsmmc.h" |
55 | #include "timer-gp.h" | ||
56 | #include "common-board-devices.h" | 55 | #include "common-board-devices.h" |
57 | 56 | ||
58 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) | 57 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) |
@@ -206,12 +205,12 @@ static struct omap_dss_board_info omap3_stalker_dss_data = { | |||
206 | .default_device = &omap3_stalker_dvi_device, | 205 | .default_device = &omap3_stalker_dvi_device, |
207 | }; | 206 | }; |
208 | 207 | ||
209 | static struct regulator_consumer_supply omap3stalker_vmmc1_supply = { | 208 | static struct regulator_consumer_supply omap3stalker_vmmc1_supply[] = { |
210 | .supply = "vmmc", | 209 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
211 | }; | 210 | }; |
212 | 211 | ||
213 | static struct regulator_consumer_supply omap3stalker_vsim_supply = { | 212 | static struct regulator_consumer_supply omap3stalker_vsim_supply[] = { |
214 | .supply = "vmmc_aux", | 213 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"), |
215 | }; | 214 | }; |
216 | 215 | ||
217 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ | 216 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ |
@@ -224,8 +223,8 @@ static struct regulator_init_data omap3stalker_vmmc1 = { | |||
224 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | 223 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
225 | | REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS, | 224 | | REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS, |
226 | }, | 225 | }, |
227 | .num_consumer_supplies = 1, | 226 | .num_consumer_supplies = ARRAY_SIZE(omap3stalker_vmmc1_supply), |
228 | .consumer_supplies = &omap3stalker_vmmc1_supply, | 227 | .consumer_supplies = omap3stalker_vmmc1_supply, |
229 | }; | 228 | }; |
230 | 229 | ||
231 | /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ | 230 | /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ |
@@ -238,8 +237,8 @@ static struct regulator_init_data omap3stalker_vsim = { | |||
238 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | 237 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
239 | | REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS, | 238 | | REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS, |
240 | }, | 239 | }, |
241 | .num_consumer_supplies = 1, | 240 | .num_consumer_supplies = ARRAY_SIZE(omap3stalker_vsim_supply), |
242 | .consumer_supplies = &omap3stalker_vsim_supply, | 241 | .consumer_supplies = omap3stalker_vsim_supply, |
243 | }; | 242 | }; |
244 | 243 | ||
245 | static struct omap2_hsmmc_info mmc[] = { | 244 | static struct omap2_hsmmc_info mmc[] = { |
@@ -321,10 +320,6 @@ omap3stalker_twl_gpio_setup(struct device *dev, | |||
321 | mmc[0].gpio_cd = gpio + 0; | 320 | mmc[0].gpio_cd = gpio + 0; |
322 | omap2_hsmmc_init(mmc); | 321 | omap2_hsmmc_init(mmc); |
323 | 322 | ||
324 | /* link regulators to MMC adapters */ | ||
325 | omap3stalker_vmmc1_supply.dev = mmc[0].dev; | ||
326 | omap3stalker_vsim_supply.dev = mmc[0].dev; | ||
327 | |||
328 | /* | 323 | /* |
329 | * Most GPIOs are for USB OTG. Some are mostly sent to | 324 | * Most GPIOs are for USB OTG. Some are mostly sent to |
330 | * the P2 connector; notably LEDA for the LCD backlight. | 325 | * the P2 connector; notably LEDA for the LCD backlight. |
@@ -354,10 +349,6 @@ static struct twl4030_gpio_platform_data omap3stalker_gpio_data = { | |||
354 | .setup = omap3stalker_twl_gpio_setup, | 349 | .setup = omap3stalker_twl_gpio_setup, |
355 | }; | 350 | }; |
356 | 351 | ||
357 | static struct twl4030_usb_data omap3stalker_usb_data = { | ||
358 | .usb_mode = T2_USB_MODE_ULPI, | ||
359 | }; | ||
360 | |||
361 | static uint32_t board_keymap[] = { | 352 | static uint32_t board_keymap[] = { |
362 | KEY(0, 0, KEY_LEFT), | 353 | KEY(0, 0, KEY_LEFT), |
363 | KEY(0, 1, KEY_DOWN), | 354 | KEY(0, 1, KEY_DOWN), |
@@ -392,68 +383,10 @@ static struct twl4030_keypad_data omap3stalker_kp_data = { | |||
392 | .rep = 1, | 383 | .rep = 1, |
393 | }; | 384 | }; |
394 | 385 | ||
395 | static struct twl4030_madc_platform_data omap3stalker_madc_data = { | ||
396 | .irq_line = 1, | ||
397 | }; | ||
398 | |||
399 | static struct twl4030_codec_audio_data omap3stalker_audio_data; | ||
400 | |||
401 | static struct twl4030_codec_data omap3stalker_codec_data = { | ||
402 | .audio_mclk = 26000000, | ||
403 | .audio = &omap3stalker_audio_data, | ||
404 | }; | ||
405 | |||
406 | static struct regulator_consumer_supply omap3_stalker_vdda_dac_supply = | ||
407 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); | ||
408 | |||
409 | /* VDAC for DSS driving S-Video */ | ||
410 | static struct regulator_init_data omap3_stalker_vdac = { | ||
411 | .constraints = { | ||
412 | .min_uV = 1800000, | ||
413 | .max_uV = 1800000, | ||
414 | .apply_uV = true, | ||
415 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
416 | | REGULATOR_MODE_STANDBY, | ||
417 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
418 | | REGULATOR_CHANGE_STATUS, | ||
419 | }, | ||
420 | .num_consumer_supplies = 1, | ||
421 | .consumer_supplies = &omap3_stalker_vdda_dac_supply, | ||
422 | }; | ||
423 | |||
424 | /* VPLL2 for digital video outputs */ | ||
425 | static struct regulator_consumer_supply omap3_stalker_vpll2_supplies[] = { | ||
426 | REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||
427 | REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||
428 | }; | ||
429 | |||
430 | static struct regulator_init_data omap3_stalker_vpll2 = { | ||
431 | .constraints = { | ||
432 | .name = "VDVI", | ||
433 | .min_uV = 1800000, | ||
434 | .max_uV = 1800000, | ||
435 | .apply_uV = true, | ||
436 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
437 | | REGULATOR_MODE_STANDBY, | ||
438 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
439 | | REGULATOR_CHANGE_STATUS, | ||
440 | }, | ||
441 | .num_consumer_supplies = ARRAY_SIZE(omap3_stalker_vpll2_supplies), | ||
442 | .consumer_supplies = omap3_stalker_vpll2_supplies, | ||
443 | }; | ||
444 | |||
445 | static struct twl4030_platform_data omap3stalker_twldata = { | 386 | static struct twl4030_platform_data omap3stalker_twldata = { |
446 | .irq_base = TWL4030_IRQ_BASE, | ||
447 | .irq_end = TWL4030_IRQ_END, | ||
448 | |||
449 | /* platform_data for children goes here */ | 387 | /* platform_data for children goes here */ |
450 | .keypad = &omap3stalker_kp_data, | 388 | .keypad = &omap3stalker_kp_data, |
451 | .madc = &omap3stalker_madc_data, | ||
452 | .usb = &omap3stalker_usb_data, | ||
453 | .gpio = &omap3stalker_gpio_data, | 389 | .gpio = &omap3stalker_gpio_data, |
454 | .codec = &omap3stalker_codec_data, | ||
455 | .vdac = &omap3_stalker_vdac, | ||
456 | .vpll2 = &omap3_stalker_vpll2, | ||
457 | .vmmc1 = &omap3stalker_vmmc1, | 390 | .vmmc1 = &omap3stalker_vmmc1, |
458 | .vsim = &omap3stalker_vsim, | 391 | .vsim = &omap3stalker_vsim, |
459 | }; | 392 | }; |
@@ -474,6 +407,15 @@ static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = { | |||
474 | 407 | ||
475 | static int __init omap3_stalker_i2c_init(void) | 408 | static int __init omap3_stalker_i2c_init(void) |
476 | { | 409 | { |
410 | omap3_pmic_get_config(&omap3stalker_twldata, | ||
411 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC | | ||
412 | TWL_COMMON_PDATA_AUDIO, | ||
413 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); | ||
414 | |||
415 | omap3stalker_twldata.vdac->constraints.apply_uV = true; | ||
416 | omap3stalker_twldata.vpll2->constraints.apply_uV = true; | ||
417 | omap3stalker_twldata.vpll2->constraints.name = "VDVI"; | ||
418 | |||
477 | omap3_pmic_init("twl4030", &omap3stalker_twldata); | 419 | omap3_pmic_init("twl4030", &omap3stalker_twldata); |
478 | omap_register_i2c_bus(2, 400, NULL, 0); | 420 | omap_register_i2c_bus(2, 400, NULL, 0); |
479 | omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3, | 421 | omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3, |
@@ -494,10 +436,7 @@ static void __init omap3_stalker_init_early(void) | |||
494 | 436 | ||
495 | static void __init omap3_stalker_init_irq(void) | 437 | static void __init omap3_stalker_init_irq(void) |
496 | { | 438 | { |
497 | omap_init_irq(); | 439 | omap3_init_irq(); |
498 | #ifdef CONFIG_OMAP_32K_TIMER | ||
499 | omap2_gp_clockevent_set_gptimer(12); | ||
500 | #endif | ||
501 | } | 440 | } |
502 | 441 | ||
503 | static struct platform_device *omap3_stalker_devices[] __initdata = { | 442 | static struct platform_device *omap3_stalker_devices[] __initdata = { |
@@ -560,5 +499,5 @@ MACHINE_START(SBC3530, "OMAP3 STALKER") | |||
560 | .init_early = omap3_stalker_init_early, | 499 | .init_early = omap3_stalker_init_early, |
561 | .init_irq = omap3_stalker_init_irq, | 500 | .init_irq = omap3_stalker_init_irq, |
562 | .init_machine = omap3_stalker_init, | 501 | .init_machine = omap3_stalker_init, |
563 | .timer = &omap_timer, | 502 | .timer = &omap3_secure_timer, |
564 | MACHINE_END | 503 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index 5f649faf7377..852ea0464057 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c | |||
@@ -51,7 +51,6 @@ | |||
51 | 51 | ||
52 | #include "mux.h" | 52 | #include "mux.h" |
53 | #include "hsmmc.h" | 53 | #include "hsmmc.h" |
54 | #include "timer-gp.h" | ||
55 | #include "common-board-devices.h" | 54 | #include "common-board-devices.h" |
56 | 55 | ||
57 | #include <asm/setup.h> | 56 | #include <asm/setup.h> |
@@ -114,12 +113,12 @@ static struct omap_lcd_config omap3_touchbook_lcd_config __initdata = { | |||
114 | .ctrl_name = "internal", | 113 | .ctrl_name = "internal", |
115 | }; | 114 | }; |
116 | 115 | ||
117 | static struct regulator_consumer_supply touchbook_vmmc1_supply = { | 116 | static struct regulator_consumer_supply touchbook_vmmc1_supply[] = { |
118 | .supply = "vmmc", | 117 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
119 | }; | 118 | }; |
120 | 119 | ||
121 | static struct regulator_consumer_supply touchbook_vsim_supply = { | 120 | static struct regulator_consumer_supply touchbook_vsim_supply[] = { |
122 | .supply = "vmmc_aux", | 121 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"), |
123 | }; | 122 | }; |
124 | 123 | ||
125 | static struct gpio_led gpio_leds[]; | 124 | static struct gpio_led gpio_leds[]; |
@@ -137,10 +136,6 @@ static int touchbook_twl_gpio_setup(struct device *dev, | |||
137 | mmc[0].gpio_cd = gpio + 0; | 136 | mmc[0].gpio_cd = gpio + 0; |
138 | omap2_hsmmc_init(mmc); | 137 | omap2_hsmmc_init(mmc); |
139 | 138 | ||
140 | /* link regulators to MMC adapters */ | ||
141 | touchbook_vmmc1_supply.dev = mmc[0].dev; | ||
142 | touchbook_vsim_supply.dev = mmc[0].dev; | ||
143 | |||
144 | /* REVISIT: need ehci-omap hooks for external VBUS | 139 | /* REVISIT: need ehci-omap hooks for external VBUS |
145 | * power switch and overcurrent detect | 140 | * power switch and overcurrent detect |
146 | */ | 141 | */ |
@@ -167,14 +162,18 @@ static struct twl4030_gpio_platform_data touchbook_gpio_data = { | |||
167 | .setup = touchbook_twl_gpio_setup, | 162 | .setup = touchbook_twl_gpio_setup, |
168 | }; | 163 | }; |
169 | 164 | ||
170 | static struct regulator_consumer_supply touchbook_vdac_supply = { | 165 | static struct regulator_consumer_supply touchbook_vdac_supply[] = { |
166 | { | ||
171 | .supply = "vdac", | 167 | .supply = "vdac", |
172 | .dev = &omap3_touchbook_lcd_device.dev, | 168 | .dev = &omap3_touchbook_lcd_device.dev, |
169 | }, | ||
173 | }; | 170 | }; |
174 | 171 | ||
175 | static struct regulator_consumer_supply touchbook_vdvi_supply = { | 172 | static struct regulator_consumer_supply touchbook_vdvi_supply[] = { |
173 | { | ||
176 | .supply = "vdvi", | 174 | .supply = "vdvi", |
177 | .dev = &omap3_touchbook_lcd_device.dev, | 175 | .dev = &omap3_touchbook_lcd_device.dev, |
176 | }, | ||
178 | }; | 177 | }; |
179 | 178 | ||
180 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ | 179 | /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ |
@@ -188,8 +187,8 @@ static struct regulator_init_data touchbook_vmmc1 = { | |||
188 | | REGULATOR_CHANGE_MODE | 187 | | REGULATOR_CHANGE_MODE |
189 | | REGULATOR_CHANGE_STATUS, | 188 | | REGULATOR_CHANGE_STATUS, |
190 | }, | 189 | }, |
191 | .num_consumer_supplies = 1, | 190 | .num_consumer_supplies = ARRAY_SIZE(touchbook_vmmc1_supply), |
192 | .consumer_supplies = &touchbook_vmmc1_supply, | 191 | .consumer_supplies = touchbook_vmmc1_supply, |
193 | }; | 192 | }; |
194 | 193 | ||
195 | /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ | 194 | /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ |
@@ -203,62 +202,15 @@ static struct regulator_init_data touchbook_vsim = { | |||
203 | | REGULATOR_CHANGE_MODE | 202 | | REGULATOR_CHANGE_MODE |
204 | | REGULATOR_CHANGE_STATUS, | 203 | | REGULATOR_CHANGE_STATUS, |
205 | }, | 204 | }, |
206 | .num_consumer_supplies = 1, | 205 | .num_consumer_supplies = ARRAY_SIZE(touchbook_vsim_supply), |
207 | .consumer_supplies = &touchbook_vsim_supply, | 206 | .consumer_supplies = touchbook_vsim_supply, |
208 | }; | ||
209 | |||
210 | /* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */ | ||
211 | static struct regulator_init_data touchbook_vdac = { | ||
212 | .constraints = { | ||
213 | .min_uV = 1800000, | ||
214 | .max_uV = 1800000, | ||
215 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
216 | | REGULATOR_MODE_STANDBY, | ||
217 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
218 | | REGULATOR_CHANGE_STATUS, | ||
219 | }, | ||
220 | .num_consumer_supplies = 1, | ||
221 | .consumer_supplies = &touchbook_vdac_supply, | ||
222 | }; | ||
223 | |||
224 | /* VPLL2 for digital video outputs */ | ||
225 | static struct regulator_init_data touchbook_vpll2 = { | ||
226 | .constraints = { | ||
227 | .name = "VDVI", | ||
228 | .min_uV = 1800000, | ||
229 | .max_uV = 1800000, | ||
230 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
231 | | REGULATOR_MODE_STANDBY, | ||
232 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
233 | | REGULATOR_CHANGE_STATUS, | ||
234 | }, | ||
235 | .num_consumer_supplies = 1, | ||
236 | .consumer_supplies = &touchbook_vdvi_supply, | ||
237 | }; | ||
238 | |||
239 | static struct twl4030_usb_data touchbook_usb_data = { | ||
240 | .usb_mode = T2_USB_MODE_ULPI, | ||
241 | }; | ||
242 | |||
243 | static struct twl4030_codec_audio_data touchbook_audio_data; | ||
244 | |||
245 | static struct twl4030_codec_data touchbook_codec_data = { | ||
246 | .audio_mclk = 26000000, | ||
247 | .audio = &touchbook_audio_data, | ||
248 | }; | 207 | }; |
249 | 208 | ||
250 | static struct twl4030_platform_data touchbook_twldata = { | 209 | static struct twl4030_platform_data touchbook_twldata = { |
251 | .irq_base = TWL4030_IRQ_BASE, | ||
252 | .irq_end = TWL4030_IRQ_END, | ||
253 | |||
254 | /* platform_data for children goes here */ | 210 | /* platform_data for children goes here */ |
255 | .usb = &touchbook_usb_data, | ||
256 | .gpio = &touchbook_gpio_data, | 211 | .gpio = &touchbook_gpio_data, |
257 | .codec = &touchbook_codec_data, | ||
258 | .vmmc1 = &touchbook_vmmc1, | 212 | .vmmc1 = &touchbook_vmmc1, |
259 | .vsim = &touchbook_vsim, | 213 | .vsim = &touchbook_vsim, |
260 | .vdac = &touchbook_vdac, | ||
261 | .vpll2 = &touchbook_vpll2, | ||
262 | }; | 214 | }; |
263 | 215 | ||
264 | static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = { | 216 | static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = { |
@@ -270,8 +222,20 @@ static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = { | |||
270 | static int __init omap3_touchbook_i2c_init(void) | 222 | static int __init omap3_touchbook_i2c_init(void) |
271 | { | 223 | { |
272 | /* Standard TouchBook bus */ | 224 | /* Standard TouchBook bus */ |
273 | omap3_pmic_init("twl4030", &touchbook_twldata); | 225 | omap3_pmic_get_config(&touchbook_twldata, |
226 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO, | ||
227 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); | ||
228 | |||
229 | touchbook_twldata.vdac->num_consumer_supplies = | ||
230 | ARRAY_SIZE(touchbook_vdac_supply); | ||
231 | touchbook_twldata.vdac->consumer_supplies = touchbook_vdac_supply; | ||
274 | 232 | ||
233 | touchbook_twldata.vpll2->constraints.name = "VDVI"; | ||
234 | touchbook_twldata.vpll2->num_consumer_supplies = | ||
235 | ARRAY_SIZE(touchbook_vdvi_supply); | ||
236 | touchbook_twldata.vpll2->consumer_supplies = touchbook_vdvi_supply; | ||
237 | |||
238 | omap3_pmic_init("twl4030", &touchbook_twldata); | ||
275 | /* Additional TouchBook bus */ | 239 | /* Additional TouchBook bus */ |
276 | omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo, | 240 | omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo, |
277 | ARRAY_SIZE(touchBook_i2c_boardinfo)); | 241 | ARRAY_SIZE(touchBook_i2c_boardinfo)); |
@@ -371,10 +335,7 @@ static void __init omap3_touchbook_init_early(void) | |||
371 | 335 | ||
372 | static void __init omap3_touchbook_init_irq(void) | 336 | static void __init omap3_touchbook_init_irq(void) |
373 | { | 337 | { |
374 | omap_init_irq(); | 338 | omap3_init_irq(); |
375 | #ifdef CONFIG_OMAP_32K_TIMER | ||
376 | omap2_gp_clockevent_set_gptimer(12); | ||
377 | #endif | ||
378 | } | 339 | } |
379 | 340 | ||
380 | static struct platform_device *omap3_touchbook_devices[] __initdata = { | 341 | static struct platform_device *omap3_touchbook_devices[] __initdata = { |
@@ -449,5 +410,5 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board") | |||
449 | .init_early = omap3_touchbook_init_early, | 410 | .init_early = omap3_touchbook_init_early, |
450 | .init_irq = omap3_touchbook_init_irq, | 411 | .init_irq = omap3_touchbook_init_irq, |
451 | .init_machine = omap3_touchbook_init, | 412 | .init_machine = omap3_touchbook_init, |
452 | .timer = &omap_timer, | 413 | .timer = &omap3_secure_timer, |
453 | MACHINE_END | 414 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 0cfe2005cb50..9aaa96057666 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
@@ -41,7 +41,6 @@ | |||
41 | #include <plat/usb.h> | 41 | #include <plat/usb.h> |
42 | #include <plat/mmc.h> | 42 | #include <plat/mmc.h> |
43 | #include <video/omap-panel-generic-dpi.h> | 43 | #include <video/omap-panel-generic-dpi.h> |
44 | #include "timer-gp.h" | ||
45 | 44 | ||
46 | #include "hsmmc.h" | 45 | #include "hsmmc.h" |
47 | #include "control.h" | 46 | #include "control.h" |
@@ -155,14 +154,6 @@ static struct omap_musb_board_data musb_board_data = { | |||
155 | .power = 100, | 154 | .power = 100, |
156 | }; | 155 | }; |
157 | 156 | ||
158 | static struct twl4030_usb_data omap4_usbphy_data = { | ||
159 | .phy_init = omap4430_phy_init, | ||
160 | .phy_exit = omap4430_phy_exit, | ||
161 | .phy_power = omap4430_phy_power, | ||
162 | .phy_set_clock = omap4430_phy_set_clk, | ||
163 | .phy_suspend = omap4430_phy_suspend, | ||
164 | }; | ||
165 | |||
166 | static struct omap2_hsmmc_info mmc[] = { | 157 | static struct omap2_hsmmc_info mmc[] = { |
167 | { | 158 | { |
168 | .mmc = 1, | 159 | .mmc = 1, |
@@ -182,24 +173,16 @@ static struct omap2_hsmmc_info mmc[] = { | |||
182 | {} /* Terminator */ | 173 | {} /* Terminator */ |
183 | }; | 174 | }; |
184 | 175 | ||
185 | static struct regulator_consumer_supply omap4_panda_vmmc_supply[] = { | 176 | static struct regulator_consumer_supply omap4_panda_vmmc5_supply[] = { |
186 | { | 177 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.4"), |
187 | .supply = "vmmc", | ||
188 | .dev_name = "omap_hsmmc.0", | ||
189 | }, | ||
190 | }; | ||
191 | |||
192 | static struct regulator_consumer_supply omap4_panda_vmmc5_supply = { | ||
193 | .supply = "vmmc", | ||
194 | .dev_name = "omap_hsmmc.4", | ||
195 | }; | 178 | }; |
196 | 179 | ||
197 | static struct regulator_init_data panda_vmmc5 = { | 180 | static struct regulator_init_data panda_vmmc5 = { |
198 | .constraints = { | 181 | .constraints = { |
199 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 182 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
200 | }, | 183 | }, |
201 | .num_consumer_supplies = 1, | 184 | .num_consumer_supplies = ARRAY_SIZE(omap4_panda_vmmc5_supply), |
202 | .consumer_supplies = &omap4_panda_vmmc5_supply, | 185 | .consumer_supplies = omap4_panda_vmmc5_supply, |
203 | }; | 186 | }; |
204 | 187 | ||
205 | static struct fixed_voltage_config panda_vwlan = { | 188 | static struct fixed_voltage_config panda_vwlan = { |
@@ -274,128 +257,8 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers) | |||
274 | return 0; | 257 | return 0; |
275 | } | 258 | } |
276 | 259 | ||
277 | static struct regulator_init_data omap4_panda_vaux2 = { | 260 | /* Panda board uses the common PMIC configuration */ |
278 | .constraints = { | 261 | static struct twl4030_platform_data omap4_panda_twldata; |
279 | .min_uV = 1200000, | ||
280 | .max_uV = 2800000, | ||
281 | .apply_uV = true, | ||
282 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
283 | | REGULATOR_MODE_STANDBY, | ||
284 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
285 | | REGULATOR_CHANGE_MODE | ||
286 | | REGULATOR_CHANGE_STATUS, | ||
287 | }, | ||
288 | }; | ||
289 | |||
290 | static struct regulator_init_data omap4_panda_vaux3 = { | ||
291 | .constraints = { | ||
292 | .min_uV = 1000000, | ||
293 | .max_uV = 3000000, | ||
294 | .apply_uV = true, | ||
295 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
296 | | REGULATOR_MODE_STANDBY, | ||
297 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
298 | | REGULATOR_CHANGE_MODE | ||
299 | | REGULATOR_CHANGE_STATUS, | ||
300 | }, | ||
301 | }; | ||
302 | |||
303 | /* VMMC1 for MMC1 card */ | ||
304 | static struct regulator_init_data omap4_panda_vmmc = { | ||
305 | .constraints = { | ||
306 | .min_uV = 1200000, | ||
307 | .max_uV = 3000000, | ||
308 | .apply_uV = true, | ||
309 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
310 | | REGULATOR_MODE_STANDBY, | ||
311 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
312 | | REGULATOR_CHANGE_MODE | ||
313 | | REGULATOR_CHANGE_STATUS, | ||
314 | }, | ||
315 | .num_consumer_supplies = 1, | ||
316 | .consumer_supplies = omap4_panda_vmmc_supply, | ||
317 | }; | ||
318 | |||
319 | static struct regulator_init_data omap4_panda_vpp = { | ||
320 | .constraints = { | ||
321 | .min_uV = 1800000, | ||
322 | .max_uV = 2500000, | ||
323 | .apply_uV = true, | ||
324 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
325 | | REGULATOR_MODE_STANDBY, | ||
326 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
327 | | REGULATOR_CHANGE_MODE | ||
328 | | REGULATOR_CHANGE_STATUS, | ||
329 | }, | ||
330 | }; | ||
331 | |||
332 | static struct regulator_init_data omap4_panda_vana = { | ||
333 | .constraints = { | ||
334 | .min_uV = 2100000, | ||
335 | .max_uV = 2100000, | ||
336 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
337 | | REGULATOR_MODE_STANDBY, | ||
338 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
339 | | REGULATOR_CHANGE_STATUS, | ||
340 | }, | ||
341 | }; | ||
342 | |||
343 | static struct regulator_init_data omap4_panda_vcxio = { | ||
344 | .constraints = { | ||
345 | .min_uV = 1800000, | ||
346 | .max_uV = 1800000, | ||
347 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
348 | | REGULATOR_MODE_STANDBY, | ||
349 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
350 | | REGULATOR_CHANGE_STATUS, | ||
351 | }, | ||
352 | }; | ||
353 | |||
354 | static struct regulator_init_data omap4_panda_vdac = { | ||
355 | .constraints = { | ||
356 | .min_uV = 1800000, | ||
357 | .max_uV = 1800000, | ||
358 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
359 | | REGULATOR_MODE_STANDBY, | ||
360 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
361 | | REGULATOR_CHANGE_STATUS, | ||
362 | }, | ||
363 | }; | ||
364 | |||
365 | static struct regulator_init_data omap4_panda_vusb = { | ||
366 | .constraints = { | ||
367 | .min_uV = 3300000, | ||
368 | .max_uV = 3300000, | ||
369 | .apply_uV = true, | ||
370 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
371 | | REGULATOR_MODE_STANDBY, | ||
372 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
373 | | REGULATOR_CHANGE_STATUS, | ||
374 | }, | ||
375 | }; | ||
376 | |||
377 | static struct regulator_init_data omap4_panda_clk32kg = { | ||
378 | .constraints = { | ||
379 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
380 | }, | ||
381 | }; | ||
382 | |||
383 | static struct twl4030_platform_data omap4_panda_twldata = { | ||
384 | .irq_base = TWL6030_IRQ_BASE, | ||
385 | .irq_end = TWL6030_IRQ_END, | ||
386 | |||
387 | /* Regulators */ | ||
388 | .vmmc = &omap4_panda_vmmc, | ||
389 | .vpp = &omap4_panda_vpp, | ||
390 | .vana = &omap4_panda_vana, | ||
391 | .vcxio = &omap4_panda_vcxio, | ||
392 | .vdac = &omap4_panda_vdac, | ||
393 | .vusb = &omap4_panda_vusb, | ||
394 | .vaux2 = &omap4_panda_vaux2, | ||
395 | .vaux3 = &omap4_panda_vaux3, | ||
396 | .clk32kg = &omap4_panda_clk32kg, | ||
397 | .usb = &omap4_usbphy_data, | ||
398 | }; | ||
399 | 262 | ||
400 | /* | 263 | /* |
401 | * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM | 264 | * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM |
@@ -409,6 +272,16 @@ static struct i2c_board_info __initdata panda_i2c_eeprom[] = { | |||
409 | 272 | ||
410 | static int __init omap4_panda_i2c_init(void) | 273 | static int __init omap4_panda_i2c_init(void) |
411 | { | 274 | { |
275 | omap4_pmic_get_config(&omap4_panda_twldata, TWL_COMMON_PDATA_USB, | ||
276 | TWL_COMMON_REGULATOR_VDAC | | ||
277 | TWL_COMMON_REGULATOR_VAUX2 | | ||
278 | TWL_COMMON_REGULATOR_VAUX3 | | ||
279 | TWL_COMMON_REGULATOR_VMMC | | ||
280 | TWL_COMMON_REGULATOR_VPP | | ||
281 | TWL_COMMON_REGULATOR_VANA | | ||
282 | TWL_COMMON_REGULATOR_VCXIO | | ||
283 | TWL_COMMON_REGULATOR_VUSB | | ||
284 | TWL_COMMON_REGULATOR_CLK32KG); | ||
412 | omap4_pmic_init("twl6030", &omap4_panda_twldata); | 285 | omap4_pmic_init("twl6030", &omap4_panda_twldata); |
413 | omap_register_i2c_bus(2, 400, NULL, 0); | 286 | omap_register_i2c_bus(2, 400, NULL, 0); |
414 | /* | 287 | /* |
@@ -716,5 +589,5 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board") | |||
716 | .init_early = omap4_panda_init_early, | 589 | .init_early = omap4_panda_init_early, |
717 | .init_irq = gic_init_irq, | 590 | .init_irq = gic_init_irq, |
718 | .init_machine = omap4_panda_init, | 591 | .init_machine = omap4_panda_init, |
719 | .timer = &omap_timer, | 592 | .timer = &omap4_timer, |
720 | MACHINE_END | 593 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 175e1ab2b04d..f949a9954d76 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
@@ -74,15 +74,16 @@ | |||
74 | defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) | 74 | defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) |
75 | 75 | ||
76 | /* fixed regulator for ads7846 */ | 76 | /* fixed regulator for ads7846 */ |
77 | static struct regulator_consumer_supply ads7846_supply = | 77 | static struct regulator_consumer_supply ads7846_supply[] = { |
78 | REGULATOR_SUPPLY("vcc", "spi1.0"); | 78 | REGULATOR_SUPPLY("vcc", "spi1.0"), |
79 | }; | ||
79 | 80 | ||
80 | static struct regulator_init_data vads7846_regulator = { | 81 | static struct regulator_init_data vads7846_regulator = { |
81 | .constraints = { | 82 | .constraints = { |
82 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 83 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
83 | }, | 84 | }, |
84 | .num_consumer_supplies = 1, | 85 | .num_consumer_supplies = ARRAY_SIZE(ads7846_supply), |
85 | .consumer_supplies = &ads7846_supply, | 86 | .consumer_supplies = ads7846_supply, |
86 | }; | 87 | }; |
87 | 88 | ||
88 | static struct fixed_voltage_config vads7846 = { | 89 | static struct fixed_voltage_config vads7846 = { |
@@ -264,14 +265,6 @@ static struct omap_dss_board_info overo_dss_data = { | |||
264 | .default_device = &overo_dvi_device, | 265 | .default_device = &overo_dvi_device, |
265 | }; | 266 | }; |
266 | 267 | ||
267 | static struct regulator_consumer_supply overo_vdda_dac_supply = | ||
268 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); | ||
269 | |||
270 | static struct regulator_consumer_supply overo_vdds_dsi_supply[] = { | ||
271 | REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||
272 | REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||
273 | }; | ||
274 | |||
275 | static struct mtd_partition overo_nand_partitions[] = { | 268 | static struct mtd_partition overo_nand_partitions[] = { |
276 | { | 269 | { |
277 | .name = "xloader", | 270 | .name = "xloader", |
@@ -319,8 +312,8 @@ static struct omap2_hsmmc_info mmc[] = { | |||
319 | {} /* Terminator */ | 312 | {} /* Terminator */ |
320 | }; | 313 | }; |
321 | 314 | ||
322 | static struct regulator_consumer_supply overo_vmmc1_supply = { | 315 | static struct regulator_consumer_supply overo_vmmc1_supply[] = { |
323 | .supply = "vmmc", | 316 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
324 | }; | 317 | }; |
325 | 318 | ||
326 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) | 319 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) |
@@ -415,8 +408,6 @@ static int overo_twl_gpio_setup(struct device *dev, | |||
415 | { | 408 | { |
416 | omap2_hsmmc_init(mmc); | 409 | omap2_hsmmc_init(mmc); |
417 | 410 | ||
418 | overo_vmmc1_supply.dev = mmc[0].dev; | ||
419 | |||
420 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) | 411 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) |
421 | /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ | 412 | /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ |
422 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; | 413 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; |
@@ -433,10 +424,6 @@ static struct twl4030_gpio_platform_data overo_gpio_data = { | |||
433 | .setup = overo_twl_gpio_setup, | 424 | .setup = overo_twl_gpio_setup, |
434 | }; | 425 | }; |
435 | 426 | ||
436 | static struct twl4030_usb_data overo_usb_data = { | ||
437 | .usb_mode = T2_USB_MODE_ULPI, | ||
438 | }; | ||
439 | |||
440 | static struct regulator_init_data overo_vmmc1 = { | 427 | static struct regulator_init_data overo_vmmc1 = { |
441 | .constraints = { | 428 | .constraints = { |
442 | .min_uV = 1850000, | 429 | .min_uV = 1850000, |
@@ -447,59 +434,23 @@ static struct regulator_init_data overo_vmmc1 = { | |||
447 | | REGULATOR_CHANGE_MODE | 434 | | REGULATOR_CHANGE_MODE |
448 | | REGULATOR_CHANGE_STATUS, | 435 | | REGULATOR_CHANGE_STATUS, |
449 | }, | 436 | }, |
450 | .num_consumer_supplies = 1, | 437 | .num_consumer_supplies = ARRAY_SIZE(overo_vmmc1_supply), |
451 | .consumer_supplies = &overo_vmmc1_supply, | 438 | .consumer_supplies = overo_vmmc1_supply, |
452 | }; | ||
453 | |||
454 | /* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */ | ||
455 | static struct regulator_init_data overo_vdac = { | ||
456 | .constraints = { | ||
457 | .min_uV = 1800000, | ||
458 | .max_uV = 1800000, | ||
459 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
460 | | REGULATOR_MODE_STANDBY, | ||
461 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
462 | | REGULATOR_CHANGE_STATUS, | ||
463 | }, | ||
464 | .num_consumer_supplies = 1, | ||
465 | .consumer_supplies = &overo_vdda_dac_supply, | ||
466 | }; | ||
467 | |||
468 | /* VPLL2 for digital video outputs */ | ||
469 | static struct regulator_init_data overo_vpll2 = { | ||
470 | .constraints = { | ||
471 | .name = "VDVI", | ||
472 | .min_uV = 1800000, | ||
473 | .max_uV = 1800000, | ||
474 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
475 | | REGULATOR_MODE_STANDBY, | ||
476 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
477 | | REGULATOR_CHANGE_STATUS, | ||
478 | }, | ||
479 | .num_consumer_supplies = ARRAY_SIZE(overo_vdds_dsi_supply), | ||
480 | .consumer_supplies = overo_vdds_dsi_supply, | ||
481 | }; | ||
482 | |||
483 | static struct twl4030_codec_audio_data overo_audio_data; | ||
484 | |||
485 | static struct twl4030_codec_data overo_codec_data = { | ||
486 | .audio_mclk = 26000000, | ||
487 | .audio = &overo_audio_data, | ||
488 | }; | 439 | }; |
489 | 440 | ||
490 | static struct twl4030_platform_data overo_twldata = { | 441 | static struct twl4030_platform_data overo_twldata = { |
491 | .irq_base = TWL4030_IRQ_BASE, | ||
492 | .irq_end = TWL4030_IRQ_END, | ||
493 | .gpio = &overo_gpio_data, | 442 | .gpio = &overo_gpio_data, |
494 | .usb = &overo_usb_data, | ||
495 | .codec = &overo_codec_data, | ||
496 | .vmmc1 = &overo_vmmc1, | 443 | .vmmc1 = &overo_vmmc1, |
497 | .vdac = &overo_vdac, | ||
498 | .vpll2 = &overo_vpll2, | ||
499 | }; | 444 | }; |
500 | 445 | ||
501 | static int __init overo_i2c_init(void) | 446 | static int __init overo_i2c_init(void) |
502 | { | 447 | { |
448 | omap3_pmic_get_config(&overo_twldata, | ||
449 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO, | ||
450 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); | ||
451 | |||
452 | overo_twldata.vpll2->constraints.name = "VDVI"; | ||
453 | |||
503 | omap3_pmic_init("tps65950", &overo_twldata); | 454 | omap3_pmic_init("tps65950", &overo_twldata); |
504 | /* i2c2 pins are used for gpio */ | 455 | /* i2c2 pins are used for gpio */ |
505 | omap_register_i2c_bus(3, 400, NULL, 0); | 456 | omap_register_i2c_bus(3, 400, NULL, 0); |
@@ -568,7 +519,6 @@ static void __init overo_init(void) | |||
568 | usb_musb_init(NULL); | 519 | usb_musb_init(NULL); |
569 | usbhs_init(&usbhs_bdata); | 520 | usbhs_init(&usbhs_bdata); |
570 | overo_spi_init(); | 521 | overo_spi_init(); |
571 | overo_ads7846_init(); | ||
572 | overo_init_smsc911x(); | 522 | overo_init_smsc911x(); |
573 | overo_display_init(); | 523 | overo_display_init(); |
574 | overo_init_led(); | 524 | overo_init_led(); |
@@ -615,7 +565,7 @@ MACHINE_START(OVERO, "Gumstix Overo") | |||
615 | .reserve = omap_reserve, | 565 | .reserve = omap_reserve, |
616 | .map_io = omap3_map_io, | 566 | .map_io = omap3_map_io, |
617 | .init_early = overo_init_early, | 567 | .init_early = overo_init_early, |
618 | .init_irq = omap_init_irq, | 568 | .init_irq = omap3_init_irq, |
619 | .init_machine = overo_init, | 569 | .init_machine = overo_init, |
620 | .timer = &omap_timer, | 570 | .timer = &omap3_timer, |
621 | MACHINE_END | 571 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index 42d10b12da3c..7dfed24ee12e 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c | |||
@@ -79,20 +79,14 @@ static struct twl4030_gpio_platform_data rm680_gpio_data = { | |||
79 | .pulldowns = BIT(1) | BIT(2) | BIT(8) | BIT(15), | 79 | .pulldowns = BIT(1) | BIT(2) | BIT(8) | BIT(15), |
80 | }; | 80 | }; |
81 | 81 | ||
82 | static struct twl4030_usb_data rm680_usb_data = { | ||
83 | .usb_mode = T2_USB_MODE_ULPI, | ||
84 | }; | ||
85 | |||
86 | static struct twl4030_platform_data rm680_twl_data = { | 82 | static struct twl4030_platform_data rm680_twl_data = { |
87 | .irq_base = TWL4030_IRQ_BASE, | ||
88 | .irq_end = TWL4030_IRQ_END, | ||
89 | .gpio = &rm680_gpio_data, | 83 | .gpio = &rm680_gpio_data, |
90 | .usb = &rm680_usb_data, | ||
91 | /* add rest of the children here */ | 84 | /* add rest of the children here */ |
92 | }; | 85 | }; |
93 | 86 | ||
94 | static void __init rm680_i2c_init(void) | 87 | static void __init rm680_i2c_init(void) |
95 | { | 88 | { |
89 | omap3_pmic_get_config(&rm680_twl_data, TWL_COMMON_PDATA_USB, 0); | ||
96 | omap_pmic_init(1, 2900, "twl5031", INT_34XX_SYS_NIRQ, &rm680_twl_data); | 90 | omap_pmic_init(1, 2900, "twl5031", INT_34XX_SYS_NIRQ, &rm680_twl_data); |
97 | omap_register_i2c_bus(2, 400, NULL, 0); | 91 | omap_register_i2c_bus(2, 400, NULL, 0); |
98 | omap_register_i2c_bus(3, 400, NULL, 0); | 92 | omap_register_i2c_bus(3, 400, NULL, 0); |
@@ -163,7 +157,7 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board") | |||
163 | .reserve = omap_reserve, | 157 | .reserve = omap_reserve, |
164 | .map_io = rm680_map_io, | 158 | .map_io = rm680_map_io, |
165 | .init_early = rm680_init_early, | 159 | .init_early = rm680_init_early, |
166 | .init_irq = omap_init_irq, | 160 | .init_irq = omap3_init_irq, |
167 | .init_machine = rm680_init, | 161 | .init_machine = rm680_init, |
168 | .timer = &omap_timer, | 162 | .timer = &omap3_timer, |
169 | MACHINE_END | 163 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index 88bd6f7705f0..0c9e0f28ed07 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <sound/tpa6130a2-plat.h> | 39 | #include <sound/tpa6130a2-plat.h> |
40 | #include <media/radio-si4713.h> | 40 | #include <media/radio-si4713.h> |
41 | #include <media/si4713.h> | 41 | #include <media/si4713.h> |
42 | #include <linux/leds-lp5523.h> | ||
42 | 43 | ||
43 | #include <../drivers/staging/iio/light/tsl2563.h> | 44 | #include <../drivers/staging/iio/light/tsl2563.h> |
44 | 45 | ||
@@ -53,6 +54,7 @@ | |||
53 | #define RX51_WL1251_IRQ_GPIO 42 | 54 | #define RX51_WL1251_IRQ_GPIO 42 |
54 | #define RX51_FMTX_RESET_GPIO 163 | 55 | #define RX51_FMTX_RESET_GPIO 163 |
55 | #define RX51_FMTX_IRQ 53 | 56 | #define RX51_FMTX_IRQ 53 |
57 | #define RX51_LP5523_CHIP_EN_GPIO 41 | ||
56 | 58 | ||
57 | #define RX51_USB_TRANSCEIVER_RST_GPIO 67 | 59 | #define RX51_USB_TRANSCEIVER_RST_GPIO 67 |
58 | 60 | ||
@@ -71,6 +73,64 @@ static struct tsl2563_platform_data rx51_tsl2563_platform_data = { | |||
71 | }; | 73 | }; |
72 | #endif | 74 | #endif |
73 | 75 | ||
76 | #if defined(CONFIG_LEDS_LP5523) || defined(CONFIG_LEDS_LP5523_MODULE) | ||
77 | static struct lp5523_led_config rx51_lp5523_led_config[] = { | ||
78 | { | ||
79 | .chan_nr = 0, | ||
80 | .led_current = 50, | ||
81 | }, { | ||
82 | .chan_nr = 1, | ||
83 | .led_current = 50, | ||
84 | }, { | ||
85 | .chan_nr = 2, | ||
86 | .led_current = 50, | ||
87 | }, { | ||
88 | .chan_nr = 3, | ||
89 | .led_current = 50, | ||
90 | }, { | ||
91 | .chan_nr = 4, | ||
92 | .led_current = 50, | ||
93 | }, { | ||
94 | .chan_nr = 5, | ||
95 | .led_current = 50, | ||
96 | }, { | ||
97 | .chan_nr = 6, | ||
98 | .led_current = 50, | ||
99 | }, { | ||
100 | .chan_nr = 7, | ||
101 | .led_current = 50, | ||
102 | }, { | ||
103 | .chan_nr = 8, | ||
104 | .led_current = 50, | ||
105 | } | ||
106 | }; | ||
107 | |||
108 | static int rx51_lp5523_setup(void) | ||
109 | { | ||
110 | return gpio_request_one(RX51_LP5523_CHIP_EN_GPIO, GPIOF_DIR_OUT, | ||
111 | "lp5523_enable"); | ||
112 | } | ||
113 | |||
114 | static void rx51_lp5523_release(void) | ||
115 | { | ||
116 | gpio_free(RX51_LP5523_CHIP_EN_GPIO); | ||
117 | } | ||
118 | |||
119 | static void rx51_lp5523_enable(bool state) | ||
120 | { | ||
121 | gpio_set_value(RX51_LP5523_CHIP_EN_GPIO, !!state); | ||
122 | } | ||
123 | |||
124 | static struct lp5523_platform_data rx51_lp5523_platform_data = { | ||
125 | .led_config = rx51_lp5523_led_config, | ||
126 | .num_channels = ARRAY_SIZE(rx51_lp5523_led_config), | ||
127 | .clock_mode = LP5523_CLOCK_AUTO, | ||
128 | .setup_resources = rx51_lp5523_setup, | ||
129 | .release_resources = rx51_lp5523_release, | ||
130 | .enable = rx51_lp5523_enable, | ||
131 | }; | ||
132 | #endif | ||
133 | |||
74 | static struct omap2_mcspi_device_config wl1251_mcspi_config = { | 134 | static struct omap2_mcspi_device_config wl1251_mcspi_config = { |
75 | .turbo_mode = 0, | 135 | .turbo_mode = 0, |
76 | .single_channel = 1, | 136 | .single_channel = 1, |
@@ -288,10 +348,6 @@ static struct twl4030_keypad_data rx51_kp_data = { | |||
288 | .rep = 1, | 348 | .rep = 1, |
289 | }; | 349 | }; |
290 | 350 | ||
291 | static struct twl4030_madc_platform_data rx51_madc_data = { | ||
292 | .irq_line = 1, | ||
293 | }; | ||
294 | |||
295 | /* Enable input logic and pull all lines up when eMMC is on. */ | 351 | /* Enable input logic and pull all lines up when eMMC is on. */ |
296 | static struct omap_board_mux rx51_mmc2_on_mux[] = { | 352 | static struct omap_board_mux rx51_mmc2_on_mux[] = { |
297 | OMAP3_MUX(SDMMC2_CMD, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0), | 353 | OMAP3_MUX(SDMMC2_CMD, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0), |
@@ -358,14 +414,17 @@ static struct omap2_hsmmc_info mmc[] __initdata = { | |||
358 | {} /* Terminator */ | 414 | {} /* Terminator */ |
359 | }; | 415 | }; |
360 | 416 | ||
361 | static struct regulator_consumer_supply rx51_vmmc1_supply = | 417 | static struct regulator_consumer_supply rx51_vmmc1_supply[] = { |
362 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"); | 418 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
419 | }; | ||
363 | 420 | ||
364 | static struct regulator_consumer_supply rx51_vaux3_supply = | 421 | static struct regulator_consumer_supply rx51_vaux3_supply[] = { |
365 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"); | 422 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"), |
423 | }; | ||
366 | 424 | ||
367 | static struct regulator_consumer_supply rx51_vsim_supply = | 425 | static struct regulator_consumer_supply rx51_vsim_supply[] = { |
368 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"); | 426 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"), |
427 | }; | ||
369 | 428 | ||
370 | static struct regulator_consumer_supply rx51_vmmc2_supplies[] = { | 429 | static struct regulator_consumer_supply rx51_vmmc2_supplies[] = { |
371 | /* tlv320aic3x analog supplies */ | 430 | /* tlv320aic3x analog supplies */ |
@@ -395,10 +454,6 @@ static struct regulator_consumer_supply rx51_vaux1_consumers[] = { | |||
395 | REGULATOR_SUPPLY("vdd", "2-0063"), | 454 | REGULATOR_SUPPLY("vdd", "2-0063"), |
396 | }; | 455 | }; |
397 | 456 | ||
398 | static struct regulator_consumer_supply rx51_vdac_supply[] = { | ||
399 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"), | ||
400 | }; | ||
401 | |||
402 | static struct regulator_init_data rx51_vaux1 = { | 457 | static struct regulator_init_data rx51_vaux1 = { |
403 | .constraints = { | 458 | .constraints = { |
404 | .name = "V28", | 459 | .name = "V28", |
@@ -452,8 +507,8 @@ static struct regulator_init_data rx51_vaux3_mmc = { | |||
452 | | REGULATOR_CHANGE_MODE | 507 | | REGULATOR_CHANGE_MODE |
453 | | REGULATOR_CHANGE_STATUS, | 508 | | REGULATOR_CHANGE_STATUS, |
454 | }, | 509 | }, |
455 | .num_consumer_supplies = 1, | 510 | .num_consumer_supplies = ARRAY_SIZE(rx51_vaux3_supply), |
456 | .consumer_supplies = &rx51_vaux3_supply, | 511 | .consumer_supplies = rx51_vaux3_supply, |
457 | }; | 512 | }; |
458 | 513 | ||
459 | static struct regulator_init_data rx51_vaux4 = { | 514 | static struct regulator_init_data rx51_vaux4 = { |
@@ -479,8 +534,8 @@ static struct regulator_init_data rx51_vmmc1 = { | |||
479 | | REGULATOR_CHANGE_MODE | 534 | | REGULATOR_CHANGE_MODE |
480 | | REGULATOR_CHANGE_STATUS, | 535 | | REGULATOR_CHANGE_STATUS, |
481 | }, | 536 | }, |
482 | .num_consumer_supplies = 1, | 537 | .num_consumer_supplies = ARRAY_SIZE(rx51_vmmc1_supply), |
483 | .consumer_supplies = &rx51_vmmc1_supply, | 538 | .consumer_supplies = rx51_vmmc1_supply, |
484 | }; | 539 | }; |
485 | 540 | ||
486 | static struct regulator_init_data rx51_vmmc2 = { | 541 | static struct regulator_init_data rx51_vmmc2 = { |
@@ -500,24 +555,35 @@ static struct regulator_init_data rx51_vmmc2 = { | |||
500 | .consumer_supplies = rx51_vmmc2_supplies, | 555 | .consumer_supplies = rx51_vmmc2_supplies, |
501 | }; | 556 | }; |
502 | 557 | ||
503 | static struct regulator_init_data rx51_vsim = { | 558 | static struct regulator_init_data rx51_vpll1 = { |
504 | .constraints = { | 559 | .constraints = { |
505 | .name = "VMMC2_IO_18", | 560 | .name = "VPLL", |
506 | .min_uV = 1800000, | 561 | .min_uV = 1800000, |
507 | .max_uV = 1800000, | 562 | .max_uV = 1800000, |
508 | .apply_uV = true, | 563 | .apply_uV = true, |
564 | .always_on = true, | ||
509 | .valid_modes_mask = REGULATOR_MODE_NORMAL | 565 | .valid_modes_mask = REGULATOR_MODE_NORMAL |
510 | | REGULATOR_MODE_STANDBY, | 566 | | REGULATOR_MODE_STANDBY, |
511 | .valid_ops_mask = REGULATOR_CHANGE_MODE | 567 | .valid_ops_mask = REGULATOR_CHANGE_MODE, |
512 | | REGULATOR_CHANGE_STATUS, | 568 | }, |
569 | }; | ||
570 | |||
571 | static struct regulator_init_data rx51_vpll2 = { | ||
572 | .constraints = { | ||
573 | .name = "VSDI_CSI", | ||
574 | .min_uV = 1800000, | ||
575 | .max_uV = 1800000, | ||
576 | .apply_uV = true, | ||
577 | .always_on = true, | ||
578 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
579 | | REGULATOR_MODE_STANDBY, | ||
580 | .valid_ops_mask = REGULATOR_CHANGE_MODE, | ||
513 | }, | 581 | }, |
514 | .num_consumer_supplies = 1, | ||
515 | .consumer_supplies = &rx51_vsim_supply, | ||
516 | }; | 582 | }; |
517 | 583 | ||
518 | static struct regulator_init_data rx51_vdac = { | 584 | static struct regulator_init_data rx51_vsim = { |
519 | .constraints = { | 585 | .constraints = { |
520 | .name = "VDAC", | 586 | .name = "VMMC2_IO_18", |
521 | .min_uV = 1800000, | 587 | .min_uV = 1800000, |
522 | .max_uV = 1800000, | 588 | .max_uV = 1800000, |
523 | .apply_uV = true, | 589 | .apply_uV = true, |
@@ -526,8 +592,8 @@ static struct regulator_init_data rx51_vdac = { | |||
526 | .valid_ops_mask = REGULATOR_CHANGE_MODE | 592 | .valid_ops_mask = REGULATOR_CHANGE_MODE |
527 | | REGULATOR_CHANGE_STATUS, | 593 | | REGULATOR_CHANGE_STATUS, |
528 | }, | 594 | }, |
529 | .num_consumer_supplies = 1, | 595 | .num_consumer_supplies = ARRAY_SIZE(rx51_vsim_supply), |
530 | .consumer_supplies = rx51_vdac_supply, | 596 | .consumer_supplies = rx51_vsim_supply, |
531 | }; | 597 | }; |
532 | 598 | ||
533 | static struct regulator_init_data rx51_vio = { | 599 | static struct regulator_init_data rx51_vio = { |
@@ -544,6 +610,43 @@ static struct regulator_init_data rx51_vio = { | |||
544 | .consumer_supplies = rx51_vio_supplies, | 610 | .consumer_supplies = rx51_vio_supplies, |
545 | }; | 611 | }; |
546 | 612 | ||
613 | static struct regulator_init_data rx51_vintana1 = { | ||
614 | .constraints = { | ||
615 | .name = "VINTANA1", | ||
616 | .min_uV = 1500000, | ||
617 | .max_uV = 1500000, | ||
618 | .always_on = true, | ||
619 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
620 | | REGULATOR_MODE_STANDBY, | ||
621 | .valid_ops_mask = REGULATOR_CHANGE_MODE, | ||
622 | }, | ||
623 | }; | ||
624 | |||
625 | static struct regulator_init_data rx51_vintana2 = { | ||
626 | .constraints = { | ||
627 | .name = "VINTANA2", | ||
628 | .min_uV = 2750000, | ||
629 | .max_uV = 2750000, | ||
630 | .apply_uV = true, | ||
631 | .always_on = true, | ||
632 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
633 | | REGULATOR_MODE_STANDBY, | ||
634 | .valid_ops_mask = REGULATOR_CHANGE_MODE, | ||
635 | }, | ||
636 | }; | ||
637 | |||
638 | static struct regulator_init_data rx51_vintdig = { | ||
639 | .constraints = { | ||
640 | .name = "VINTDIG", | ||
641 | .min_uV = 1500000, | ||
642 | .max_uV = 1500000, | ||
643 | .always_on = true, | ||
644 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
645 | | REGULATOR_MODE_STANDBY, | ||
646 | .valid_ops_mask = REGULATOR_CHANGE_MODE, | ||
647 | }, | ||
648 | }; | ||
649 | |||
547 | static struct si4713_platform_data rx51_si4713_i2c_data __initdata_or_module = { | 650 | static struct si4713_platform_data rx51_si4713_i2c_data __initdata_or_module = { |
548 | .gpio_reset = RX51_FMTX_RESET_GPIO, | 651 | .gpio_reset = RX51_FMTX_RESET_GPIO, |
549 | }; | 652 | }; |
@@ -600,10 +703,6 @@ static struct twl4030_gpio_platform_data rx51_gpio_data = { | |||
600 | .setup = rx51_twlgpio_setup, | 703 | .setup = rx51_twlgpio_setup, |
601 | }; | 704 | }; |
602 | 705 | ||
603 | static struct twl4030_usb_data rx51_usb_data = { | ||
604 | .usb_mode = T2_USB_MODE_ULPI, | ||
605 | }; | ||
606 | |||
607 | static struct twl4030_ins sleep_on_seq[] __initdata = { | 706 | static struct twl4030_ins sleep_on_seq[] __initdata = { |
608 | /* | 707 | /* |
609 | * Turn off everything | 708 | * Turn off everything |
@@ -775,14 +874,9 @@ struct twl4030_codec_data rx51_codec_data __initdata = { | |||
775 | }; | 874 | }; |
776 | 875 | ||
777 | static struct twl4030_platform_data rx51_twldata __initdata = { | 876 | static struct twl4030_platform_data rx51_twldata __initdata = { |
778 | .irq_base = TWL4030_IRQ_BASE, | ||
779 | .irq_end = TWL4030_IRQ_END, | ||
780 | |||
781 | /* platform_data for children goes here */ | 877 | /* platform_data for children goes here */ |
782 | .gpio = &rx51_gpio_data, | 878 | .gpio = &rx51_gpio_data, |
783 | .keypad = &rx51_kp_data, | 879 | .keypad = &rx51_kp_data, |
784 | .madc = &rx51_madc_data, | ||
785 | .usb = &rx51_usb_data, | ||
786 | .power = &rx51_t2scripts_data, | 880 | .power = &rx51_t2scripts_data, |
787 | .codec = &rx51_codec_data, | 881 | .codec = &rx51_codec_data, |
788 | 882 | ||
@@ -790,8 +884,12 @@ static struct twl4030_platform_data rx51_twldata __initdata = { | |||
790 | .vaux2 = &rx51_vaux2, | 884 | .vaux2 = &rx51_vaux2, |
791 | .vaux4 = &rx51_vaux4, | 885 | .vaux4 = &rx51_vaux4, |
792 | .vmmc1 = &rx51_vmmc1, | 886 | .vmmc1 = &rx51_vmmc1, |
887 | .vpll1 = &rx51_vpll1, | ||
888 | .vpll2 = &rx51_vpll2, | ||
793 | .vsim = &rx51_vsim, | 889 | .vsim = &rx51_vsim, |
794 | .vdac = &rx51_vdac, | 890 | .vintana1 = &rx51_vintana1, |
891 | .vintana2 = &rx51_vintana2, | ||
892 | .vintdig = &rx51_vintdig, | ||
795 | .vio = &rx51_vio, | 893 | .vio = &rx51_vio, |
796 | }; | 894 | }; |
797 | 895 | ||
@@ -830,6 +928,12 @@ static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_2[] = { | |||
830 | .platform_data = &rx51_tsl2563_platform_data, | 928 | .platform_data = &rx51_tsl2563_platform_data, |
831 | }, | 929 | }, |
832 | #endif | 930 | #endif |
931 | #if defined(CONFIG_LEDS_LP5523) || defined(CONFIG_LEDS_LP5523_MODULE) | ||
932 | { | ||
933 | I2C_BOARD_INFO("lp5523", 0x32), | ||
934 | .platform_data = &rx51_lp5523_platform_data, | ||
935 | }, | ||
936 | #endif | ||
833 | { | 937 | { |
834 | I2C_BOARD_INFO("tpa6130a2", 0x60), | 938 | I2C_BOARD_INFO("tpa6130a2", 0x60), |
835 | .platform_data = &rx51_tpa6130a2_data, | 939 | .platform_data = &rx51_tpa6130a2_data, |
@@ -847,6 +951,13 @@ static int __init rx51_i2c_init(void) | |||
847 | rx51_twldata.vaux3 = &rx51_vaux3_cam; | 951 | rx51_twldata.vaux3 = &rx51_vaux3_cam; |
848 | } | 952 | } |
849 | rx51_twldata.vmmc2 = &rx51_vmmc2; | 953 | rx51_twldata.vmmc2 = &rx51_vmmc2; |
954 | omap3_pmic_get_config(&rx51_twldata, | ||
955 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC, | ||
956 | TWL_COMMON_REGULATOR_VDAC); | ||
957 | |||
958 | rx51_twldata.vdac->constraints.apply_uV = true; | ||
959 | rx51_twldata.vdac->constraints.name = "VDAC"; | ||
960 | |||
850 | omap_pmic_init(1, 2200, "twl5030", INT_34XX_SYS_NIRQ, &rx51_twldata); | 961 | omap_pmic_init(1, 2200, "twl5030", INT_34XX_SYS_NIRQ, &rx51_twldata); |
851 | omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2, | 962 | omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2, |
852 | ARRAY_SIZE(rx51_peripherals_i2c_board_info_2)); | 963 | ARRAY_SIZE(rx51_peripherals_i2c_board_info_2)); |
@@ -973,6 +1084,7 @@ error: | |||
973 | void __init rx51_peripherals_init(void) | 1084 | void __init rx51_peripherals_init(void) |
974 | { | 1085 | { |
975 | rx51_i2c_init(); | 1086 | rx51_i2c_init(); |
1087 | regulator_has_full_constraints(); | ||
976 | gpmc_onenand_init(board_onenand_data); | 1088 | gpmc_onenand_init(board_onenand_data); |
977 | board_smc91x_init(); | 1089 | board_smc91x_init(); |
978 | rx51_add_gpio_keys(); | 1090 | rx51_add_gpio_keys(); |
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index fec4cac8fa0a..5ea142f9bc97 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
@@ -160,7 +160,7 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") | |||
160 | .reserve = rx51_reserve, | 160 | .reserve = rx51_reserve, |
161 | .map_io = rx51_map_io, | 161 | .map_io = rx51_map_io, |
162 | .init_early = rx51_init_early, | 162 | .init_early = rx51_init_early, |
163 | .init_irq = omap_init_irq, | 163 | .init_irq = omap3_init_irq, |
164 | .init_machine = rx51_init, | 164 | .init_machine = rx51_init, |
165 | .timer = &omap_timer, | 165 | .timer = &omap3_timer, |
166 | MACHINE_END | 166 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c index 09fa7bfff8d6..a85d5b0b11da 100644 --- a/arch/arm/mach-omap2/board-ti8168evm.c +++ b/arch/arm/mach-omap2/board-ti8168evm.c | |||
@@ -33,11 +33,6 @@ static void __init ti8168_init_early(void) | |||
33 | omap2_init_common_devices(NULL, NULL); | 33 | omap2_init_common_devices(NULL, NULL); |
34 | } | 34 | } |
35 | 35 | ||
36 | static void __init ti8168_evm_init_irq(void) | ||
37 | { | ||
38 | omap_init_irq(); | ||
39 | } | ||
40 | |||
41 | static void __init ti8168_evm_init(void) | 36 | static void __init ti8168_evm_init(void) |
42 | { | 37 | { |
43 | omap_serial_init(); | 38 | omap_serial_init(); |
@@ -56,7 +51,7 @@ MACHINE_START(TI8168EVM, "ti8168evm") | |||
56 | .boot_params = 0x80000100, | 51 | .boot_params = 0x80000100, |
57 | .map_io = ti8168_evm_map_io, | 52 | .map_io = ti8168_evm_map_io, |
58 | .init_early = ti8168_init_early, | 53 | .init_early = ti8168_init_early, |
59 | .init_irq = ti8168_evm_init_irq, | 54 | .init_irq = ti816x_init_irq, |
60 | .timer = &omap_timer, | 55 | .timer = &omap3_timer, |
61 | .init_machine = ti8168_evm_init, | 56 | .init_machine = ti8168_evm_init, |
62 | MACHINE_END | 57 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-zoom-debugboard.c b/arch/arm/mach-omap2/board-zoom-debugboard.c index 6402e781c458..369c2eb7715b 100644 --- a/arch/arm/mach-omap2/board-zoom-debugboard.c +++ b/arch/arm/mach-omap2/board-zoom-debugboard.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #define ZOOM_SMSC911X_GPIO 158 | 23 | #define ZOOM_SMSC911X_GPIO 158 |
24 | #define ZOOM_QUADUART_CS 3 | 24 | #define ZOOM_QUADUART_CS 3 |
25 | #define ZOOM_QUADUART_GPIO 102 | 25 | #define ZOOM_QUADUART_GPIO 102 |
26 | #define ZOOM_QUADUART_RST_GPIO 152 | ||
26 | #define QUART_CLK 1843200 | 27 | #define QUART_CLK 1843200 |
27 | #define DEBUG_BASE 0x08000000 | 28 | #define DEBUG_BASE 0x08000000 |
28 | #define ZOOM_ETHR_START DEBUG_BASE | 29 | #define ZOOM_ETHR_START DEBUG_BASE |
@@ -67,6 +68,14 @@ static inline void __init zoom_init_quaduart(void) | |||
67 | unsigned long cs_mem_base; | 68 | unsigned long cs_mem_base; |
68 | int quart_gpio = 0; | 69 | int quart_gpio = 0; |
69 | 70 | ||
71 | if (gpio_request_one(ZOOM_QUADUART_RST_GPIO, | ||
72 | GPIOF_OUT_INIT_LOW, | ||
73 | "TL16CP754C GPIO") < 0) { | ||
74 | pr_err("Failed to request GPIO%d for TL16CP754C\n", | ||
75 | ZOOM_QUADUART_RST_GPIO); | ||
76 | return; | ||
77 | } | ||
78 | |||
70 | quart_cs = ZOOM_QUADUART_CS; | 79 | quart_cs = ZOOM_QUADUART_CS; |
71 | 80 | ||
72 | if (gpmc_cs_request(quart_cs, SZ_1M, &cs_mem_base) < 0) { | 81 | if (gpmc_cs_request(quart_cs, SZ_1M, &cs_mem_base) < 0) { |
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 118c6f53c5eb..13a644233667 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c | |||
@@ -105,21 +105,20 @@ static struct twl4030_keypad_data zoom_kp_twl4030_data = { | |||
105 | .rep = 1, | 105 | .rep = 1, |
106 | }; | 106 | }; |
107 | 107 | ||
108 | static struct regulator_consumer_supply zoom_vmmc1_supply = { | 108 | static struct regulator_consumer_supply zoom_vmmc1_supply[] = { |
109 | .supply = "vmmc", | 109 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), |
110 | }; | 110 | }; |
111 | 111 | ||
112 | static struct regulator_consumer_supply zoom_vsim_supply = { | 112 | static struct regulator_consumer_supply zoom_vsim_supply[] = { |
113 | .supply = "vmmc_aux", | 113 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"), |
114 | }; | 114 | }; |
115 | 115 | ||
116 | static struct regulator_consumer_supply zoom_vmmc2_supply = { | 116 | static struct regulator_consumer_supply zoom_vmmc2_supply[] = { |
117 | .supply = "vmmc", | 117 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"), |
118 | }; | 118 | }; |
119 | 119 | ||
120 | static struct regulator_consumer_supply zoom_vmmc3_supply = { | 120 | static struct regulator_consumer_supply zoom_vmmc3_supply[] = { |
121 | .supply = "vmmc", | 121 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"), |
122 | .dev_name = "omap_hsmmc.2", | ||
123 | }; | 122 | }; |
124 | 123 | ||
125 | /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ | 124 | /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ |
@@ -133,8 +132,8 @@ static struct regulator_init_data zoom_vmmc1 = { | |||
133 | | REGULATOR_CHANGE_MODE | 132 | | REGULATOR_CHANGE_MODE |
134 | | REGULATOR_CHANGE_STATUS, | 133 | | REGULATOR_CHANGE_STATUS, |
135 | }, | 134 | }, |
136 | .num_consumer_supplies = 1, | 135 | .num_consumer_supplies = ARRAY_SIZE(zoom_vmmc1_supply), |
137 | .consumer_supplies = &zoom_vmmc1_supply, | 136 | .consumer_supplies = zoom_vmmc1_supply, |
138 | }; | 137 | }; |
139 | 138 | ||
140 | /* VMMC2 for MMC2 card */ | 139 | /* VMMC2 for MMC2 card */ |
@@ -148,8 +147,8 @@ static struct regulator_init_data zoom_vmmc2 = { | |||
148 | .valid_ops_mask = REGULATOR_CHANGE_MODE | 147 | .valid_ops_mask = REGULATOR_CHANGE_MODE |
149 | | REGULATOR_CHANGE_STATUS, | 148 | | REGULATOR_CHANGE_STATUS, |
150 | }, | 149 | }, |
151 | .num_consumer_supplies = 1, | 150 | .num_consumer_supplies = ARRAY_SIZE(zoom_vmmc2_supply), |
152 | .consumer_supplies = &zoom_vmmc2_supply, | 151 | .consumer_supplies = zoom_vmmc2_supply, |
153 | }; | 152 | }; |
154 | 153 | ||
155 | /* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */ | 154 | /* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */ |
@@ -163,16 +162,16 @@ static struct regulator_init_data zoom_vsim = { | |||
163 | | REGULATOR_CHANGE_MODE | 162 | | REGULATOR_CHANGE_MODE |
164 | | REGULATOR_CHANGE_STATUS, | 163 | | REGULATOR_CHANGE_STATUS, |
165 | }, | 164 | }, |
166 | .num_consumer_supplies = 1, | 165 | .num_consumer_supplies = ARRAY_SIZE(zoom_vsim_supply), |
167 | .consumer_supplies = &zoom_vsim_supply, | 166 | .consumer_supplies = zoom_vsim_supply, |
168 | }; | 167 | }; |
169 | 168 | ||
170 | static struct regulator_init_data zoom_vmmc3 = { | 169 | static struct regulator_init_data zoom_vmmc3 = { |
171 | .constraints = { | 170 | .constraints = { |
172 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 171 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
173 | }, | 172 | }, |
174 | .num_consumer_supplies = 1, | 173 | .num_consumer_supplies = ARRAY_SIZE(zoom_vmmc3_supply), |
175 | .consumer_supplies = &zoom_vmmc3_supply, | 174 | .consumer_supplies = zoom_vmmc3_supply, |
176 | }; | 175 | }; |
177 | 176 | ||
178 | static struct fixed_voltage_config zoom_vwlan = { | 177 | static struct fixed_voltage_config zoom_vwlan = { |
@@ -227,40 +226,6 @@ static struct omap2_hsmmc_info mmc[] = { | |||
227 | {} /* Terminator */ | 226 | {} /* Terminator */ |
228 | }; | 227 | }; |
229 | 228 | ||
230 | static struct regulator_consumer_supply zoom_vpll2_supplies[] = { | ||
231 | REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||
232 | REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||
233 | }; | ||
234 | |||
235 | static struct regulator_consumer_supply zoom_vdda_dac_supply = | ||
236 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); | ||
237 | |||
238 | static struct regulator_init_data zoom_vpll2 = { | ||
239 | .constraints = { | ||
240 | .min_uV = 1800000, | ||
241 | .max_uV = 1800000, | ||
242 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
243 | | REGULATOR_MODE_STANDBY, | ||
244 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
245 | | REGULATOR_CHANGE_STATUS, | ||
246 | }, | ||
247 | .num_consumer_supplies = ARRAY_SIZE(zoom_vpll2_supplies), | ||
248 | .consumer_supplies = zoom_vpll2_supplies, | ||
249 | }; | ||
250 | |||
251 | static struct regulator_init_data zoom_vdac = { | ||
252 | .constraints = { | ||
253 | .min_uV = 1800000, | ||
254 | .max_uV = 1800000, | ||
255 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
256 | | REGULATOR_MODE_STANDBY, | ||
257 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
258 | | REGULATOR_CHANGE_STATUS, | ||
259 | }, | ||
260 | .num_consumer_supplies = 1, | ||
261 | .consumer_supplies = &zoom_vdda_dac_supply, | ||
262 | }; | ||
263 | |||
264 | static int zoom_twl_gpio_setup(struct device *dev, | 229 | static int zoom_twl_gpio_setup(struct device *dev, |
265 | unsigned gpio, unsigned ngpio) | 230 | unsigned gpio, unsigned ngpio) |
266 | { | 231 | { |
@@ -270,13 +235,6 @@ static int zoom_twl_gpio_setup(struct device *dev, | |||
270 | mmc[0].gpio_cd = gpio + 0; | 235 | mmc[0].gpio_cd = gpio + 0; |
271 | omap2_hsmmc_init(mmc); | 236 | omap2_hsmmc_init(mmc); |
272 | 237 | ||
273 | /* link regulators to MMC adapters ... we "know" the | ||
274 | * regulators will be set up only *after* we return. | ||
275 | */ | ||
276 | zoom_vmmc1_supply.dev = mmc[0].dev; | ||
277 | zoom_vsim_supply.dev = mmc[0].dev; | ||
278 | zoom_vmmc2_supply.dev = mmc[1].dev; | ||
279 | |||
280 | ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW, | 238 | ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW, |
281 | "lcd enable"); | 239 | "lcd enable"); |
282 | if (ret) | 240 | if (ret) |
@@ -292,26 +250,6 @@ static void zoom2_set_hs_extmute(int mute) | |||
292 | gpio_set_value(ZOOM2_HEADSET_EXTMUTE_GPIO, mute); | 250 | gpio_set_value(ZOOM2_HEADSET_EXTMUTE_GPIO, mute); |
293 | } | 251 | } |
294 | 252 | ||
295 | static int zoom_batt_table[] = { | ||
296 | /* 0 C*/ | ||
297 | 30800, 29500, 28300, 27100, | ||
298 | 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900, | ||
299 | 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100, | ||
300 | 11600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310, | ||
301 | 8020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830, | ||
302 | 5640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170, | ||
303 | 4040, 3910, 3790, 3670, 3550 | ||
304 | }; | ||
305 | |||
306 | static struct twl4030_bci_platform_data zoom_bci_data = { | ||
307 | .battery_tmp_tbl = zoom_batt_table, | ||
308 | .tblsize = ARRAY_SIZE(zoom_batt_table), | ||
309 | }; | ||
310 | |||
311 | static struct twl4030_usb_data zoom_usb_data = { | ||
312 | .usb_mode = T2_USB_MODE_ULPI, | ||
313 | }; | ||
314 | |||
315 | static struct twl4030_gpio_platform_data zoom_gpio_data = { | 253 | static struct twl4030_gpio_platform_data zoom_gpio_data = { |
316 | .gpio_base = OMAP_MAX_GPIO_LINES, | 254 | .gpio_base = OMAP_MAX_GPIO_LINES, |
317 | .irq_base = TWL4030_GPIO_IRQ_BASE, | 255 | .irq_base = TWL4030_GPIO_IRQ_BASE, |
@@ -319,41 +257,29 @@ static struct twl4030_gpio_platform_data zoom_gpio_data = { | |||
319 | .setup = zoom_twl_gpio_setup, | 257 | .setup = zoom_twl_gpio_setup, |
320 | }; | 258 | }; |
321 | 259 | ||
322 | static struct twl4030_madc_platform_data zoom_madc_data = { | ||
323 | .irq_line = 1, | ||
324 | }; | ||
325 | |||
326 | static struct twl4030_codec_audio_data zoom_audio_data; | ||
327 | |||
328 | static struct twl4030_codec_data zoom_codec_data = { | ||
329 | .audio_mclk = 26000000, | ||
330 | .audio = &zoom_audio_data, | ||
331 | }; | ||
332 | |||
333 | static struct twl4030_platform_data zoom_twldata = { | 260 | static struct twl4030_platform_data zoom_twldata = { |
334 | .irq_base = TWL4030_IRQ_BASE, | ||
335 | .irq_end = TWL4030_IRQ_END, | ||
336 | |||
337 | /* platform_data for children goes here */ | 261 | /* platform_data for children goes here */ |
338 | .bci = &zoom_bci_data, | ||
339 | .madc = &zoom_madc_data, | ||
340 | .usb = &zoom_usb_data, | ||
341 | .gpio = &zoom_gpio_data, | 262 | .gpio = &zoom_gpio_data, |
342 | .keypad = &zoom_kp_twl4030_data, | 263 | .keypad = &zoom_kp_twl4030_data, |
343 | .codec = &zoom_codec_data, | ||
344 | .vmmc1 = &zoom_vmmc1, | 264 | .vmmc1 = &zoom_vmmc1, |
345 | .vmmc2 = &zoom_vmmc2, | 265 | .vmmc2 = &zoom_vmmc2, |
346 | .vsim = &zoom_vsim, | 266 | .vsim = &zoom_vsim, |
347 | .vpll2 = &zoom_vpll2, | ||
348 | .vdac = &zoom_vdac, | ||
349 | }; | 267 | }; |
350 | 268 | ||
351 | static int __init omap_i2c_init(void) | 269 | static int __init omap_i2c_init(void) |
352 | { | 270 | { |
271 | omap3_pmic_get_config(&zoom_twldata, | ||
272 | TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_BCI | | ||
273 | TWL_COMMON_PDATA_MADC | TWL_COMMON_PDATA_AUDIO, | ||
274 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); | ||
275 | |||
353 | if (machine_is_omap_zoom2()) { | 276 | if (machine_is_omap_zoom2()) { |
354 | zoom_audio_data.ramp_delay_value = 3; /* 161 ms */ | 277 | struct twl4030_codec_audio_data *audio_data; |
355 | zoom_audio_data.hs_extmute = 1; | 278 | audio_data = zoom_twldata.codec->audio; |
356 | zoom_audio_data.set_hs_extmute = zoom2_set_hs_extmute; | 279 | |
280 | audio_data->ramp_delay_value = 3; /* 161 ms */ | ||
281 | audio_data->hs_extmute = 1; | ||
282 | audio_data->set_hs_extmute = zoom2_set_hs_extmute; | ||
357 | } | 283 | } |
358 | omap_pmic_init(1, 2400, "twl5030", INT_34XX_SYS_NIRQ, &zoom_twldata); | 284 | omap_pmic_init(1, 2400, "twl5030", INT_34XX_SYS_NIRQ, &zoom_twldata); |
359 | omap_register_i2c_bus(2, 400, NULL, 0); | 285 | omap_register_i2c_bus(2, 400, NULL, 0); |
diff --git a/arch/arm/mach-omap2/board-zoom.c b/arch/arm/mach-omap2/board-zoom.c index 4b133d75c935..8a98c3c303fc 100644 --- a/arch/arm/mach-omap2/board-zoom.c +++ b/arch/arm/mach-omap2/board-zoom.c | |||
@@ -137,9 +137,9 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board") | |||
137 | .reserve = omap_reserve, | 137 | .reserve = omap_reserve, |
138 | .map_io = omap3_map_io, | 138 | .map_io = omap3_map_io, |
139 | .init_early = omap_zoom_init_early, | 139 | .init_early = omap_zoom_init_early, |
140 | .init_irq = omap_init_irq, | 140 | .init_irq = omap3_init_irq, |
141 | .init_machine = omap_zoom_init, | 141 | .init_machine = omap_zoom_init, |
142 | .timer = &omap_timer, | 142 | .timer = &omap3_timer, |
143 | MACHINE_END | 143 | MACHINE_END |
144 | 144 | ||
145 | MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") | 145 | MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") |
@@ -147,7 +147,7 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") | |||
147 | .reserve = omap_reserve, | 147 | .reserve = omap_reserve, |
148 | .map_io = omap3_map_io, | 148 | .map_io = omap3_map_io, |
149 | .init_early = omap_zoom_init_early, | 149 | .init_early = omap_zoom_init_early, |
150 | .init_irq = omap_init_irq, | 150 | .init_irq = omap3_init_irq, |
151 | .init_machine = omap_zoom_init, | 151 | .init_machine = omap_zoom_init, |
152 | .timer = &omap_timer, | 152 | .timer = &omap3_timer, |
153 | MACHINE_END | 153 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 180299e4a838..bf9c36c7dffd 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c | |||
@@ -453,6 +453,7 @@ int __init omap2_clk_switch_mpurate_at_boot(const char *mpurate_ck_name) | |||
453 | if (IS_ERR_VALUE(r)) { | 453 | if (IS_ERR_VALUE(r)) { |
454 | WARN(1, "clock: %s: unable to set MPU rate to %d: %d\n", | 454 | WARN(1, "clock: %s: unable to set MPU rate to %d: %d\n", |
455 | mpurate_ck->name, mpurate, r); | 455 | mpurate_ck->name, mpurate, r); |
456 | clk_put(mpurate_ck); | ||
456 | return -EINVAL; | 457 | return -EINVAL; |
457 | } | 458 | } |
458 | 459 | ||
diff --git a/arch/arm/mach-omap2/common-board-devices.c b/arch/arm/mach-omap2/common-board-devices.c index 94ccf464677b..bcb0c5817167 100644 --- a/arch/arm/mach-omap2/common-board-devices.c +++ b/arch/arm/mach-omap2/common-board-devices.c | |||
@@ -20,36 +20,15 @@ | |||
20 | * | 20 | * |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/i2c/twl.h> | ||
25 | |||
26 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
27 | #include <linux/spi/spi.h> | 24 | #include <linux/spi/spi.h> |
28 | #include <linux/spi/ads7846.h> | 25 | #include <linux/spi/ads7846.h> |
29 | 26 | ||
30 | #include <plat/i2c.h> | ||
31 | #include <plat/mcspi.h> | 27 | #include <plat/mcspi.h> |
32 | #include <plat/nand.h> | 28 | #include <plat/nand.h> |
33 | 29 | ||
34 | #include "common-board-devices.h" | 30 | #include "common-board-devices.h" |
35 | 31 | ||
36 | static struct i2c_board_info __initdata pmic_i2c_board_info = { | ||
37 | .addr = 0x48, | ||
38 | .flags = I2C_CLIENT_WAKE, | ||
39 | }; | ||
40 | |||
41 | void __init omap_pmic_init(int bus, u32 clkrate, | ||
42 | const char *pmic_type, int pmic_irq, | ||
43 | struct twl4030_platform_data *pmic_data) | ||
44 | { | ||
45 | strncpy(pmic_i2c_board_info.type, pmic_type, | ||
46 | sizeof(pmic_i2c_board_info.type)); | ||
47 | pmic_i2c_board_info.irq = pmic_irq; | ||
48 | pmic_i2c_board_info.platform_data = pmic_data; | ||
49 | |||
50 | omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); | ||
51 | } | ||
52 | |||
53 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ | 32 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ |
54 | defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) | 33 | defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) |
55 | static struct omap2_mcspi_device_config ads7846_mcspi_config = { | 34 | static struct omap2_mcspi_device_config ads7846_mcspi_config = { |
@@ -115,9 +94,7 @@ void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce, | |||
115 | #endif | 94 | #endif |
116 | 95 | ||
117 | #if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE) | 96 | #if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE) |
118 | static struct omap_nand_platform_data nand_data = { | 97 | static struct omap_nand_platform_data nand_data; |
119 | .dma_channel = -1, /* disable DMA in OMAP NAND driver */ | ||
120 | }; | ||
121 | 98 | ||
122 | void __init omap_nand_flash_init(int options, struct mtd_partition *parts, | 99 | void __init omap_nand_flash_init(int options, struct mtd_partition *parts, |
123 | int nr_parts) | 100 | int nr_parts) |
@@ -148,7 +125,7 @@ void __init omap_nand_flash_init(int options, struct mtd_partition *parts, | |||
148 | nand_data.cs = nandcs; | 125 | nand_data.cs = nandcs; |
149 | nand_data.parts = parts; | 126 | nand_data.parts = parts; |
150 | nand_data.nr_parts = nr_parts; | 127 | nand_data.nr_parts = nr_parts; |
151 | nand_data.options = options; | 128 | nand_data.devsize = options; |
152 | 129 | ||
153 | printk(KERN_INFO "Registering NAND on CS%d\n", nandcs); | 130 | printk(KERN_INFO "Registering NAND on CS%d\n", nandcs); |
154 | if (gpmc_nand_init(&nand_data) < 0) | 131 | if (gpmc_nand_init(&nand_data) < 0) |
diff --git a/arch/arm/mach-omap2/common-board-devices.h b/arch/arm/mach-omap2/common-board-devices.h index 679719051df5..a0b4a42836ab 100644 --- a/arch/arm/mach-omap2/common-board-devices.h +++ b/arch/arm/mach-omap2/common-board-devices.h | |||
@@ -1,33 +1,11 @@ | |||
1 | #ifndef __OMAP_COMMON_BOARD_DEVICES__ | 1 | #ifndef __OMAP_COMMON_BOARD_DEVICES__ |
2 | #define __OMAP_COMMON_BOARD_DEVICES__ | 2 | #define __OMAP_COMMON_BOARD_DEVICES__ |
3 | 3 | ||
4 | #include "twl-common.h" | ||
5 | |||
4 | #define NAND_BLOCK_SIZE SZ_128K | 6 | #define NAND_BLOCK_SIZE SZ_128K |
5 | 7 | ||
6 | struct twl4030_platform_data; | ||
7 | struct mtd_partition; | 8 | struct mtd_partition; |
8 | |||
9 | void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq, | ||
10 | struct twl4030_platform_data *pmic_data); | ||
11 | |||
12 | static inline void omap2_pmic_init(const char *pmic_type, | ||
13 | struct twl4030_platform_data *pmic_data) | ||
14 | { | ||
15 | omap_pmic_init(2, 2600, pmic_type, INT_24XX_SYS_NIRQ, pmic_data); | ||
16 | } | ||
17 | |||
18 | static inline void omap3_pmic_init(const char *pmic_type, | ||
19 | struct twl4030_platform_data *pmic_data) | ||
20 | { | ||
21 | omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data); | ||
22 | } | ||
23 | |||
24 | static inline void omap4_pmic_init(const char *pmic_type, | ||
25 | struct twl4030_platform_data *pmic_data) | ||
26 | { | ||
27 | /* Phoenix Audio IC needs I2C1 to start with 400 KHz or less */ | ||
28 | omap_pmic_init(1, 400, pmic_type, OMAP44XX_IRQ_SYS_1N, pmic_data); | ||
29 | } | ||
30 | |||
31 | struct ads7846_platform_data; | 9 | struct ads7846_platform_data; |
32 | 10 | ||
33 | void omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce, | 11 | void omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce, |
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 5b8ca680ed93..1077ad663f93 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
@@ -230,7 +230,7 @@ struct omap_device_pm_latency omap_keyboard_latency[] = { | |||
230 | }; | 230 | }; |
231 | 231 | ||
232 | int __init omap4_keyboard_init(struct omap4_keypad_platform_data | 232 | int __init omap4_keyboard_init(struct omap4_keypad_platform_data |
233 | *sdp4430_keypad_data) | 233 | *sdp4430_keypad_data, struct omap_board_data *bdata) |
234 | { | 234 | { |
235 | struct omap_device *od; | 235 | struct omap_device *od; |
236 | struct omap_hwmod *oh; | 236 | struct omap_hwmod *oh; |
@@ -257,6 +257,7 @@ int __init omap4_keyboard_init(struct omap4_keypad_platform_data | |||
257 | name, oh->name); | 257 | name, oh->name); |
258 | return PTR_ERR(od); | 258 | return PTR_ERR(od); |
259 | } | 259 | } |
260 | oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt); | ||
260 | 261 | ||
261 | return 0; | 262 | return 0; |
262 | } | 263 | } |
diff --git a/arch/arm/mach-omap2/gpmc-nand.c b/arch/arm/mach-omap2/gpmc-nand.c index c1791d08ae56..8ad210bda9a9 100644 --- a/arch/arm/mach-omap2/gpmc-nand.c +++ b/arch/arm/mach-omap2/gpmc-nand.c | |||
@@ -20,8 +20,6 @@ | |||
20 | #include <plat/board.h> | 20 | #include <plat/board.h> |
21 | #include <plat/gpmc.h> | 21 | #include <plat/gpmc.h> |
22 | 22 | ||
23 | static struct omap_nand_platform_data *gpmc_nand_data; | ||
24 | |||
25 | static struct resource gpmc_nand_resource = { | 23 | static struct resource gpmc_nand_resource = { |
26 | .flags = IORESOURCE_MEM, | 24 | .flags = IORESOURCE_MEM, |
27 | }; | 25 | }; |
@@ -33,7 +31,7 @@ static struct platform_device gpmc_nand_device = { | |||
33 | .resource = &gpmc_nand_resource, | 31 | .resource = &gpmc_nand_resource, |
34 | }; | 32 | }; |
35 | 33 | ||
36 | static int omap2_nand_gpmc_retime(void) | 34 | static int omap2_nand_gpmc_retime(struct omap_nand_platform_data *gpmc_nand_data) |
37 | { | 35 | { |
38 | struct gpmc_timings t; | 36 | struct gpmc_timings t; |
39 | int err; | 37 | int err; |
@@ -83,13 +81,11 @@ static int omap2_nand_gpmc_retime(void) | |||
83 | return 0; | 81 | return 0; |
84 | } | 82 | } |
85 | 83 | ||
86 | int __init gpmc_nand_init(struct omap_nand_platform_data *_nand_data) | 84 | int __init gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data) |
87 | { | 85 | { |
88 | int err = 0; | 86 | int err = 0; |
89 | struct device *dev = &gpmc_nand_device.dev; | 87 | struct device *dev = &gpmc_nand_device.dev; |
90 | 88 | ||
91 | gpmc_nand_data = _nand_data; | ||
92 | gpmc_nand_data->nand_setup = omap2_nand_gpmc_retime; | ||
93 | gpmc_nand_device.dev.platform_data = gpmc_nand_data; | 89 | gpmc_nand_device.dev.platform_data = gpmc_nand_data; |
94 | 90 | ||
95 | err = gpmc_cs_request(gpmc_nand_data->cs, NAND_IO_SIZE, | 91 | err = gpmc_cs_request(gpmc_nand_data->cs, NAND_IO_SIZE, |
@@ -100,7 +96,7 @@ int __init gpmc_nand_init(struct omap_nand_platform_data *_nand_data) | |||
100 | } | 96 | } |
101 | 97 | ||
102 | /* Set timings in GPMC */ | 98 | /* Set timings in GPMC */ |
103 | err = omap2_nand_gpmc_retime(); | 99 | err = omap2_nand_gpmc_retime(gpmc_nand_data); |
104 | if (err < 0) { | 100 | if (err < 0) { |
105 | dev_err(dev, "Unable to set gpmc timings: %d\n", err); | 101 | dev_err(dev, "Unable to set gpmc timings: %d\n", err); |
106 | return err; | 102 | return err; |
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index 66868c5d5a29..a9b45c76e1d3 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/string.h> | 14 | #include <linux/string.h> |
15 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
16 | #include <linux/gpio.h> | ||
16 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
17 | #include <plat/mmc.h> | 18 | #include <plat/mmc.h> |
18 | #include <plat/omap-pm.h> | 19 | #include <plat/omap-pm.h> |
@@ -213,12 +214,10 @@ static int nop_mmc_set_power(struct device *dev, int slot, int power_on, | |||
213 | static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller, | 214 | static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller, |
214 | int controller_nr) | 215 | int controller_nr) |
215 | { | 216 | { |
216 | if ((mmc_controller->slots[0].switch_pin > 0) && \ | 217 | if (gpio_is_valid(mmc_controller->slots[0].switch_pin)) |
217 | (mmc_controller->slots[0].switch_pin < OMAP_MAX_GPIO_LINES)) | ||
218 | omap_mux_init_gpio(mmc_controller->slots[0].switch_pin, | 218 | omap_mux_init_gpio(mmc_controller->slots[0].switch_pin, |
219 | OMAP_PIN_INPUT_PULLUP); | 219 | OMAP_PIN_INPUT_PULLUP); |
220 | if ((mmc_controller->slots[0].gpio_wp > 0) && \ | 220 | if (gpio_is_valid(mmc_controller->slots[0].gpio_wp)) |
221 | (mmc_controller->slots[0].gpio_wp < OMAP_MAX_GPIO_LINES)) | ||
222 | omap_mux_init_gpio(mmc_controller->slots[0].gpio_wp, | 221 | omap_mux_init_gpio(mmc_controller->slots[0].gpio_wp, |
223 | OMAP_PIN_INPUT_PULLUP); | 222 | OMAP_PIN_INPUT_PULLUP); |
224 | if (cpu_is_omap34xx()) { | 223 | if (cpu_is_omap34xx()) { |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 441e79d043a7..2ce1ce6fb4db 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -333,23 +333,9 @@ static int _set_hwmod_postsetup_state(struct omap_hwmod *oh, void *data) | |||
333 | return omap_hwmod_set_postsetup_state(oh, *(u8 *)data); | 333 | return omap_hwmod_set_postsetup_state(oh, *(u8 *)data); |
334 | } | 334 | } |
335 | 335 | ||
336 | /* See irq.c, omap4-common.c and entry-macro.S */ | ||
336 | void __iomem *omap_irq_base; | 337 | void __iomem *omap_irq_base; |
337 | 338 | ||
338 | /* | ||
339 | * Initialize asm_irq_base for entry-macro.S | ||
340 | */ | ||
341 | static inline void omap_irq_base_init(void) | ||
342 | { | ||
343 | if (cpu_is_omap24xx()) | ||
344 | omap_irq_base = OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE); | ||
345 | else if (cpu_is_omap34xx()) | ||
346 | omap_irq_base = OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE); | ||
347 | else if (cpu_is_omap44xx()) | ||
348 | omap_irq_base = OMAP2_L4_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE); | ||
349 | else | ||
350 | pr_err("Could not initialize omap_irq_base\n"); | ||
351 | } | ||
352 | |||
353 | void __init omap2_init_common_infrastructure(void) | 339 | void __init omap2_init_common_infrastructure(void) |
354 | { | 340 | { |
355 | u8 postsetup_state; | 341 | u8 postsetup_state; |
@@ -422,7 +408,6 @@ void __init omap2_init_common_devices(struct omap_sdrc_params *sdrc_cs0, | |||
422 | _omap2_init_reprogram_sdrc(); | 408 | _omap2_init_reprogram_sdrc(); |
423 | } | 409 | } |
424 | 410 | ||
425 | omap_irq_base_init(); | ||
426 | } | 411 | } |
427 | 412 | ||
428 | /* | 413 | /* |
diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c index adb083e41acd..f286012783c6 100644 --- a/arch/arm/mach-omap2/iommu2.c +++ b/arch/arm/mach-omap2/iommu2.c | |||
@@ -225,8 +225,8 @@ static u32 omap2_get_pte_attr(struct iotlb_entry *e) | |||
225 | attr = e->mixed << 5; | 225 | attr = e->mixed << 5; |
226 | attr |= e->endian; | 226 | attr |= e->endian; |
227 | attr |= e->elsz >> 3; | 227 | attr |= e->elsz >> 3; |
228 | attr <<= ((e->pgsz & MMU_CAM_PGSZ_4K) ? 0 : 6); | 228 | attr <<= (((e->pgsz == MMU_CAM_PGSZ_4K) || |
229 | 229 | (e->pgsz == MMU_CAM_PGSZ_64K)) ? 0 : 6); | |
230 | return attr; | 230 | return attr; |
231 | } | 231 | } |
232 | 232 | ||
diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 3af2b7a1045e..3a12f7586a4c 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c | |||
@@ -141,25 +141,20 @@ omap_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num) | |||
141 | IRQ_NOREQUEST | IRQ_NOPROBE, 0); | 141 | IRQ_NOREQUEST | IRQ_NOPROBE, 0); |
142 | } | 142 | } |
143 | 143 | ||
144 | void __init omap_init_irq(void) | 144 | static void __init omap_init_irq(u32 base, int nr_irqs) |
145 | { | 145 | { |
146 | unsigned long nr_of_irqs = 0; | 146 | unsigned long nr_of_irqs = 0; |
147 | unsigned int nr_banks = 0; | 147 | unsigned int nr_banks = 0; |
148 | int i, j; | 148 | int i, j; |
149 | 149 | ||
150 | omap_irq_base = ioremap(base, SZ_4K); | ||
151 | if (WARN_ON(!omap_irq_base)) | ||
152 | return; | ||
153 | |||
150 | for (i = 0; i < ARRAY_SIZE(irq_banks); i++) { | 154 | for (i = 0; i < ARRAY_SIZE(irq_banks); i++) { |
151 | unsigned long base = 0; | ||
152 | struct omap_irq_bank *bank = irq_banks + i; | 155 | struct omap_irq_bank *bank = irq_banks + i; |
153 | 156 | ||
154 | if (cpu_is_omap24xx()) | 157 | bank->nr_irqs = nr_irqs; |
155 | base = OMAP24XX_IC_BASE; | ||
156 | else if (cpu_is_omap34xx()) | ||
157 | base = OMAP34XX_IC_BASE; | ||
158 | |||
159 | BUG_ON(!base); | ||
160 | |||
161 | if (cpu_is_ti816x()) | ||
162 | bank->nr_irqs = 128; | ||
163 | 158 | ||
164 | /* Static mapping, never released */ | 159 | /* Static mapping, never released */ |
165 | bank->base_reg = ioremap(base, SZ_4K); | 160 | bank->base_reg = ioremap(base, SZ_4K); |
@@ -181,6 +176,21 @@ void __init omap_init_irq(void) | |||
181 | nr_of_irqs, nr_banks, nr_banks > 1 ? "s" : ""); | 176 | nr_of_irqs, nr_banks, nr_banks > 1 ? "s" : ""); |
182 | } | 177 | } |
183 | 178 | ||
179 | void __init omap2_init_irq(void) | ||
180 | { | ||
181 | omap_init_irq(OMAP24XX_IC_BASE, 96); | ||
182 | } | ||
183 | |||
184 | void __init omap3_init_irq(void) | ||
185 | { | ||
186 | omap_init_irq(OMAP34XX_IC_BASE, 96); | ||
187 | } | ||
188 | |||
189 | void __init ti816x_init_irq(void) | ||
190 | { | ||
191 | omap_init_irq(OMAP34XX_IC_BASE, 128); | ||
192 | } | ||
193 | |||
184 | #ifdef CONFIG_ARCH_OMAP3 | 194 | #ifdef CONFIG_ARCH_OMAP3 |
185 | static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)]; | 195 | static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)]; |
186 | 196 | ||
diff --git a/arch/arm/mach-omap2/omap-iommu.c b/arch/arm/mach-omap2/omap-iommu.c index 3fc5dc7233da..e61feadcda4e 100644 --- a/arch/arm/mach-omap2/omap-iommu.c +++ b/arch/arm/mach-omap2/omap-iommu.c | |||
@@ -67,7 +67,7 @@ static struct iommu_device omap4_devices[] = { | |||
67 | .pdata = { | 67 | .pdata = { |
68 | .name = "ducati", | 68 | .name = "ducati", |
69 | .nr_tlb_entries = 32, | 69 | .nr_tlb_entries = 32, |
70 | .clk_name = "ducati_ick", | 70 | .clk_name = "ipu_fck", |
71 | .da_start = 0x0, | 71 | .da_start = 0x0, |
72 | .da_end = 0xFFFFF000, | 72 | .da_end = 0xFFFFF000, |
73 | }, | 73 | }, |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 9ef8c29dd817..35ac3e5f6e94 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -19,6 +19,8 @@ | |||
19 | #include <asm/hardware/gic.h> | 19 | #include <asm/hardware/gic.h> |
20 | #include <asm/hardware/cache-l2x0.h> | 20 | #include <asm/hardware/cache-l2x0.h> |
21 | 21 | ||
22 | #include <plat/irqs.h> | ||
23 | |||
22 | #include <mach/hardware.h> | 24 | #include <mach/hardware.h> |
23 | #include <mach/omap4-common.h> | 25 | #include <mach/omap4-common.h> |
24 | 26 | ||
@@ -31,17 +33,15 @@ void __iomem *gic_dist_base_addr; | |||
31 | 33 | ||
32 | void __init gic_init_irq(void) | 34 | void __init gic_init_irq(void) |
33 | { | 35 | { |
34 | void __iomem *gic_cpu_base; | ||
35 | |||
36 | /* Static mapping, never released */ | 36 | /* Static mapping, never released */ |
37 | gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K); | 37 | gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K); |
38 | BUG_ON(!gic_dist_base_addr); | 38 | BUG_ON(!gic_dist_base_addr); |
39 | 39 | ||
40 | /* Static mapping, never released */ | 40 | /* Static mapping, never released */ |
41 | gic_cpu_base = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_512); | 41 | omap_irq_base = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_512); |
42 | BUG_ON(!gic_cpu_base); | 42 | BUG_ON(!omap_irq_base); |
43 | 43 | ||
44 | gic_init(0, 29, gic_dist_base_addr, gic_cpu_base); | 44 | gic_init(0, 29, gic_dist_base_addr, omap_irq_base); |
45 | } | 45 | } |
46 | 46 | ||
47 | #ifdef CONFIG_CACHE_L2X0 | 47 | #ifdef CONFIG_CACHE_L2X0 |
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c index e01da45c0537..4411163e012d 100644 --- a/arch/arm/mach-omap2/pm-debug.c +++ b/arch/arm/mach-omap2/pm-debug.c | |||
@@ -38,155 +38,12 @@ | |||
38 | #include "prm2xxx_3xxx.h" | 38 | #include "prm2xxx_3xxx.h" |
39 | #include "pm.h" | 39 | #include "pm.h" |
40 | 40 | ||
41 | int omap2_pm_debug; | ||
42 | u32 enable_off_mode; | 41 | u32 enable_off_mode; |
43 | u32 sleep_while_idle; | ||
44 | u32 wakeup_timer_seconds; | ||
45 | u32 wakeup_timer_milliseconds; | ||
46 | |||
47 | #define DUMP_PRM_MOD_REG(mod, reg) \ | ||
48 | regs[reg_count].name = #mod "." #reg; \ | ||
49 | regs[reg_count++].val = omap2_prm_read_mod_reg(mod, reg) | ||
50 | #define DUMP_CM_MOD_REG(mod, reg) \ | ||
51 | regs[reg_count].name = #mod "." #reg; \ | ||
52 | regs[reg_count++].val = omap2_cm_read_mod_reg(mod, reg) | ||
53 | #define DUMP_PRM_REG(reg) \ | ||
54 | regs[reg_count].name = #reg; \ | ||
55 | regs[reg_count++].val = __raw_readl(reg) | ||
56 | #define DUMP_CM_REG(reg) \ | ||
57 | regs[reg_count].name = #reg; \ | ||
58 | regs[reg_count++].val = __raw_readl(reg) | ||
59 | #define DUMP_INTC_REG(reg, off) \ | ||
60 | regs[reg_count].name = #reg; \ | ||
61 | regs[reg_count++].val = \ | ||
62 | __raw_readl(OMAP2_L4_IO_ADDRESS(0x480fe000 + (off))) | ||
63 | |||
64 | void omap2_pm_dump(int mode, int resume, unsigned int us) | ||
65 | { | ||
66 | struct reg { | ||
67 | const char *name; | ||
68 | u32 val; | ||
69 | } regs[32]; | ||
70 | int reg_count = 0, i; | ||
71 | const char *s1 = NULL, *s2 = NULL; | ||
72 | |||
73 | if (!resume) { | ||
74 | #if 0 | ||
75 | /* MPU */ | ||
76 | DUMP_PRM_MOD_REG(OCP_MOD, OMAP2_PRM_IRQENABLE_MPU_OFFSET); | ||
77 | DUMP_CM_MOD_REG(MPU_MOD, OMAP2_CM_CLKSTCTRL); | ||
78 | DUMP_PRM_MOD_REG(MPU_MOD, OMAP2_PM_PWSTCTRL); | ||
79 | DUMP_PRM_MOD_REG(MPU_MOD, OMAP2_PM_PWSTST); | ||
80 | DUMP_PRM_MOD_REG(MPU_MOD, PM_WKDEP); | ||
81 | #endif | ||
82 | #if 0 | ||
83 | /* INTC */ | ||
84 | DUMP_INTC_REG(INTC_MIR0, 0x0084); | ||
85 | DUMP_INTC_REG(INTC_MIR1, 0x00a4); | ||
86 | DUMP_INTC_REG(INTC_MIR2, 0x00c4); | ||
87 | #endif | ||
88 | #if 0 | ||
89 | DUMP_CM_MOD_REG(CORE_MOD, CM_FCLKEN1); | ||
90 | if (cpu_is_omap24xx()) { | ||
91 | DUMP_CM_MOD_REG(CORE_MOD, OMAP24XX_CM_FCLKEN2); | ||
92 | DUMP_PRM_MOD_REG(OMAP24XX_GR_MOD, | ||
93 | OMAP2_PRCM_CLKEMUL_CTRL_OFFSET); | ||
94 | DUMP_PRM_MOD_REG(OMAP24XX_GR_MOD, | ||
95 | OMAP2_PRCM_CLKSRC_CTRL_OFFSET); | ||
96 | } | ||
97 | DUMP_CM_MOD_REG(WKUP_MOD, CM_FCLKEN); | ||
98 | DUMP_CM_MOD_REG(CORE_MOD, CM_ICLKEN1); | ||
99 | DUMP_CM_MOD_REG(CORE_MOD, CM_ICLKEN2); | ||
100 | DUMP_CM_MOD_REG(WKUP_MOD, CM_ICLKEN); | ||
101 | DUMP_CM_MOD_REG(PLL_MOD, CM_CLKEN); | ||
102 | DUMP_CM_MOD_REG(PLL_MOD, CM_AUTOIDLE); | ||
103 | DUMP_PRM_MOD_REG(CORE_MOD, OMAP2_PM_PWSTST); | ||
104 | #endif | ||
105 | #if 0 | ||
106 | /* DSP */ | ||
107 | if (cpu_is_omap24xx()) { | ||
108 | DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_FCLKEN); | ||
109 | DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_ICLKEN); | ||
110 | DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_IDLEST); | ||
111 | DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_AUTOIDLE); | ||
112 | DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_CLKSEL); | ||
113 | DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_CM_CLKSTCTRL); | ||
114 | DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_RM_RSTCTRL); | ||
115 | DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_RM_RSTST); | ||
116 | DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_PM_PWSTCTRL); | ||
117 | DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_PM_PWSTST); | ||
118 | } | ||
119 | #endif | ||
120 | } else { | ||
121 | DUMP_PRM_MOD_REG(CORE_MOD, PM_WKST1); | ||
122 | if (cpu_is_omap24xx()) | ||
123 | DUMP_PRM_MOD_REG(CORE_MOD, OMAP24XX_PM_WKST2); | ||
124 | DUMP_PRM_MOD_REG(WKUP_MOD, PM_WKST); | ||
125 | DUMP_PRM_MOD_REG(OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET); | ||
126 | #if 1 | ||
127 | DUMP_INTC_REG(INTC_PENDING_IRQ0, 0x0098); | ||
128 | DUMP_INTC_REG(INTC_PENDING_IRQ1, 0x00b8); | ||
129 | DUMP_INTC_REG(INTC_PENDING_IRQ2, 0x00d8); | ||
130 | #endif | ||
131 | } | ||
132 | |||
133 | switch (mode) { | ||
134 | case 0: | ||
135 | s1 = "full"; | ||
136 | s2 = "retention"; | ||
137 | break; | ||
138 | case 1: | ||
139 | s1 = "MPU"; | ||
140 | s2 = "retention"; | ||
141 | break; | ||
142 | case 2: | ||
143 | s1 = "MPU"; | ||
144 | s2 = "idle"; | ||
145 | break; | ||
146 | } | ||
147 | |||
148 | if (!resume) | ||
149 | #ifdef CONFIG_NO_HZ | ||
150 | printk(KERN_INFO | ||
151 | "--- Going to %s %s (next timer after %u ms)\n", s1, s2, | ||
152 | jiffies_to_msecs(get_next_timer_interrupt(jiffies) - | ||
153 | jiffies)); | ||
154 | #else | ||
155 | printk(KERN_INFO "--- Going to %s %s\n", s1, s2); | ||
156 | #endif | ||
157 | else | ||
158 | printk(KERN_INFO "--- Woke up (slept for %u.%03u ms)\n", | ||
159 | us / 1000, us % 1000); | ||
160 | |||
161 | for (i = 0; i < reg_count; i++) | ||
162 | printk(KERN_INFO "%-20s: 0x%08x\n", regs[i].name, regs[i].val); | ||
163 | } | ||
164 | |||
165 | void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds) | ||
166 | { | ||
167 | u32 tick_rate, cycles; | ||
168 | |||
169 | if (!seconds && !milliseconds) | ||
170 | return; | ||
171 | |||
172 | tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup)); | ||
173 | cycles = tick_rate * seconds + tick_rate * milliseconds / 1000; | ||
174 | omap_dm_timer_stop(gptimer_wakeup); | ||
175 | omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles); | ||
176 | |||
177 | pr_info("PM: Resume timer in %u.%03u secs" | ||
178 | " (%d ticks at %d ticks/sec.)\n", | ||
179 | seconds, milliseconds, cycles, tick_rate); | ||
180 | } | ||
181 | 42 | ||
182 | #ifdef CONFIG_DEBUG_FS | 43 | #ifdef CONFIG_DEBUG_FS |
183 | #include <linux/debugfs.h> | 44 | #include <linux/debugfs.h> |
184 | #include <linux/seq_file.h> | 45 | #include <linux/seq_file.h> |
185 | 46 | ||
186 | static void pm_dbg_regset_store(u32 *ptr); | ||
187 | |||
188 | static struct dentry *pm_dbg_dir; | ||
189 | |||
190 | static int pm_dbg_init_done; | 47 | static int pm_dbg_init_done; |
191 | 48 | ||
192 | static int pm_dbg_init(void); | 49 | static int pm_dbg_init(void); |
@@ -196,160 +53,6 @@ enum { | |||
196 | DEBUG_FILE_TIMERS, | 53 | DEBUG_FILE_TIMERS, |
197 | }; | 54 | }; |
198 | 55 | ||
199 | struct pm_module_def { | ||
200 | char name[8]; /* Name of the module */ | ||
201 | short type; /* CM or PRM */ | ||
202 | unsigned short offset; | ||
203 | int low; /* First register address on this module */ | ||
204 | int high; /* Last register address on this module */ | ||
205 | }; | ||
206 | |||
207 | #define MOD_CM 0 | ||
208 | #define MOD_PRM 1 | ||
209 | |||
210 | static const struct pm_module_def *pm_dbg_reg_modules; | ||
211 | static const struct pm_module_def omap3_pm_reg_modules[] = { | ||
212 | { "IVA2", MOD_CM, OMAP3430_IVA2_MOD, 0, 0x4c }, | ||
213 | { "OCP", MOD_CM, OCP_MOD, 0, 0x10 }, | ||
214 | { "MPU", MOD_CM, MPU_MOD, 4, 0x4c }, | ||
215 | { "CORE", MOD_CM, CORE_MOD, 0, 0x4c }, | ||
216 | { "SGX", MOD_CM, OMAP3430ES2_SGX_MOD, 0, 0x4c }, | ||
217 | { "WKUP", MOD_CM, WKUP_MOD, 0, 0x40 }, | ||
218 | { "CCR", MOD_CM, PLL_MOD, 0, 0x70 }, | ||
219 | { "DSS", MOD_CM, OMAP3430_DSS_MOD, 0, 0x4c }, | ||
220 | { "CAM", MOD_CM, OMAP3430_CAM_MOD, 0, 0x4c }, | ||
221 | { "PER", MOD_CM, OMAP3430_PER_MOD, 0, 0x4c }, | ||
222 | { "EMU", MOD_CM, OMAP3430_EMU_MOD, 0x40, 0x54 }, | ||
223 | { "NEON", MOD_CM, OMAP3430_NEON_MOD, 0x20, 0x48 }, | ||
224 | { "USB", MOD_CM, OMAP3430ES2_USBHOST_MOD, 0, 0x4c }, | ||
225 | |||
226 | { "IVA2", MOD_PRM, OMAP3430_IVA2_MOD, 0x50, 0xfc }, | ||
227 | { "OCP", MOD_PRM, OCP_MOD, 4, 0x1c }, | ||
228 | { "MPU", MOD_PRM, MPU_MOD, 0x58, 0xe8 }, | ||
229 | { "CORE", MOD_PRM, CORE_MOD, 0x58, 0xf8 }, | ||
230 | { "SGX", MOD_PRM, OMAP3430ES2_SGX_MOD, 0x58, 0xe8 }, | ||
231 | { "WKUP", MOD_PRM, WKUP_MOD, 0xa0, 0xb0 }, | ||
232 | { "CCR", MOD_PRM, PLL_MOD, 0x40, 0x70 }, | ||
233 | { "DSS", MOD_PRM, OMAP3430_DSS_MOD, 0x58, 0xe8 }, | ||
234 | { "CAM", MOD_PRM, OMAP3430_CAM_MOD, 0x58, 0xe8 }, | ||
235 | { "PER", MOD_PRM, OMAP3430_PER_MOD, 0x58, 0xe8 }, | ||
236 | { "EMU", MOD_PRM, OMAP3430_EMU_MOD, 0x58, 0xe4 }, | ||
237 | { "GLBL", MOD_PRM, OMAP3430_GR_MOD, 0x20, 0xe4 }, | ||
238 | { "NEON", MOD_PRM, OMAP3430_NEON_MOD, 0x58, 0xe8 }, | ||
239 | { "USB", MOD_PRM, OMAP3430ES2_USBHOST_MOD, 0x58, 0xe8 }, | ||
240 | { "", 0, 0, 0, 0 }, | ||
241 | }; | ||
242 | |||
243 | #define PM_DBG_MAX_REG_SETS 4 | ||
244 | |||
245 | static void *pm_dbg_reg_set[PM_DBG_MAX_REG_SETS]; | ||
246 | |||
247 | static int pm_dbg_get_regset_size(void) | ||
248 | { | ||
249 | static int regset_size; | ||
250 | |||
251 | if (regset_size == 0) { | ||
252 | int i = 0; | ||
253 | |||
254 | while (pm_dbg_reg_modules[i].name[0] != 0) { | ||
255 | regset_size += pm_dbg_reg_modules[i].high + | ||
256 | 4 - pm_dbg_reg_modules[i].low; | ||
257 | i++; | ||
258 | } | ||
259 | } | ||
260 | return regset_size; | ||
261 | } | ||
262 | |||
263 | static int pm_dbg_show_regs(struct seq_file *s, void *unused) | ||
264 | { | ||
265 | int i, j; | ||
266 | unsigned long val; | ||
267 | int reg_set = (int)s->private; | ||
268 | u32 *ptr; | ||
269 | void *store = NULL; | ||
270 | int regs; | ||
271 | int linefeed; | ||
272 | |||
273 | if (reg_set == 0) { | ||
274 | store = kmalloc(pm_dbg_get_regset_size(), GFP_KERNEL); | ||
275 | ptr = store; | ||
276 | pm_dbg_regset_store(ptr); | ||
277 | } else { | ||
278 | ptr = pm_dbg_reg_set[reg_set - 1]; | ||
279 | } | ||
280 | |||
281 | i = 0; | ||
282 | |||
283 | while (pm_dbg_reg_modules[i].name[0] != 0) { | ||
284 | regs = 0; | ||
285 | linefeed = 0; | ||
286 | if (pm_dbg_reg_modules[i].type == MOD_CM) | ||
287 | seq_printf(s, "MOD: CM_%s (%08x)\n", | ||
288 | pm_dbg_reg_modules[i].name, | ||
289 | (u32)(OMAP3430_CM_BASE + | ||
290 | pm_dbg_reg_modules[i].offset)); | ||
291 | else | ||
292 | seq_printf(s, "MOD: PRM_%s (%08x)\n", | ||
293 | pm_dbg_reg_modules[i].name, | ||
294 | (u32)(OMAP3430_PRM_BASE + | ||
295 | pm_dbg_reg_modules[i].offset)); | ||
296 | |||
297 | for (j = pm_dbg_reg_modules[i].low; | ||
298 | j <= pm_dbg_reg_modules[i].high; j += 4) { | ||
299 | val = *(ptr++); | ||
300 | if (val != 0) { | ||
301 | regs++; | ||
302 | if (linefeed) { | ||
303 | seq_printf(s, "\n"); | ||
304 | linefeed = 0; | ||
305 | } | ||
306 | seq_printf(s, " %02x => %08lx", j, val); | ||
307 | if (regs % 4 == 0) | ||
308 | linefeed = 1; | ||
309 | } | ||
310 | } | ||
311 | seq_printf(s, "\n"); | ||
312 | i++; | ||
313 | } | ||
314 | |||
315 | if (store != NULL) | ||
316 | kfree(store); | ||
317 | |||
318 | return 0; | ||
319 | } | ||
320 | |||
321 | static void pm_dbg_regset_store(u32 *ptr) | ||
322 | { | ||
323 | int i, j; | ||
324 | u32 val; | ||
325 | |||
326 | i = 0; | ||
327 | |||
328 | while (pm_dbg_reg_modules[i].name[0] != 0) { | ||
329 | for (j = pm_dbg_reg_modules[i].low; | ||
330 | j <= pm_dbg_reg_modules[i].high; j += 4) { | ||
331 | if (pm_dbg_reg_modules[i].type == MOD_CM) | ||
332 | val = omap2_cm_read_mod_reg( | ||
333 | pm_dbg_reg_modules[i].offset, j); | ||
334 | else | ||
335 | val = omap2_prm_read_mod_reg( | ||
336 | pm_dbg_reg_modules[i].offset, j); | ||
337 | *(ptr++) = val; | ||
338 | } | ||
339 | i++; | ||
340 | } | ||
341 | } | ||
342 | |||
343 | int pm_dbg_regset_save(int reg_set) | ||
344 | { | ||
345 | if (pm_dbg_reg_set[reg_set-1] == NULL) | ||
346 | return -EINVAL; | ||
347 | |||
348 | pm_dbg_regset_store(pm_dbg_reg_set[reg_set-1]); | ||
349 | |||
350 | return 0; | ||
351 | } | ||
352 | |||
353 | static const char pwrdm_state_names[][PWRDM_MAX_PWRSTS] = { | 56 | static const char pwrdm_state_names[][PWRDM_MAX_PWRSTS] = { |
354 | "OFF", | 57 | "OFF", |
355 | "RET", | 58 | "RET", |
@@ -469,11 +172,6 @@ static int pm_dbg_open(struct inode *inode, struct file *file) | |||
469 | }; | 172 | }; |
470 | } | 173 | } |
471 | 174 | ||
472 | static int pm_dbg_reg_open(struct inode *inode, struct file *file) | ||
473 | { | ||
474 | return single_open(file, pm_dbg_show_regs, inode->i_private); | ||
475 | } | ||
476 | |||
477 | static const struct file_operations debug_fops = { | 175 | static const struct file_operations debug_fops = { |
478 | .open = pm_dbg_open, | 176 | .open = pm_dbg_open, |
479 | .read = seq_read, | 177 | .read = seq_read, |
@@ -481,40 +179,6 @@ static const struct file_operations debug_fops = { | |||
481 | .release = single_release, | 179 | .release = single_release, |
482 | }; | 180 | }; |
483 | 181 | ||
484 | static const struct file_operations debug_reg_fops = { | ||
485 | .open = pm_dbg_reg_open, | ||
486 | .read = seq_read, | ||
487 | .llseek = seq_lseek, | ||
488 | .release = single_release, | ||
489 | }; | ||
490 | |||
491 | int pm_dbg_regset_init(int reg_set) | ||
492 | { | ||
493 | char name[2]; | ||
494 | |||
495 | if (!pm_dbg_init_done) | ||
496 | pm_dbg_init(); | ||
497 | |||
498 | if (reg_set < 1 || reg_set > PM_DBG_MAX_REG_SETS || | ||
499 | pm_dbg_reg_set[reg_set-1] != NULL) | ||
500 | return -EINVAL; | ||
501 | |||
502 | pm_dbg_reg_set[reg_set-1] = | ||
503 | kmalloc(pm_dbg_get_regset_size(), GFP_KERNEL); | ||
504 | |||
505 | if (pm_dbg_reg_set[reg_set-1] == NULL) | ||
506 | return -ENOMEM; | ||
507 | |||
508 | if (pm_dbg_dir != NULL) { | ||
509 | sprintf(name, "%d", reg_set); | ||
510 | |||
511 | (void) debugfs_create_file(name, S_IRUGO, | ||
512 | pm_dbg_dir, (void *)reg_set, &debug_reg_fops); | ||
513 | } | ||
514 | |||
515 | return 0; | ||
516 | } | ||
517 | |||
518 | static int pwrdm_suspend_get(void *data, u64 *val) | 182 | static int pwrdm_suspend_get(void *data, u64 *val) |
519 | { | 183 | { |
520 | int ret = -EINVAL; | 184 | int ret = -EINVAL; |
@@ -576,9 +240,6 @@ static int option_set(void *data, u64 val) | |||
576 | { | 240 | { |
577 | u32 *option = data; | 241 | u32 *option = data; |
578 | 242 | ||
579 | if (option == &wakeup_timer_milliseconds && val >= 1000) | ||
580 | return -EINVAL; | ||
581 | |||
582 | *option = val; | 243 | *option = val; |
583 | 244 | ||
584 | if (option == &enable_off_mode) { | 245 | if (option == &enable_off_mode) { |
@@ -595,22 +256,13 @@ static int option_set(void *data, u64 val) | |||
595 | 256 | ||
596 | DEFINE_SIMPLE_ATTRIBUTE(pm_dbg_option_fops, option_get, option_set, "%llu\n"); | 257 | DEFINE_SIMPLE_ATTRIBUTE(pm_dbg_option_fops, option_get, option_set, "%llu\n"); |
597 | 258 | ||
598 | static int pm_dbg_init(void) | 259 | static int __init pm_dbg_init(void) |
599 | { | 260 | { |
600 | int i; | ||
601 | struct dentry *d; | 261 | struct dentry *d; |
602 | char name[2]; | ||
603 | 262 | ||
604 | if (pm_dbg_init_done) | 263 | if (pm_dbg_init_done) |
605 | return 0; | 264 | return 0; |
606 | 265 | ||
607 | if (cpu_is_omap34xx()) | ||
608 | pm_dbg_reg_modules = omap3_pm_reg_modules; | ||
609 | else { | ||
610 | printk(KERN_ERR "%s: only OMAP3 supported\n", __func__); | ||
611 | return -ENODEV; | ||
612 | } | ||
613 | |||
614 | d = debugfs_create_dir("pm_debug", NULL); | 266 | d = debugfs_create_dir("pm_debug", NULL); |
615 | if (IS_ERR(d)) | 267 | if (IS_ERR(d)) |
616 | return PTR_ERR(d); | 268 | return PTR_ERR(d); |
@@ -622,30 +274,8 @@ static int pm_dbg_init(void) | |||
622 | 274 | ||
623 | pwrdm_for_each(pwrdms_setup, (void *)d); | 275 | pwrdm_for_each(pwrdms_setup, (void *)d); |
624 | 276 | ||
625 | pm_dbg_dir = debugfs_create_dir("registers", d); | ||
626 | if (IS_ERR(pm_dbg_dir)) | ||
627 | return PTR_ERR(pm_dbg_dir); | ||
628 | |||
629 | (void) debugfs_create_file("current", S_IRUGO, | ||
630 | pm_dbg_dir, (void *)0, &debug_reg_fops); | ||
631 | |||
632 | for (i = 0; i < PM_DBG_MAX_REG_SETS; i++) | ||
633 | if (pm_dbg_reg_set[i] != NULL) { | ||
634 | sprintf(name, "%d", i+1); | ||
635 | (void) debugfs_create_file(name, S_IRUGO, | ||
636 | pm_dbg_dir, (void *)(i+1), &debug_reg_fops); | ||
637 | |||
638 | } | ||
639 | |||
640 | (void) debugfs_create_file("enable_off_mode", S_IRUGO | S_IWUSR, d, | 277 | (void) debugfs_create_file("enable_off_mode", S_IRUGO | S_IWUSR, d, |
641 | &enable_off_mode, &pm_dbg_option_fops); | 278 | &enable_off_mode, &pm_dbg_option_fops); |
642 | (void) debugfs_create_file("sleep_while_idle", S_IRUGO | S_IWUSR, d, | ||
643 | &sleep_while_idle, &pm_dbg_option_fops); | ||
644 | (void) debugfs_create_file("wakeup_timer_seconds", S_IRUGO | S_IWUSR, d, | ||
645 | &wakeup_timer_seconds, &pm_dbg_option_fops); | ||
646 | (void) debugfs_create_file("wakeup_timer_milliseconds", | ||
647 | S_IRUGO | S_IWUSR, d, &wakeup_timer_milliseconds, | ||
648 | &pm_dbg_option_fops); | ||
649 | pm_dbg_init_done = 1; | 279 | pm_dbg_init_done = 1; |
650 | 280 | ||
651 | return 0; | 281 | return 0; |
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index 45bcfce77352..babac19e3ec1 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h | |||
@@ -60,32 +60,16 @@ inline void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params) | |||
60 | extern int omap3_pm_get_suspend_state(struct powerdomain *pwrdm); | 60 | extern int omap3_pm_get_suspend_state(struct powerdomain *pwrdm); |
61 | extern int omap3_pm_set_suspend_state(struct powerdomain *pwrdm, int state); | 61 | extern int omap3_pm_set_suspend_state(struct powerdomain *pwrdm, int state); |
62 | 62 | ||
63 | extern u32 wakeup_timer_seconds; | ||
64 | extern u32 wakeup_timer_milliseconds; | ||
65 | extern struct omap_dm_timer *gptimer_wakeup; | ||
66 | |||
67 | #ifdef CONFIG_PM_DEBUG | 63 | #ifdef CONFIG_PM_DEBUG |
68 | extern void omap2_pm_dump(int mode, int resume, unsigned int us); | ||
69 | extern void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds); | ||
70 | extern int omap2_pm_debug; | ||
71 | extern u32 enable_off_mode; | 64 | extern u32 enable_off_mode; |
72 | extern u32 sleep_while_idle; | ||
73 | #else | 65 | #else |
74 | #define omap2_pm_dump(mode, resume, us) do {} while (0); | ||
75 | #define omap2_pm_wakeup_on_timer(seconds, milliseconds) do {} while (0); | ||
76 | #define omap2_pm_debug 0 | ||
77 | #define enable_off_mode 0 | 66 | #define enable_off_mode 0 |
78 | #define sleep_while_idle 0 | ||
79 | #endif | 67 | #endif |
80 | 68 | ||
81 | #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) | 69 | #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) |
82 | extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev); | 70 | extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev); |
83 | extern int pm_dbg_regset_save(int reg_set); | ||
84 | extern int pm_dbg_regset_init(int reg_set); | ||
85 | #else | 71 | #else |
86 | #define pm_dbg_update_time(pwrdm, prev) do {} while (0); | 72 | #define pm_dbg_update_time(pwrdm, prev) do {} while (0); |
87 | #define pm_dbg_regset_save(reg_set) do {} while (0); | ||
88 | #define pm_dbg_regset_init(reg_set) do {} while (0); | ||
89 | #endif /* CONFIG_PM_DEBUG */ | 73 | #endif /* CONFIG_PM_DEBUG */ |
90 | 74 | ||
91 | extern void omap24xx_idle_loop_suspend(void); | 75 | extern void omap24xx_idle_loop_suspend(void); |
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index df3ded6fe194..bf089e743ed9 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
@@ -53,6 +53,8 @@ | |||
53 | #include "powerdomain.h" | 53 | #include "powerdomain.h" |
54 | #include "clockdomain.h" | 54 | #include "clockdomain.h" |
55 | 55 | ||
56 | static int omap2_pm_debug; | ||
57 | |||
56 | #ifdef CONFIG_SUSPEND | 58 | #ifdef CONFIG_SUSPEND |
57 | static suspend_state_t suspend_state = PM_SUSPEND_ON; | 59 | static suspend_state_t suspend_state = PM_SUSPEND_ON; |
58 | static inline bool is_suspending(void) | 60 | static inline bool is_suspending(void) |
@@ -123,7 +125,6 @@ static void omap2_enter_full_retention(void) | |||
123 | omap2_gpio_prepare_for_idle(0); | 125 | omap2_gpio_prepare_for_idle(0); |
124 | 126 | ||
125 | if (omap2_pm_debug) { | 127 | if (omap2_pm_debug) { |
126 | omap2_pm_dump(0, 0, 0); | ||
127 | getnstimeofday(&ts_preidle); | 128 | getnstimeofday(&ts_preidle); |
128 | } | 129 | } |
129 | 130 | ||
@@ -160,7 +161,6 @@ no_sleep: | |||
160 | getnstimeofday(&ts_postidle); | 161 | getnstimeofday(&ts_postidle); |
161 | ts_idle = timespec_sub(ts_postidle, ts_preidle); | 162 | ts_idle = timespec_sub(ts_postidle, ts_preidle); |
162 | tmp = timespec_to_ns(&ts_idle) * NSEC_PER_USEC; | 163 | tmp = timespec_to_ns(&ts_idle) * NSEC_PER_USEC; |
163 | omap2_pm_dump(0, 1, tmp); | ||
164 | } | 164 | } |
165 | omap2_gpio_resume_after_idle(); | 165 | omap2_gpio_resume_after_idle(); |
166 | 166 | ||
@@ -247,7 +247,6 @@ static void omap2_enter_mpu_retention(void) | |||
247 | } | 247 | } |
248 | 248 | ||
249 | if (omap2_pm_debug) { | 249 | if (omap2_pm_debug) { |
250 | omap2_pm_dump(only_idle ? 2 : 1, 0, 0); | ||
251 | getnstimeofday(&ts_preidle); | 250 | getnstimeofday(&ts_preidle); |
252 | } | 251 | } |
253 | 252 | ||
@@ -259,7 +258,6 @@ static void omap2_enter_mpu_retention(void) | |||
259 | getnstimeofday(&ts_postidle); | 258 | getnstimeofday(&ts_postidle); |
260 | ts_idle = timespec_sub(ts_postidle, ts_preidle); | 259 | ts_idle = timespec_sub(ts_postidle, ts_preidle); |
261 | tmp = timespec_to_ns(&ts_idle) * NSEC_PER_USEC; | 260 | tmp = timespec_to_ns(&ts_idle) * NSEC_PER_USEC; |
262 | omap2_pm_dump(only_idle ? 2 : 1, 1, tmp); | ||
263 | } | 261 | } |
264 | } | 262 | } |
265 | 263 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index c155c9d1c82c..96a76245284c 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -497,8 +497,6 @@ console_still_active: | |||
497 | 497 | ||
498 | int omap3_can_sleep(void) | 498 | int omap3_can_sleep(void) |
499 | { | 499 | { |
500 | if (!sleep_while_idle) | ||
501 | return 0; | ||
502 | if (!omap_uart_can_sleep()) | 500 | if (!omap_uart_can_sleep()) |
503 | return 0; | 501 | return 0; |
504 | return 1; | 502 | return 1; |
@@ -534,10 +532,6 @@ static int omap3_pm_suspend(void) | |||
534 | struct power_state *pwrst; | 532 | struct power_state *pwrst; |
535 | int state, ret = 0; | 533 | int state, ret = 0; |
536 | 534 | ||
537 | if (wakeup_timer_seconds || wakeup_timer_milliseconds) | ||
538 | omap2_pm_wakeup_on_timer(wakeup_timer_seconds, | ||
539 | wakeup_timer_milliseconds); | ||
540 | |||
541 | /* Read current next_pwrsts */ | 535 | /* Read current next_pwrsts */ |
542 | list_for_each_entry(pwrst, &pwrst_list, node) | 536 | list_for_each_entry(pwrst, &pwrst_list, node) |
543 | pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm); | 537 | pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm); |
diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c index fb7dc52394a8..2ce2fb7664bc 100644 --- a/arch/arm/mach-omap2/smartreflex.c +++ b/arch/arm/mach-omap2/smartreflex.c | |||
@@ -143,7 +143,7 @@ static irqreturn_t sr_interrupt(int irq, void *data) | |||
143 | sr_write_reg(sr_info, IRQSTATUS, status); | 143 | sr_write_reg(sr_info, IRQSTATUS, status); |
144 | } | 144 | } |
145 | 145 | ||
146 | if (sr_class->class_type == SR_CLASS2 && sr_class->notify) | 146 | if (sr_class->notify) |
147 | sr_class->notify(sr_info->voltdm, status); | 147 | sr_class->notify(sr_info->voltdm, status); |
148 | 148 | ||
149 | return IRQ_HANDLED; | 149 | return IRQ_HANDLED; |
@@ -258,9 +258,7 @@ static int sr_late_init(struct omap_sr *sr_info) | |||
258 | struct resource *mem; | 258 | struct resource *mem; |
259 | int ret = 0; | 259 | int ret = 0; |
260 | 260 | ||
261 | if (sr_class->class_type == SR_CLASS2 && | 261 | if (sr_class->notify && sr_class->notify_flags && sr_info->irq) { |
262 | sr_class->notify_flags && sr_info->irq) { | ||
263 | |||
264 | name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name); | 262 | name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name); |
265 | if (name == NULL) { | 263 | if (name == NULL) { |
266 | ret = -ENOMEM; | 264 | ret = -ENOMEM; |
@@ -270,6 +268,7 @@ static int sr_late_init(struct omap_sr *sr_info) | |||
270 | 0, name, (void *)sr_info); | 268 | 0, name, (void *)sr_info); |
271 | if (ret) | 269 | if (ret) |
272 | goto error; | 270 | goto error; |
271 | disable_irq(sr_info->irq); | ||
273 | } | 272 | } |
274 | 273 | ||
275 | if (pdata && pdata->enable_on_init) | 274 | if (pdata && pdata->enable_on_init) |
@@ -278,16 +277,16 @@ static int sr_late_init(struct omap_sr *sr_info) | |||
278 | return ret; | 277 | return ret; |
279 | 278 | ||
280 | error: | 279 | error: |
281 | iounmap(sr_info->base); | 280 | iounmap(sr_info->base); |
282 | mem = platform_get_resource(sr_info->pdev, IORESOURCE_MEM, 0); | 281 | mem = platform_get_resource(sr_info->pdev, IORESOURCE_MEM, 0); |
283 | release_mem_region(mem->start, resource_size(mem)); | 282 | release_mem_region(mem->start, resource_size(mem)); |
284 | list_del(&sr_info->node); | 283 | list_del(&sr_info->node); |
285 | dev_err(&sr_info->pdev->dev, "%s: ERROR in registering" | 284 | dev_err(&sr_info->pdev->dev, "%s: ERROR in registering" |
286 | "interrupt handler. Smartreflex will" | 285 | "interrupt handler. Smartreflex will" |
287 | "not function as desired\n", __func__); | 286 | "not function as desired\n", __func__); |
288 | kfree(name); | 287 | kfree(name); |
289 | kfree(sr_info); | 288 | kfree(sr_info); |
290 | return ret; | 289 | return ret; |
291 | } | 290 | } |
292 | 291 | ||
293 | static void sr_v1_disable(struct omap_sr *sr) | 292 | static void sr_v1_disable(struct omap_sr *sr) |
@@ -808,10 +807,13 @@ static int omap_sr_autocomp_store(void *data, u64 val) | |||
808 | return -EINVAL; | 807 | return -EINVAL; |
809 | } | 808 | } |
810 | 809 | ||
811 | if (!val) | 810 | /* control enable/disable only if there is a delta in value */ |
812 | sr_stop_vddautocomp(sr_info); | 811 | if (sr_info->autocomp_active != val) { |
813 | else | 812 | if (!val) |
814 | sr_start_vddautocomp(sr_info); | 813 | sr_stop_vddautocomp(sr_info); |
814 | else | ||
815 | sr_start_vddautocomp(sr_info); | ||
816 | } | ||
815 | 817 | ||
816 | return 0; | 818 | return 0; |
817 | } | 819 | } |
diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c deleted file mode 100644 index 3b9cf85f4bb9..000000000000 --- a/arch/arm/mach-omap2/timer-gp.c +++ /dev/null | |||
@@ -1,266 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-omap2/timer-gp.c | ||
3 | * | ||
4 | * OMAP2 GP timer support. | ||
5 | * | ||
6 | * Copyright (C) 2009 Nokia Corporation | ||
7 | * | ||
8 | * Update to use new clocksource/clockevent layers | ||
9 | * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com> | ||
10 | * Copyright (C) 2007 MontaVista Software, Inc. | ||
11 | * | ||
12 | * Original driver: | ||
13 | * Copyright (C) 2005 Nokia Corporation | ||
14 | * Author: Paul Mundt <paul.mundt@nokia.com> | ||
15 | * Juha Yrjölä <juha.yrjola@nokia.com> | ||
16 | * OMAP Dual-mode timer framework support by Timo Teras | ||
17 | * | ||
18 | * Some parts based off of TI's 24xx code: | ||
19 | * | ||
20 | * Copyright (C) 2004-2009 Texas Instruments, Inc. | ||
21 | * | ||
22 | * Roughly modelled after the OMAP1 MPU timer code. | ||
23 | * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> | ||
24 | * | ||
25 | * This file is subject to the terms and conditions of the GNU General Public | ||
26 | * License. See the file "COPYING" in the main directory of this archive | ||
27 | * for more details. | ||
28 | */ | ||
29 | #include <linux/init.h> | ||
30 | #include <linux/time.h> | ||
31 | #include <linux/interrupt.h> | ||
32 | #include <linux/err.h> | ||
33 | #include <linux/clk.h> | ||
34 | #include <linux/delay.h> | ||
35 | #include <linux/irq.h> | ||
36 | #include <linux/clocksource.h> | ||
37 | #include <linux/clockchips.h> | ||
38 | |||
39 | #include <asm/mach/time.h> | ||
40 | #include <plat/dmtimer.h> | ||
41 | #include <asm/localtimer.h> | ||
42 | #include <asm/sched_clock.h> | ||
43 | #include <plat/common.h> | ||
44 | #include <plat/omap_hwmod.h> | ||
45 | |||
46 | #include "timer-gp.h" | ||
47 | |||
48 | |||
49 | /* MAX_GPTIMER_ID: number of GPTIMERs on the chip */ | ||
50 | #define MAX_GPTIMER_ID 12 | ||
51 | |||
52 | static struct omap_dm_timer *gptimer; | ||
53 | static struct clock_event_device clockevent_gpt; | ||
54 | static u8 __initdata gptimer_id = 1; | ||
55 | static u8 __initdata inited; | ||
56 | struct omap_dm_timer *gptimer_wakeup; | ||
57 | |||
58 | static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id) | ||
59 | { | ||
60 | struct omap_dm_timer *gpt = (struct omap_dm_timer *)dev_id; | ||
61 | struct clock_event_device *evt = &clockevent_gpt; | ||
62 | |||
63 | omap_dm_timer_write_status(gpt, OMAP_TIMER_INT_OVERFLOW); | ||
64 | |||
65 | evt->event_handler(evt); | ||
66 | return IRQ_HANDLED; | ||
67 | } | ||
68 | |||
69 | static struct irqaction omap2_gp_timer_irq = { | ||
70 | .name = "gp timer", | ||
71 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | ||
72 | .handler = omap2_gp_timer_interrupt, | ||
73 | }; | ||
74 | |||
75 | static int omap2_gp_timer_set_next_event(unsigned long cycles, | ||
76 | struct clock_event_device *evt) | ||
77 | { | ||
78 | omap_dm_timer_set_load_start(gptimer, 0, 0xffffffff - cycles); | ||
79 | |||
80 | return 0; | ||
81 | } | ||
82 | |||
83 | static void omap2_gp_timer_set_mode(enum clock_event_mode mode, | ||
84 | struct clock_event_device *evt) | ||
85 | { | ||
86 | u32 period; | ||
87 | |||
88 | omap_dm_timer_stop(gptimer); | ||
89 | |||
90 | switch (mode) { | ||
91 | case CLOCK_EVT_MODE_PERIODIC: | ||
92 | period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / HZ; | ||
93 | period -= 1; | ||
94 | omap_dm_timer_set_load_start(gptimer, 1, 0xffffffff - period); | ||
95 | break; | ||
96 | case CLOCK_EVT_MODE_ONESHOT: | ||
97 | break; | ||
98 | case CLOCK_EVT_MODE_UNUSED: | ||
99 | case CLOCK_EVT_MODE_SHUTDOWN: | ||
100 | case CLOCK_EVT_MODE_RESUME: | ||
101 | break; | ||
102 | } | ||
103 | } | ||
104 | |||
105 | static struct clock_event_device clockevent_gpt = { | ||
106 | .name = "gp timer", | ||
107 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | ||
108 | .shift = 32, | ||
109 | .set_next_event = omap2_gp_timer_set_next_event, | ||
110 | .set_mode = omap2_gp_timer_set_mode, | ||
111 | }; | ||
112 | |||
113 | /** | ||
114 | * omap2_gp_clockevent_set_gptimer - set which GPTIMER is used for clockevents | ||
115 | * @id: GPTIMER to use (1..MAX_GPTIMER_ID) | ||
116 | * | ||
117 | * Define the GPTIMER that the system should use for the tick timer. | ||
118 | * Meant to be called from board-*.c files in the event that GPTIMER1, the | ||
119 | * default, is unsuitable. Returns -EINVAL on error or 0 on success. | ||
120 | */ | ||
121 | int __init omap2_gp_clockevent_set_gptimer(u8 id) | ||
122 | { | ||
123 | if (id < 1 || id > MAX_GPTIMER_ID) | ||
124 | return -EINVAL; | ||
125 | |||
126 | BUG_ON(inited); | ||
127 | |||
128 | gptimer_id = id; | ||
129 | |||
130 | return 0; | ||
131 | } | ||
132 | |||
133 | static void __init omap2_gp_clockevent_init(void) | ||
134 | { | ||
135 | u32 tick_rate; | ||
136 | int src; | ||
137 | char clockevent_hwmod_name[8]; /* 8 = sizeof("timerXX0") */ | ||
138 | |||
139 | inited = 1; | ||
140 | |||
141 | sprintf(clockevent_hwmod_name, "timer%d", gptimer_id); | ||
142 | omap_hwmod_setup_one(clockevent_hwmod_name); | ||
143 | |||
144 | gptimer = omap_dm_timer_request_specific(gptimer_id); | ||
145 | BUG_ON(gptimer == NULL); | ||
146 | gptimer_wakeup = gptimer; | ||
147 | |||
148 | #if defined(CONFIG_OMAP_32K_TIMER) | ||
149 | src = OMAP_TIMER_SRC_32_KHZ; | ||
150 | #else | ||
151 | src = OMAP_TIMER_SRC_SYS_CLK; | ||
152 | WARN(gptimer_id == 12, "WARNING: GPTIMER12 can only use the " | ||
153 | "secure 32KiHz clock source\n"); | ||
154 | #endif | ||
155 | |||
156 | if (gptimer_id != 12) | ||
157 | WARN(IS_ERR_VALUE(omap_dm_timer_set_source(gptimer, src)), | ||
158 | "timer-gp: omap_dm_timer_set_source() failed\n"); | ||
159 | |||
160 | tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer)); | ||
161 | |||
162 | pr_info("OMAP clockevent source: GPTIMER%d at %u Hz\n", | ||
163 | gptimer_id, tick_rate); | ||
164 | |||
165 | omap2_gp_timer_irq.dev_id = (void *)gptimer; | ||
166 | setup_irq(omap_dm_timer_get_irq(gptimer), &omap2_gp_timer_irq); | ||
167 | omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW); | ||
168 | |||
169 | clockevent_gpt.mult = div_sc(tick_rate, NSEC_PER_SEC, | ||
170 | clockevent_gpt.shift); | ||
171 | clockevent_gpt.max_delta_ns = | ||
172 | clockevent_delta2ns(0xffffffff, &clockevent_gpt); | ||
173 | clockevent_gpt.min_delta_ns = | ||
174 | clockevent_delta2ns(3, &clockevent_gpt); | ||
175 | /* Timer internal resynch latency. */ | ||
176 | |||
177 | clockevent_gpt.cpumask = cpumask_of(0); | ||
178 | clockevents_register_device(&clockevent_gpt); | ||
179 | } | ||
180 | |||
181 | /* Clocksource code */ | ||
182 | |||
183 | #ifdef CONFIG_OMAP_32K_TIMER | ||
184 | /* | ||
185 | * When 32k-timer is enabled, don't use GPTimer for clocksource | ||
186 | * instead, just leave default clocksource which uses the 32k | ||
187 | * sync counter. See clocksource setup in plat-omap/counter_32k.c | ||
188 | */ | ||
189 | |||
190 | static void __init omap2_gp_clocksource_init(void) | ||
191 | { | ||
192 | omap_init_clocksource_32k(); | ||
193 | } | ||
194 | |||
195 | #else | ||
196 | /* | ||
197 | * clocksource | ||
198 | */ | ||
199 | static DEFINE_CLOCK_DATA(cd); | ||
200 | static struct omap_dm_timer *gpt_clocksource; | ||
201 | static cycle_t clocksource_read_cycles(struct clocksource *cs) | ||
202 | { | ||
203 | return (cycle_t)omap_dm_timer_read_counter(gpt_clocksource); | ||
204 | } | ||
205 | |||
206 | static struct clocksource clocksource_gpt = { | ||
207 | .name = "gp timer", | ||
208 | .rating = 300, | ||
209 | .read = clocksource_read_cycles, | ||
210 | .mask = CLOCKSOURCE_MASK(32), | ||
211 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
212 | }; | ||
213 | |||
214 | static void notrace dmtimer_update_sched_clock(void) | ||
215 | { | ||
216 | u32 cyc; | ||
217 | |||
218 | cyc = omap_dm_timer_read_counter(gpt_clocksource); | ||
219 | |||
220 | update_sched_clock(&cd, cyc, (u32)~0); | ||
221 | } | ||
222 | |||
223 | /* Setup free-running counter for clocksource */ | ||
224 | static void __init omap2_gp_clocksource_init(void) | ||
225 | { | ||
226 | static struct omap_dm_timer *gpt; | ||
227 | u32 tick_rate; | ||
228 | static char err1[] __initdata = KERN_ERR | ||
229 | "%s: failed to request dm-timer\n"; | ||
230 | static char err2[] __initdata = KERN_ERR | ||
231 | "%s: can't register clocksource!\n"; | ||
232 | |||
233 | gpt = omap_dm_timer_request(); | ||
234 | if (!gpt) | ||
235 | printk(err1, clocksource_gpt.name); | ||
236 | gpt_clocksource = gpt; | ||
237 | |||
238 | omap_dm_timer_set_source(gpt, OMAP_TIMER_SRC_SYS_CLK); | ||
239 | tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gpt)); | ||
240 | |||
241 | omap_dm_timer_set_load_start(gpt, 1, 0); | ||
242 | |||
243 | init_sched_clock(&cd, dmtimer_update_sched_clock, 32, tick_rate); | ||
244 | |||
245 | if (clocksource_register_hz(&clocksource_gpt, tick_rate)) | ||
246 | printk(err2, clocksource_gpt.name); | ||
247 | } | ||
248 | #endif | ||
249 | |||
250 | static void __init omap2_gp_timer_init(void) | ||
251 | { | ||
252 | #ifdef CONFIG_LOCAL_TIMERS | ||
253 | if (cpu_is_omap44xx()) { | ||
254 | twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_256); | ||
255 | BUG_ON(!twd_base); | ||
256 | } | ||
257 | #endif | ||
258 | omap_dm_timer_init(); | ||
259 | |||
260 | omap2_gp_clockevent_init(); | ||
261 | omap2_gp_clocksource_init(); | ||
262 | } | ||
263 | |||
264 | struct sys_timer omap_timer = { | ||
265 | .init = omap2_gp_timer_init, | ||
266 | }; | ||
diff --git a/arch/arm/mach-omap2/timer-gp.h b/arch/arm/mach-omap2/timer-gp.h deleted file mode 100644 index 5c1072c6783b..000000000000 --- a/arch/arm/mach-omap2/timer-gp.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * OMAP2/3 GPTIMER support.headers | ||
3 | * | ||
4 | * Copyright (C) 2009 Nokia Corporation | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_TIMER_GP_H | ||
12 | #define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_TIMER_GP_H | ||
13 | |||
14 | extern int __init omap2_gp_clockevent_set_gptimer(u8 id); | ||
15 | |||
16 | #endif | ||
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c new file mode 100644 index 000000000000..e9640728239b --- /dev/null +++ b/arch/arm/mach-omap2/timer.c | |||
@@ -0,0 +1,342 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-omap2/timer.c | ||
3 | * | ||
4 | * OMAP2 GP timer support. | ||
5 | * | ||
6 | * Copyright (C) 2009 Nokia Corporation | ||
7 | * | ||
8 | * Update to use new clocksource/clockevent layers | ||
9 | * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com> | ||
10 | * Copyright (C) 2007 MontaVista Software, Inc. | ||
11 | * | ||
12 | * Original driver: | ||
13 | * Copyright (C) 2005 Nokia Corporation | ||
14 | * Author: Paul Mundt <paul.mundt@nokia.com> | ||
15 | * Juha Yrjölä <juha.yrjola@nokia.com> | ||
16 | * OMAP Dual-mode timer framework support by Timo Teras | ||
17 | * | ||
18 | * Some parts based off of TI's 24xx code: | ||
19 | * | ||
20 | * Copyright (C) 2004-2009 Texas Instruments, Inc. | ||
21 | * | ||
22 | * Roughly modelled after the OMAP1 MPU timer code. | ||
23 | * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> | ||
24 | * | ||
25 | * This file is subject to the terms and conditions of the GNU General Public | ||
26 | * License. See the file "COPYING" in the main directory of this archive | ||
27 | * for more details. | ||
28 | */ | ||
29 | #include <linux/init.h> | ||
30 | #include <linux/time.h> | ||
31 | #include <linux/interrupt.h> | ||
32 | #include <linux/err.h> | ||
33 | #include <linux/clk.h> | ||
34 | #include <linux/delay.h> | ||
35 | #include <linux/irq.h> | ||
36 | #include <linux/clocksource.h> | ||
37 | #include <linux/clockchips.h> | ||
38 | |||
39 | #include <asm/mach/time.h> | ||
40 | #include <plat/dmtimer.h> | ||
41 | #include <asm/localtimer.h> | ||
42 | #include <asm/sched_clock.h> | ||
43 | #include <plat/common.h> | ||
44 | #include <plat/omap_hwmod.h> | ||
45 | |||
46 | /* Parent clocks, eventually these will come from the clock framework */ | ||
47 | |||
48 | #define OMAP2_MPU_SOURCE "sys_ck" | ||
49 | #define OMAP3_MPU_SOURCE OMAP2_MPU_SOURCE | ||
50 | #define OMAP4_MPU_SOURCE "sys_clkin_ck" | ||
51 | #define OMAP2_32K_SOURCE "func_32k_ck" | ||
52 | #define OMAP3_32K_SOURCE "omap_32k_fck" | ||
53 | #define OMAP4_32K_SOURCE "sys_32k_ck" | ||
54 | |||
55 | #ifdef CONFIG_OMAP_32K_TIMER | ||
56 | #define OMAP2_CLKEV_SOURCE OMAP2_32K_SOURCE | ||
57 | #define OMAP3_CLKEV_SOURCE OMAP3_32K_SOURCE | ||
58 | #define OMAP4_CLKEV_SOURCE OMAP4_32K_SOURCE | ||
59 | #define OMAP3_SECURE_TIMER 12 | ||
60 | #else | ||
61 | #define OMAP2_CLKEV_SOURCE OMAP2_MPU_SOURCE | ||
62 | #define OMAP3_CLKEV_SOURCE OMAP3_MPU_SOURCE | ||
63 | #define OMAP4_CLKEV_SOURCE OMAP4_MPU_SOURCE | ||
64 | #define OMAP3_SECURE_TIMER 1 | ||
65 | #endif | ||
66 | |||
67 | /* MAX_GPTIMER_ID: number of GPTIMERs on the chip */ | ||
68 | #define MAX_GPTIMER_ID 12 | ||
69 | |||
70 | u32 sys_timer_reserved; | ||
71 | |||
72 | /* Clockevent code */ | ||
73 | |||
74 | static struct omap_dm_timer clkev; | ||
75 | static struct clock_event_device clockevent_gpt; | ||
76 | |||
77 | static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id) | ||
78 | { | ||
79 | struct clock_event_device *evt = &clockevent_gpt; | ||
80 | |||
81 | __omap_dm_timer_write_status(clkev.io_base, OMAP_TIMER_INT_OVERFLOW); | ||
82 | |||
83 | evt->event_handler(evt); | ||
84 | return IRQ_HANDLED; | ||
85 | } | ||
86 | |||
87 | static struct irqaction omap2_gp_timer_irq = { | ||
88 | .name = "gp timer", | ||
89 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | ||
90 | .handler = omap2_gp_timer_interrupt, | ||
91 | }; | ||
92 | |||
93 | static int omap2_gp_timer_set_next_event(unsigned long cycles, | ||
94 | struct clock_event_device *evt) | ||
95 | { | ||
96 | __omap_dm_timer_load_start(clkev.io_base, OMAP_TIMER_CTRL_ST, | ||
97 | 0xffffffff - cycles, 1); | ||
98 | |||
99 | return 0; | ||
100 | } | ||
101 | |||
102 | static void omap2_gp_timer_set_mode(enum clock_event_mode mode, | ||
103 | struct clock_event_device *evt) | ||
104 | { | ||
105 | u32 period; | ||
106 | |||
107 | __omap_dm_timer_stop(clkev.io_base, 1, clkev.rate); | ||
108 | |||
109 | switch (mode) { | ||
110 | case CLOCK_EVT_MODE_PERIODIC: | ||
111 | period = clkev.rate / HZ; | ||
112 | period -= 1; | ||
113 | /* Looks like we need to first set the load value separately */ | ||
114 | __omap_dm_timer_write(clkev.io_base, OMAP_TIMER_LOAD_REG, | ||
115 | 0xffffffff - period, 1); | ||
116 | __omap_dm_timer_load_start(clkev.io_base, | ||
117 | OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST, | ||
118 | 0xffffffff - period, 1); | ||
119 | break; | ||
120 | case CLOCK_EVT_MODE_ONESHOT: | ||
121 | break; | ||
122 | case CLOCK_EVT_MODE_UNUSED: | ||
123 | case CLOCK_EVT_MODE_SHUTDOWN: | ||
124 | case CLOCK_EVT_MODE_RESUME: | ||
125 | break; | ||
126 | } | ||
127 | } | ||
128 | |||
129 | static struct clock_event_device clockevent_gpt = { | ||
130 | .name = "gp timer", | ||
131 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | ||
132 | .shift = 32, | ||
133 | .set_next_event = omap2_gp_timer_set_next_event, | ||
134 | .set_mode = omap2_gp_timer_set_mode, | ||
135 | }; | ||
136 | |||
137 | static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, | ||
138 | int gptimer_id, | ||
139 | const char *fck_source) | ||
140 | { | ||
141 | char name[10]; /* 10 = sizeof("gptXX_Xck0") */ | ||
142 | struct omap_hwmod *oh; | ||
143 | size_t size; | ||
144 | int res = 0; | ||
145 | |||
146 | sprintf(name, "timer%d", gptimer_id); | ||
147 | omap_hwmod_setup_one(name); | ||
148 | oh = omap_hwmod_lookup(name); | ||
149 | if (!oh) | ||
150 | return -ENODEV; | ||
151 | |||
152 | timer->irq = oh->mpu_irqs[0].irq; | ||
153 | timer->phys_base = oh->slaves[0]->addr->pa_start; | ||
154 | size = oh->slaves[0]->addr->pa_end - timer->phys_base; | ||
155 | |||
156 | /* Static mapping, never released */ | ||
157 | timer->io_base = ioremap(timer->phys_base, size); | ||
158 | if (!timer->io_base) | ||
159 | return -ENXIO; | ||
160 | |||
161 | /* After the dmtimer is using hwmod these clocks won't be needed */ | ||
162 | sprintf(name, "gpt%d_fck", gptimer_id); | ||
163 | timer->fclk = clk_get(NULL, name); | ||
164 | if (IS_ERR(timer->fclk)) | ||
165 | return -ENODEV; | ||
166 | |||
167 | sprintf(name, "gpt%d_ick", gptimer_id); | ||
168 | timer->iclk = clk_get(NULL, name); | ||
169 | if (IS_ERR(timer->iclk)) { | ||
170 | clk_put(timer->fclk); | ||
171 | return -ENODEV; | ||
172 | } | ||
173 | |||
174 | omap_hwmod_enable(oh); | ||
175 | |||
176 | sys_timer_reserved |= (1 << (gptimer_id - 1)); | ||
177 | |||
178 | if (gptimer_id != 12) { | ||
179 | struct clk *src; | ||
180 | |||
181 | src = clk_get(NULL, fck_source); | ||
182 | if (IS_ERR(src)) { | ||
183 | res = -EINVAL; | ||
184 | } else { | ||
185 | res = __omap_dm_timer_set_source(timer->fclk, src); | ||
186 | if (IS_ERR_VALUE(res)) | ||
187 | pr_warning("%s: timer%i cannot set source\n", | ||
188 | __func__, gptimer_id); | ||
189 | clk_put(src); | ||
190 | } | ||
191 | } | ||
192 | __omap_dm_timer_reset(timer->io_base, 1, 1); | ||
193 | timer->posted = 1; | ||
194 | |||
195 | timer->rate = clk_get_rate(timer->fclk); | ||
196 | |||
197 | timer->reserved = 1; | ||
198 | |||
199 | return res; | ||
200 | } | ||
201 | |||
202 | static void __init omap2_gp_clockevent_init(int gptimer_id, | ||
203 | const char *fck_source) | ||
204 | { | ||
205 | int res; | ||
206 | |||
207 | res = omap_dm_timer_init_one(&clkev, gptimer_id, fck_source); | ||
208 | BUG_ON(res); | ||
209 | |||
210 | omap2_gp_timer_irq.dev_id = (void *)&clkev; | ||
211 | setup_irq(clkev.irq, &omap2_gp_timer_irq); | ||
212 | |||
213 | __omap_dm_timer_int_enable(clkev.io_base, OMAP_TIMER_INT_OVERFLOW); | ||
214 | |||
215 | clockevent_gpt.mult = div_sc(clkev.rate, NSEC_PER_SEC, | ||
216 | clockevent_gpt.shift); | ||
217 | clockevent_gpt.max_delta_ns = | ||
218 | clockevent_delta2ns(0xffffffff, &clockevent_gpt); | ||
219 | clockevent_gpt.min_delta_ns = | ||
220 | clockevent_delta2ns(3, &clockevent_gpt); | ||
221 | /* Timer internal resynch latency. */ | ||
222 | |||
223 | clockevent_gpt.cpumask = cpumask_of(0); | ||
224 | clockevents_register_device(&clockevent_gpt); | ||
225 | |||
226 | pr_info("OMAP clockevent source: GPTIMER%d at %lu Hz\n", | ||
227 | gptimer_id, clkev.rate); | ||
228 | } | ||
229 | |||
230 | /* Clocksource code */ | ||
231 | |||
232 | #ifdef CONFIG_OMAP_32K_TIMER | ||
233 | /* | ||
234 | * When 32k-timer is enabled, don't use GPTimer for clocksource | ||
235 | * instead, just leave default clocksource which uses the 32k | ||
236 | * sync counter. See clocksource setup in plat-omap/counter_32k.c | ||
237 | */ | ||
238 | |||
239 | static void __init omap2_gp_clocksource_init(int unused, const char *dummy) | ||
240 | { | ||
241 | omap_init_clocksource_32k(); | ||
242 | } | ||
243 | |||
244 | #else | ||
245 | |||
246 | static struct omap_dm_timer clksrc; | ||
247 | |||
248 | /* | ||
249 | * clocksource | ||
250 | */ | ||
251 | static DEFINE_CLOCK_DATA(cd); | ||
252 | static cycle_t clocksource_read_cycles(struct clocksource *cs) | ||
253 | { | ||
254 | return (cycle_t)__omap_dm_timer_read_counter(clksrc.io_base, 1); | ||
255 | } | ||
256 | |||
257 | static struct clocksource clocksource_gpt = { | ||
258 | .name = "gp timer", | ||
259 | .rating = 300, | ||
260 | .read = clocksource_read_cycles, | ||
261 | .mask = CLOCKSOURCE_MASK(32), | ||
262 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
263 | }; | ||
264 | |||
265 | static void notrace dmtimer_update_sched_clock(void) | ||
266 | { | ||
267 | u32 cyc; | ||
268 | |||
269 | cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1); | ||
270 | |||
271 | update_sched_clock(&cd, cyc, (u32)~0); | ||
272 | } | ||
273 | |||
274 | unsigned long long notrace sched_clock(void) | ||
275 | { | ||
276 | u32 cyc = 0; | ||
277 | |||
278 | if (clksrc.reserved) | ||
279 | cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1); | ||
280 | |||
281 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
282 | } | ||
283 | |||
284 | /* Setup free-running counter for clocksource */ | ||
285 | static void __init omap2_gp_clocksource_init(int gptimer_id, | ||
286 | const char *fck_source) | ||
287 | { | ||
288 | int res; | ||
289 | |||
290 | res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source); | ||
291 | BUG_ON(res); | ||
292 | |||
293 | pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n", | ||
294 | gptimer_id, clksrc.rate); | ||
295 | |||
296 | __omap_dm_timer_load_start(clksrc.io_base, OMAP_TIMER_CTRL_ST, 0, 1); | ||
297 | init_sched_clock(&cd, dmtimer_update_sched_clock, 32, clksrc.rate); | ||
298 | |||
299 | if (clocksource_register_hz(&clocksource_gpt, clksrc.rate)) | ||
300 | pr_err("Could not register clocksource %s\n", | ||
301 | clocksource_gpt.name); | ||
302 | } | ||
303 | #endif | ||
304 | |||
305 | #define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src, \ | ||
306 | clksrc_nr, clksrc_src) \ | ||
307 | static void __init omap##name##_timer_init(void) \ | ||
308 | { \ | ||
309 | omap2_gp_clockevent_init((clkev_nr), clkev_src); \ | ||
310 | omap2_gp_clocksource_init((clksrc_nr), clksrc_src); \ | ||
311 | } | ||
312 | |||
313 | #define OMAP_SYS_TIMER(name) \ | ||
314 | struct sys_timer omap##name##_timer = { \ | ||
315 | .init = omap##name##_timer_init, \ | ||
316 | }; | ||
317 | |||
318 | #ifdef CONFIG_ARCH_OMAP2 | ||
319 | OMAP_SYS_TIMER_INIT(2, 1, OMAP2_CLKEV_SOURCE, 2, OMAP2_MPU_SOURCE) | ||
320 | OMAP_SYS_TIMER(2) | ||
321 | #endif | ||
322 | |||
323 | #ifdef CONFIG_ARCH_OMAP3 | ||
324 | OMAP_SYS_TIMER_INIT(3, 1, OMAP3_CLKEV_SOURCE, 2, OMAP3_MPU_SOURCE) | ||
325 | OMAP_SYS_TIMER(3) | ||
326 | OMAP_SYS_TIMER_INIT(3_secure, OMAP3_SECURE_TIMER, OMAP3_CLKEV_SOURCE, | ||
327 | 2, OMAP3_MPU_SOURCE) | ||
328 | OMAP_SYS_TIMER(3_secure) | ||
329 | #endif | ||
330 | |||
331 | #ifdef CONFIG_ARCH_OMAP4 | ||
332 | static void __init omap4_timer_init(void) | ||
333 | { | ||
334 | #ifdef CONFIG_LOCAL_TIMERS | ||
335 | twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_256); | ||
336 | BUG_ON(!twd_base); | ||
337 | #endif | ||
338 | omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE); | ||
339 | omap2_gp_clocksource_init(2, OMAP4_MPU_SOURCE); | ||
340 | } | ||
341 | OMAP_SYS_TIMER(4) | ||
342 | #endif | ||
diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c new file mode 100644 index 000000000000..3aaa46f6cd12 --- /dev/null +++ b/arch/arm/mach-omap2/twl-common.c | |||
@@ -0,0 +1,304 @@ | |||
1 | /* | ||
2 | * twl-common.c | ||
3 | * | ||
4 | * Copyright (C) 2011 Texas Instruments, Inc.. | ||
5 | * Author: Peter Ujfalusi <peter.ujfalusi@ti.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * version 2 as published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but | ||
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
14 | * General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
19 | * 02110-1301 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/i2c/twl.h> | ||
25 | #include <linux/gpio.h> | ||
26 | #include <linux/regulator/machine.h> | ||
27 | #include <linux/regulator/fixed.h> | ||
28 | |||
29 | #include <plat/i2c.h> | ||
30 | #include <plat/usb.h> | ||
31 | |||
32 | #include "twl-common.h" | ||
33 | |||
34 | static struct i2c_board_info __initdata pmic_i2c_board_info = { | ||
35 | .addr = 0x48, | ||
36 | .flags = I2C_CLIENT_WAKE, | ||
37 | }; | ||
38 | |||
39 | void __init omap_pmic_init(int bus, u32 clkrate, | ||
40 | const char *pmic_type, int pmic_irq, | ||
41 | struct twl4030_platform_data *pmic_data) | ||
42 | { | ||
43 | strncpy(pmic_i2c_board_info.type, pmic_type, | ||
44 | sizeof(pmic_i2c_board_info.type)); | ||
45 | pmic_i2c_board_info.irq = pmic_irq; | ||
46 | pmic_i2c_board_info.platform_data = pmic_data; | ||
47 | |||
48 | omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); | ||
49 | } | ||
50 | |||
51 | static struct twl4030_usb_data omap4_usb_pdata = { | ||
52 | .phy_init = omap4430_phy_init, | ||
53 | .phy_exit = omap4430_phy_exit, | ||
54 | .phy_power = omap4430_phy_power, | ||
55 | .phy_set_clock = omap4430_phy_set_clk, | ||
56 | .phy_suspend = omap4430_phy_suspend, | ||
57 | }; | ||
58 | |||
59 | static struct twl4030_usb_data omap3_usb_pdata = { | ||
60 | .usb_mode = T2_USB_MODE_ULPI, | ||
61 | }; | ||
62 | |||
63 | static int omap3_batt_table[] = { | ||
64 | /* 0 C */ | ||
65 | 30800, 29500, 28300, 27100, | ||
66 | 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900, | ||
67 | 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100, | ||
68 | 11600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310, | ||
69 | 8020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830, | ||
70 | 5640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170, | ||
71 | 4040, 3910, 3790, 3670, 3550 | ||
72 | }; | ||
73 | |||
74 | static struct twl4030_bci_platform_data omap3_bci_pdata = { | ||
75 | .battery_tmp_tbl = omap3_batt_table, | ||
76 | .tblsize = ARRAY_SIZE(omap3_batt_table), | ||
77 | }; | ||
78 | |||
79 | static struct twl4030_madc_platform_data omap3_madc_pdata = { | ||
80 | .irq_line = 1, | ||
81 | }; | ||
82 | |||
83 | static struct twl4030_codec_audio_data omap3_audio; | ||
84 | |||
85 | static struct twl4030_codec_data omap3_codec_pdata = { | ||
86 | .audio_mclk = 26000000, | ||
87 | .audio = &omap3_audio, | ||
88 | }; | ||
89 | |||
90 | static struct regulator_consumer_supply omap3_vdda_dac_supplies[] = { | ||
91 | REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"), | ||
92 | }; | ||
93 | |||
94 | static struct regulator_init_data omap3_vdac_idata = { | ||
95 | .constraints = { | ||
96 | .min_uV = 1800000, | ||
97 | .max_uV = 1800000, | ||
98 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
99 | | REGULATOR_MODE_STANDBY, | ||
100 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
101 | | REGULATOR_CHANGE_STATUS, | ||
102 | }, | ||
103 | .num_consumer_supplies = ARRAY_SIZE(omap3_vdda_dac_supplies), | ||
104 | .consumer_supplies = omap3_vdda_dac_supplies, | ||
105 | }; | ||
106 | |||
107 | static struct regulator_consumer_supply omap3_vpll2_supplies[] = { | ||
108 | REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||
109 | REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||
110 | }; | ||
111 | |||
112 | static struct regulator_init_data omap3_vpll2_idata = { | ||
113 | .constraints = { | ||
114 | .min_uV = 1800000, | ||
115 | .max_uV = 1800000, | ||
116 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
117 | | REGULATOR_MODE_STANDBY, | ||
118 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
119 | | REGULATOR_CHANGE_STATUS, | ||
120 | }, | ||
121 | .num_consumer_supplies = ARRAY_SIZE(omap3_vpll2_supplies), | ||
122 | .consumer_supplies = omap3_vpll2_supplies, | ||
123 | }; | ||
124 | |||
125 | static struct regulator_init_data omap4_vdac_idata = { | ||
126 | .constraints = { | ||
127 | .min_uV = 1800000, | ||
128 | .max_uV = 1800000, | ||
129 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
130 | | REGULATOR_MODE_STANDBY, | ||
131 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
132 | | REGULATOR_CHANGE_STATUS, | ||
133 | }, | ||
134 | }; | ||
135 | |||
136 | static struct regulator_init_data omap4_vaux2_idata = { | ||
137 | .constraints = { | ||
138 | .min_uV = 1200000, | ||
139 | .max_uV = 2800000, | ||
140 | .apply_uV = true, | ||
141 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
142 | | REGULATOR_MODE_STANDBY, | ||
143 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
144 | | REGULATOR_CHANGE_MODE | ||
145 | | REGULATOR_CHANGE_STATUS, | ||
146 | }, | ||
147 | }; | ||
148 | |||
149 | static struct regulator_init_data omap4_vaux3_idata = { | ||
150 | .constraints = { | ||
151 | .min_uV = 1000000, | ||
152 | .max_uV = 3000000, | ||
153 | .apply_uV = true, | ||
154 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
155 | | REGULATOR_MODE_STANDBY, | ||
156 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
157 | | REGULATOR_CHANGE_MODE | ||
158 | | REGULATOR_CHANGE_STATUS, | ||
159 | }, | ||
160 | }; | ||
161 | |||
162 | static struct regulator_consumer_supply omap4_vmmc_supply[] = { | ||
163 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), | ||
164 | }; | ||
165 | |||
166 | /* VMMC1 for MMC1 card */ | ||
167 | static struct regulator_init_data omap4_vmmc_idata = { | ||
168 | .constraints = { | ||
169 | .min_uV = 1200000, | ||
170 | .max_uV = 3000000, | ||
171 | .apply_uV = true, | ||
172 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
173 | | REGULATOR_MODE_STANDBY, | ||
174 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
175 | | REGULATOR_CHANGE_MODE | ||
176 | | REGULATOR_CHANGE_STATUS, | ||
177 | }, | ||
178 | .num_consumer_supplies = ARRAY_SIZE(omap4_vmmc_supply), | ||
179 | .consumer_supplies = omap4_vmmc_supply, | ||
180 | }; | ||
181 | |||
182 | static struct regulator_init_data omap4_vpp_idata = { | ||
183 | .constraints = { | ||
184 | .min_uV = 1800000, | ||
185 | .max_uV = 2500000, | ||
186 | .apply_uV = true, | ||
187 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
188 | | REGULATOR_MODE_STANDBY, | ||
189 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
190 | | REGULATOR_CHANGE_MODE | ||
191 | | REGULATOR_CHANGE_STATUS, | ||
192 | }, | ||
193 | }; | ||
194 | |||
195 | static struct regulator_init_data omap4_vana_idata = { | ||
196 | .constraints = { | ||
197 | .min_uV = 2100000, | ||
198 | .max_uV = 2100000, | ||
199 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
200 | | REGULATOR_MODE_STANDBY, | ||
201 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
202 | | REGULATOR_CHANGE_STATUS, | ||
203 | }, | ||
204 | }; | ||
205 | |||
206 | static struct regulator_init_data omap4_vcxio_idata = { | ||
207 | .constraints = { | ||
208 | .min_uV = 1800000, | ||
209 | .max_uV = 1800000, | ||
210 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
211 | | REGULATOR_MODE_STANDBY, | ||
212 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
213 | | REGULATOR_CHANGE_STATUS, | ||
214 | }, | ||
215 | }; | ||
216 | |||
217 | static struct regulator_init_data omap4_vusb_idata = { | ||
218 | .constraints = { | ||
219 | .min_uV = 3300000, | ||
220 | .max_uV = 3300000, | ||
221 | .apply_uV = true, | ||
222 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
223 | | REGULATOR_MODE_STANDBY, | ||
224 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
225 | | REGULATOR_CHANGE_STATUS, | ||
226 | }, | ||
227 | }; | ||
228 | |||
229 | static struct regulator_init_data omap4_clk32kg_idata = { | ||
230 | .constraints = { | ||
231 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
232 | }, | ||
233 | }; | ||
234 | |||
235 | void __init omap4_pmic_get_config(struct twl4030_platform_data *pmic_data, | ||
236 | u32 pdata_flags, u32 regulators_flags) | ||
237 | { | ||
238 | if (!pmic_data->irq_base) | ||
239 | pmic_data->irq_base = TWL6030_IRQ_BASE; | ||
240 | if (!pmic_data->irq_end) | ||
241 | pmic_data->irq_end = TWL6030_IRQ_END; | ||
242 | |||
243 | /* Common platform data configurations */ | ||
244 | if (pdata_flags & TWL_COMMON_PDATA_USB && !pmic_data->usb) | ||
245 | pmic_data->usb = &omap4_usb_pdata; | ||
246 | |||
247 | /* Common regulator configurations */ | ||
248 | if (regulators_flags & TWL_COMMON_REGULATOR_VDAC && !pmic_data->vdac) | ||
249 | pmic_data->vdac = &omap4_vdac_idata; | ||
250 | |||
251 | if (regulators_flags & TWL_COMMON_REGULATOR_VAUX2 && !pmic_data->vaux2) | ||
252 | pmic_data->vaux2 = &omap4_vaux2_idata; | ||
253 | |||
254 | if (regulators_flags & TWL_COMMON_REGULATOR_VAUX3 && !pmic_data->vaux3) | ||
255 | pmic_data->vaux3 = &omap4_vaux3_idata; | ||
256 | |||
257 | if (regulators_flags & TWL_COMMON_REGULATOR_VMMC && !pmic_data->vmmc) | ||
258 | pmic_data->vmmc = &omap4_vmmc_idata; | ||
259 | |||
260 | if (regulators_flags & TWL_COMMON_REGULATOR_VPP && !pmic_data->vpp) | ||
261 | pmic_data->vpp = &omap4_vpp_idata; | ||
262 | |||
263 | if (regulators_flags & TWL_COMMON_REGULATOR_VANA && !pmic_data->vana) | ||
264 | pmic_data->vana = &omap4_vana_idata; | ||
265 | |||
266 | if (regulators_flags & TWL_COMMON_REGULATOR_VCXIO && !pmic_data->vcxio) | ||
267 | pmic_data->vcxio = &omap4_vcxio_idata; | ||
268 | |||
269 | if (regulators_flags & TWL_COMMON_REGULATOR_VUSB && !pmic_data->vusb) | ||
270 | pmic_data->vusb = &omap4_vusb_idata; | ||
271 | |||
272 | if (regulators_flags & TWL_COMMON_REGULATOR_CLK32KG && | ||
273 | !pmic_data->clk32kg) | ||
274 | pmic_data->clk32kg = &omap4_clk32kg_idata; | ||
275 | } | ||
276 | |||
277 | void __init omap3_pmic_get_config(struct twl4030_platform_data *pmic_data, | ||
278 | u32 pdata_flags, u32 regulators_flags) | ||
279 | { | ||
280 | if (!pmic_data->irq_base) | ||
281 | pmic_data->irq_base = TWL4030_IRQ_BASE; | ||
282 | if (!pmic_data->irq_end) | ||
283 | pmic_data->irq_end = TWL4030_IRQ_END; | ||
284 | |||
285 | /* Common platform data configurations */ | ||
286 | if (pdata_flags & TWL_COMMON_PDATA_USB && !pmic_data->usb) | ||
287 | pmic_data->usb = &omap3_usb_pdata; | ||
288 | |||
289 | if (pdata_flags & TWL_COMMON_PDATA_BCI && !pmic_data->bci) | ||
290 | pmic_data->bci = &omap3_bci_pdata; | ||
291 | |||
292 | if (pdata_flags & TWL_COMMON_PDATA_MADC && !pmic_data->madc) | ||
293 | pmic_data->madc = &omap3_madc_pdata; | ||
294 | |||
295 | if (pdata_flags & TWL_COMMON_PDATA_AUDIO && !pmic_data->codec) | ||
296 | pmic_data->codec = &omap3_codec_pdata; | ||
297 | |||
298 | /* Common regulator configurations */ | ||
299 | if (regulators_flags & TWL_COMMON_REGULATOR_VDAC && !pmic_data->vdac) | ||
300 | pmic_data->vdac = &omap3_vdac_idata; | ||
301 | |||
302 | if (regulators_flags & TWL_COMMON_REGULATOR_VPLL2 && !pmic_data->vpll2) | ||
303 | pmic_data->vpll2 = &omap3_vpll2_idata; | ||
304 | } | ||
diff --git a/arch/arm/mach-omap2/twl-common.h b/arch/arm/mach-omap2/twl-common.h new file mode 100644 index 000000000000..5e83a5bd37fb --- /dev/null +++ b/arch/arm/mach-omap2/twl-common.h | |||
@@ -0,0 +1,59 @@ | |||
1 | #ifndef __OMAP_PMIC_COMMON__ | ||
2 | #define __OMAP_PMIC_COMMON__ | ||
3 | |||
4 | #define TWL_COMMON_PDATA_USB (1 << 0) | ||
5 | #define TWL_COMMON_PDATA_BCI (1 << 1) | ||
6 | #define TWL_COMMON_PDATA_MADC (1 << 2) | ||
7 | #define TWL_COMMON_PDATA_AUDIO (1 << 3) | ||
8 | |||
9 | /* Common LDO regulators for TWL4030/TWL6030 */ | ||
10 | #define TWL_COMMON_REGULATOR_VDAC (1 << 0) | ||
11 | #define TWL_COMMON_REGULATOR_VAUX1 (1 << 1) | ||
12 | #define TWL_COMMON_REGULATOR_VAUX2 (1 << 2) | ||
13 | #define TWL_COMMON_REGULATOR_VAUX3 (1 << 3) | ||
14 | |||
15 | /* TWL6030 LDO regulators */ | ||
16 | #define TWL_COMMON_REGULATOR_VMMC (1 << 4) | ||
17 | #define TWL_COMMON_REGULATOR_VPP (1 << 5) | ||
18 | #define TWL_COMMON_REGULATOR_VUSIM (1 << 6) | ||
19 | #define TWL_COMMON_REGULATOR_VANA (1 << 7) | ||
20 | #define TWL_COMMON_REGULATOR_VCXIO (1 << 8) | ||
21 | #define TWL_COMMON_REGULATOR_VUSB (1 << 9) | ||
22 | #define TWL_COMMON_REGULATOR_CLK32KG (1 << 10) | ||
23 | |||
24 | /* TWL4030 LDO regulators */ | ||
25 | #define TWL_COMMON_REGULATOR_VPLL1 (1 << 4) | ||
26 | #define TWL_COMMON_REGULATOR_VPLL2 (1 << 5) | ||
27 | |||
28 | |||
29 | struct twl4030_platform_data; | ||
30 | |||
31 | void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq, | ||
32 | struct twl4030_platform_data *pmic_data); | ||
33 | |||
34 | static inline void omap2_pmic_init(const char *pmic_type, | ||
35 | struct twl4030_platform_data *pmic_data) | ||
36 | { | ||
37 | omap_pmic_init(2, 2600, pmic_type, INT_24XX_SYS_NIRQ, pmic_data); | ||
38 | } | ||
39 | |||
40 | static inline void omap3_pmic_init(const char *pmic_type, | ||
41 | struct twl4030_platform_data *pmic_data) | ||
42 | { | ||
43 | omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data); | ||
44 | } | ||
45 | |||
46 | static inline void omap4_pmic_init(const char *pmic_type, | ||
47 | struct twl4030_platform_data *pmic_data) | ||
48 | { | ||
49 | /* Phoenix Audio IC needs I2C1 to start with 400 KHz or less */ | ||
50 | omap_pmic_init(1, 400, pmic_type, OMAP44XX_IRQ_SYS_1N, pmic_data); | ||
51 | } | ||
52 | |||
53 | void omap3_pmic_get_config(struct twl4030_platform_data *pmic_data, | ||
54 | u32 pdata_flags, u32 regulators_flags); | ||
55 | |||
56 | void omap4_pmic_get_config(struct twl4030_platform_data *pmic_data, | ||
57 | u32 pdata_flags, u32 regulators_flags); | ||
58 | |||
59 | #endif /* __OMAP_PMIC_COMMON__ */ | ||
diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index f7fed6080190..c13bc3d3eb2c 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c | |||
@@ -126,7 +126,7 @@ static inline unsigned long long notrace _omap_32k_sched_clock(void) | |||
126 | return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, SC_MULT, SC_SHIFT); | 126 | return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, SC_MULT, SC_SHIFT); |
127 | } | 127 | } |
128 | 128 | ||
129 | #ifndef CONFIG_OMAP_MPU_TIMER | 129 | #if defined(CONFIG_OMAP_32K_TIMER) && !defined(CONFIG_OMAP_MPU_TIMER) |
130 | unsigned long long notrace sched_clock(void) | 130 | unsigned long long notrace sched_clock(void) |
131 | { | 131 | { |
132 | return _omap_32k_sched_clock(); | 132 | return _omap_32k_sched_clock(); |
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index ee9f6ebba29b..75a847dd776a 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
@@ -41,127 +41,6 @@ | |||
41 | #include <plat/dmtimer.h> | 41 | #include <plat/dmtimer.h> |
42 | #include <mach/irqs.h> | 42 | #include <mach/irqs.h> |
43 | 43 | ||
44 | /* register offsets */ | ||
45 | #define _OMAP_TIMER_ID_OFFSET 0x00 | ||
46 | #define _OMAP_TIMER_OCP_CFG_OFFSET 0x10 | ||
47 | #define _OMAP_TIMER_SYS_STAT_OFFSET 0x14 | ||
48 | #define _OMAP_TIMER_STAT_OFFSET 0x18 | ||
49 | #define _OMAP_TIMER_INT_EN_OFFSET 0x1c | ||
50 | #define _OMAP_TIMER_WAKEUP_EN_OFFSET 0x20 | ||
51 | #define _OMAP_TIMER_CTRL_OFFSET 0x24 | ||
52 | #define OMAP_TIMER_CTRL_GPOCFG (1 << 14) | ||
53 | #define OMAP_TIMER_CTRL_CAPTMODE (1 << 13) | ||
54 | #define OMAP_TIMER_CTRL_PT (1 << 12) | ||
55 | #define OMAP_TIMER_CTRL_TCM_LOWTOHIGH (0x1 << 8) | ||
56 | #define OMAP_TIMER_CTRL_TCM_HIGHTOLOW (0x2 << 8) | ||
57 | #define OMAP_TIMER_CTRL_TCM_BOTHEDGES (0x3 << 8) | ||
58 | #define OMAP_TIMER_CTRL_SCPWM (1 << 7) | ||
59 | #define OMAP_TIMER_CTRL_CE (1 << 6) /* compare enable */ | ||
60 | #define OMAP_TIMER_CTRL_PRE (1 << 5) /* prescaler enable */ | ||
61 | #define OMAP_TIMER_CTRL_PTV_SHIFT 2 /* prescaler value shift */ | ||
62 | #define OMAP_TIMER_CTRL_POSTED (1 << 2) | ||
63 | #define OMAP_TIMER_CTRL_AR (1 << 1) /* auto-reload enable */ | ||
64 | #define OMAP_TIMER_CTRL_ST (1 << 0) /* start timer */ | ||
65 | #define _OMAP_TIMER_COUNTER_OFFSET 0x28 | ||
66 | #define _OMAP_TIMER_LOAD_OFFSET 0x2c | ||
67 | #define _OMAP_TIMER_TRIGGER_OFFSET 0x30 | ||
68 | #define _OMAP_TIMER_WRITE_PEND_OFFSET 0x34 | ||
69 | #define WP_NONE 0 /* no write pending bit */ | ||
70 | #define WP_TCLR (1 << 0) | ||
71 | #define WP_TCRR (1 << 1) | ||
72 | #define WP_TLDR (1 << 2) | ||
73 | #define WP_TTGR (1 << 3) | ||
74 | #define WP_TMAR (1 << 4) | ||
75 | #define WP_TPIR (1 << 5) | ||
76 | #define WP_TNIR (1 << 6) | ||
77 | #define WP_TCVR (1 << 7) | ||
78 | #define WP_TOCR (1 << 8) | ||
79 | #define WP_TOWR (1 << 9) | ||
80 | #define _OMAP_TIMER_MATCH_OFFSET 0x38 | ||
81 | #define _OMAP_TIMER_CAPTURE_OFFSET 0x3c | ||
82 | #define _OMAP_TIMER_IF_CTRL_OFFSET 0x40 | ||
83 | #define _OMAP_TIMER_CAPTURE2_OFFSET 0x44 /* TCAR2, 34xx only */ | ||
84 | #define _OMAP_TIMER_TICK_POS_OFFSET 0x48 /* TPIR, 34xx only */ | ||
85 | #define _OMAP_TIMER_TICK_NEG_OFFSET 0x4c /* TNIR, 34xx only */ | ||
86 | #define _OMAP_TIMER_TICK_COUNT_OFFSET 0x50 /* TCVR, 34xx only */ | ||
87 | #define _OMAP_TIMER_TICK_INT_MASK_SET_OFFSET 0x54 /* TOCR, 34xx only */ | ||
88 | #define _OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET 0x58 /* TOWR, 34xx only */ | ||
89 | |||
90 | /* register offsets with the write pending bit encoded */ | ||
91 | #define WPSHIFT 16 | ||
92 | |||
93 | #define OMAP_TIMER_ID_REG (_OMAP_TIMER_ID_OFFSET \ | ||
94 | | (WP_NONE << WPSHIFT)) | ||
95 | |||
96 | #define OMAP_TIMER_OCP_CFG_REG (_OMAP_TIMER_OCP_CFG_OFFSET \ | ||
97 | | (WP_NONE << WPSHIFT)) | ||
98 | |||
99 | #define OMAP_TIMER_SYS_STAT_REG (_OMAP_TIMER_SYS_STAT_OFFSET \ | ||
100 | | (WP_NONE << WPSHIFT)) | ||
101 | |||
102 | #define OMAP_TIMER_STAT_REG (_OMAP_TIMER_STAT_OFFSET \ | ||
103 | | (WP_NONE << WPSHIFT)) | ||
104 | |||
105 | #define OMAP_TIMER_INT_EN_REG (_OMAP_TIMER_INT_EN_OFFSET \ | ||
106 | | (WP_NONE << WPSHIFT)) | ||
107 | |||
108 | #define OMAP_TIMER_WAKEUP_EN_REG (_OMAP_TIMER_WAKEUP_EN_OFFSET \ | ||
109 | | (WP_NONE << WPSHIFT)) | ||
110 | |||
111 | #define OMAP_TIMER_CTRL_REG (_OMAP_TIMER_CTRL_OFFSET \ | ||
112 | | (WP_TCLR << WPSHIFT)) | ||
113 | |||
114 | #define OMAP_TIMER_COUNTER_REG (_OMAP_TIMER_COUNTER_OFFSET \ | ||
115 | | (WP_TCRR << WPSHIFT)) | ||
116 | |||
117 | #define OMAP_TIMER_LOAD_REG (_OMAP_TIMER_LOAD_OFFSET \ | ||
118 | | (WP_TLDR << WPSHIFT)) | ||
119 | |||
120 | #define OMAP_TIMER_TRIGGER_REG (_OMAP_TIMER_TRIGGER_OFFSET \ | ||
121 | | (WP_TTGR << WPSHIFT)) | ||
122 | |||
123 | #define OMAP_TIMER_WRITE_PEND_REG (_OMAP_TIMER_WRITE_PEND_OFFSET \ | ||
124 | | (WP_NONE << WPSHIFT)) | ||
125 | |||
126 | #define OMAP_TIMER_MATCH_REG (_OMAP_TIMER_MATCH_OFFSET \ | ||
127 | | (WP_TMAR << WPSHIFT)) | ||
128 | |||
129 | #define OMAP_TIMER_CAPTURE_REG (_OMAP_TIMER_CAPTURE_OFFSET \ | ||
130 | | (WP_NONE << WPSHIFT)) | ||
131 | |||
132 | #define OMAP_TIMER_IF_CTRL_REG (_OMAP_TIMER_IF_CTRL_OFFSET \ | ||
133 | | (WP_NONE << WPSHIFT)) | ||
134 | |||
135 | #define OMAP_TIMER_CAPTURE2_REG (_OMAP_TIMER_CAPTURE2_OFFSET \ | ||
136 | | (WP_NONE << WPSHIFT)) | ||
137 | |||
138 | #define OMAP_TIMER_TICK_POS_REG (_OMAP_TIMER_TICK_POS_OFFSET \ | ||
139 | | (WP_TPIR << WPSHIFT)) | ||
140 | |||
141 | #define OMAP_TIMER_TICK_NEG_REG (_OMAP_TIMER_TICK_NEG_OFFSET \ | ||
142 | | (WP_TNIR << WPSHIFT)) | ||
143 | |||
144 | #define OMAP_TIMER_TICK_COUNT_REG (_OMAP_TIMER_TICK_COUNT_OFFSET \ | ||
145 | | (WP_TCVR << WPSHIFT)) | ||
146 | |||
147 | #define OMAP_TIMER_TICK_INT_MASK_SET_REG \ | ||
148 | (_OMAP_TIMER_TICK_INT_MASK_SET_OFFSET | (WP_TOCR << WPSHIFT)) | ||
149 | |||
150 | #define OMAP_TIMER_TICK_INT_MASK_COUNT_REG \ | ||
151 | (_OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET | (WP_TOWR << WPSHIFT)) | ||
152 | |||
153 | struct omap_dm_timer { | ||
154 | unsigned long phys_base; | ||
155 | int irq; | ||
156 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
157 | struct clk *iclk, *fclk; | ||
158 | #endif | ||
159 | void __iomem *io_base; | ||
160 | unsigned reserved:1; | ||
161 | unsigned enabled:1; | ||
162 | unsigned posted:1; | ||
163 | }; | ||
164 | |||
165 | static int dm_timer_count; | 44 | static int dm_timer_count; |
166 | 45 | ||
167 | #ifdef CONFIG_ARCH_OMAP1 | 46 | #ifdef CONFIG_ARCH_OMAP1 |
@@ -291,11 +170,7 @@ static spinlock_t dm_timer_lock; | |||
291 | */ | 170 | */ |
292 | static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg) | 171 | static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg) |
293 | { | 172 | { |
294 | if (timer->posted) | 173 | return __omap_dm_timer_read(timer->io_base, reg, timer->posted); |
295 | while (readl(timer->io_base + (OMAP_TIMER_WRITE_PEND_REG & 0xff)) | ||
296 | & (reg >> WPSHIFT)) | ||
297 | cpu_relax(); | ||
298 | return readl(timer->io_base + (reg & 0xff)); | ||
299 | } | 174 | } |
300 | 175 | ||
301 | /* | 176 | /* |
@@ -307,11 +182,7 @@ static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg) | |||
307 | static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg, | 182 | static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg, |
308 | u32 value) | 183 | u32 value) |
309 | { | 184 | { |
310 | if (timer->posted) | 185 | __omap_dm_timer_write(timer->io_base, reg, value, timer->posted); |
311 | while (readl(timer->io_base + (OMAP_TIMER_WRITE_PEND_REG & 0xff)) | ||
312 | & (reg >> WPSHIFT)) | ||
313 | cpu_relax(); | ||
314 | writel(value, timer->io_base + (reg & 0xff)); | ||
315 | } | 186 | } |
316 | 187 | ||
317 | static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer) | 188 | static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer) |
@@ -330,7 +201,7 @@ static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer) | |||
330 | 201 | ||
331 | static void omap_dm_timer_reset(struct omap_dm_timer *timer) | 202 | static void omap_dm_timer_reset(struct omap_dm_timer *timer) |
332 | { | 203 | { |
333 | u32 l; | 204 | int autoidle = 0, wakeup = 0; |
334 | 205 | ||
335 | if (!cpu_class_is_omap2() || timer != &dm_timers[0]) { | 206 | if (!cpu_class_is_omap2() || timer != &dm_timers[0]) { |
336 | omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); | 207 | omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); |
@@ -338,28 +209,21 @@ static void omap_dm_timer_reset(struct omap_dm_timer *timer) | |||
338 | } | 209 | } |
339 | omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); | 210 | omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); |
340 | 211 | ||
341 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_OCP_CFG_REG); | 212 | /* Enable autoidle on OMAP2+ */ |
342 | l |= 0x02 << 3; /* Set to smart-idle mode */ | 213 | if (cpu_class_is_omap2()) |
343 | l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */ | 214 | autoidle = 1; |
344 | |||
345 | /* Enable autoidle on OMAP2 / OMAP3 */ | ||
346 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | ||
347 | l |= 0x1 << 0; | ||
348 | 215 | ||
349 | /* | 216 | /* |
350 | * Enable wake-up on OMAP2 CPUs. | 217 | * Enable wake-up on OMAP2 CPUs. |
351 | */ | 218 | */ |
352 | if (cpu_class_is_omap2()) | 219 | if (cpu_class_is_omap2()) |
353 | l |= 1 << 2; | 220 | wakeup = 1; |
354 | omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_REG, l); | ||
355 | 221 | ||
356 | /* Match hardware reset default of posted mode */ | 222 | __omap_dm_timer_reset(timer->io_base, autoidle, wakeup); |
357 | omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, | ||
358 | OMAP_TIMER_CTRL_POSTED); | ||
359 | timer->posted = 1; | 223 | timer->posted = 1; |
360 | } | 224 | } |
361 | 225 | ||
362 | static void omap_dm_timer_prepare(struct omap_dm_timer *timer) | 226 | void omap_dm_timer_prepare(struct omap_dm_timer *timer) |
363 | { | 227 | { |
364 | omap_dm_timer_enable(timer); | 228 | omap_dm_timer_enable(timer); |
365 | omap_dm_timer_reset(timer); | 229 | omap_dm_timer_reset(timer); |
@@ -531,25 +395,13 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_start); | |||
531 | 395 | ||
532 | void omap_dm_timer_stop(struct omap_dm_timer *timer) | 396 | void omap_dm_timer_stop(struct omap_dm_timer *timer) |
533 | { | 397 | { |
534 | u32 l; | 398 | unsigned long rate = 0; |
535 | 399 | ||
536 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); | ||
537 | if (l & OMAP_TIMER_CTRL_ST) { | ||
538 | l &= ~0x1; | ||
539 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); | ||
540 | #ifdef CONFIG_ARCH_OMAP2PLUS | 400 | #ifdef CONFIG_ARCH_OMAP2PLUS |
541 | /* Readback to make sure write has completed */ | 401 | rate = clk_get_rate(timer->fclk); |
542 | omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); | ||
543 | /* | ||
544 | * Wait for functional clock period x 3.5 to make sure that | ||
545 | * timer is stopped | ||
546 | */ | ||
547 | udelay(3500000 / clk_get_rate(timer->fclk) + 1); | ||
548 | #endif | 402 | #endif |
549 | } | 403 | |
550 | /* Ack possibly pending interrupt */ | 404 | __omap_dm_timer_stop(timer->io_base, timer->posted, rate); |
551 | omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, | ||
552 | OMAP_TIMER_INT_OVERFLOW); | ||
553 | } | 405 | } |
554 | EXPORT_SYMBOL_GPL(omap_dm_timer_stop); | 406 | EXPORT_SYMBOL_GPL(omap_dm_timer_stop); |
555 | 407 | ||
@@ -572,22 +424,11 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); | |||
572 | 424 | ||
573 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) | 425 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) |
574 | { | 426 | { |
575 | int ret = -EINVAL; | ||
576 | |||
577 | if (source < 0 || source >= 3) | 427 | if (source < 0 || source >= 3) |
578 | return -EINVAL; | 428 | return -EINVAL; |
579 | 429 | ||
580 | clk_disable(timer->fclk); | 430 | return __omap_dm_timer_set_source(timer->fclk, |
581 | ret = clk_set_parent(timer->fclk, dm_source_clocks[source]); | 431 | dm_source_clocks[source]); |
582 | clk_enable(timer->fclk); | ||
583 | |||
584 | /* | ||
585 | * When the functional clock disappears, too quick writes seem | ||
586 | * to cause an abort. XXX Is this still necessary? | ||
587 | */ | ||
588 | __delay(300000); | ||
589 | |||
590 | return ret; | ||
591 | } | 432 | } |
592 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); | 433 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); |
593 | 434 | ||
@@ -625,8 +466,7 @@ void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, | |||
625 | } | 466 | } |
626 | l |= OMAP_TIMER_CTRL_ST; | 467 | l |= OMAP_TIMER_CTRL_ST; |
627 | 468 | ||
628 | omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, load); | 469 | __omap_dm_timer_load_start(timer->io_base, l, load, timer->posted); |
629 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); | ||
630 | } | 470 | } |
631 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_load_start); | 471 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_load_start); |
632 | 472 | ||
@@ -679,8 +519,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_set_prescaler); | |||
679 | void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, | 519 | void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, |
680 | unsigned int value) | 520 | unsigned int value) |
681 | { | 521 | { |
682 | omap_dm_timer_write_reg(timer, OMAP_TIMER_INT_EN_REG, value); | 522 | __omap_dm_timer_int_enable(timer->io_base, value); |
683 | omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, value); | ||
684 | } | 523 | } |
685 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable); | 524 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable); |
686 | 525 | ||
@@ -696,17 +535,13 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_read_status); | |||
696 | 535 | ||
697 | void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) | 536 | void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) |
698 | { | 537 | { |
699 | omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, value); | 538 | __omap_dm_timer_write_status(timer->io_base, value); |
700 | } | 539 | } |
701 | EXPORT_SYMBOL_GPL(omap_dm_timer_write_status); | 540 | EXPORT_SYMBOL_GPL(omap_dm_timer_write_status); |
702 | 541 | ||
703 | unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) | 542 | unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) |
704 | { | 543 | { |
705 | unsigned int l; | 544 | return __omap_dm_timer_read_counter(timer->io_base, timer->posted); |
706 | |||
707 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_COUNTER_REG); | ||
708 | |||
709 | return l; | ||
710 | } | 545 | } |
711 | EXPORT_SYMBOL_GPL(omap_dm_timer_read_counter); | 546 | EXPORT_SYMBOL_GPL(omap_dm_timer_read_counter); |
712 | 547 | ||
@@ -737,7 +572,7 @@ int omap_dm_timers_active(void) | |||
737 | } | 572 | } |
738 | EXPORT_SYMBOL_GPL(omap_dm_timers_active); | 573 | EXPORT_SYMBOL_GPL(omap_dm_timers_active); |
739 | 574 | ||
740 | int __init omap_dm_timer_init(void) | 575 | static int __init omap_dm_timer_init(void) |
741 | { | 576 | { |
742 | struct omap_dm_timer *timer; | 577 | struct omap_dm_timer *timer; |
743 | int i, map_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */ | 578 | int i, map_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */ |
@@ -790,8 +625,16 @@ int __init omap_dm_timer_init(void) | |||
790 | sprintf(clk_name, "gpt%d_fck", i + 1); | 625 | sprintf(clk_name, "gpt%d_fck", i + 1); |
791 | timer->fclk = clk_get(NULL, clk_name); | 626 | timer->fclk = clk_get(NULL, clk_name); |
792 | } | 627 | } |
628 | |||
629 | /* One or two timers may be set up early for sys_timer */ | ||
630 | if (sys_timer_reserved & (1 << i)) { | ||
631 | timer->reserved = 1; | ||
632 | timer->posted = 1; | ||
633 | } | ||
793 | #endif | 634 | #endif |
794 | } | 635 | } |
795 | 636 | ||
796 | return 0; | 637 | return 0; |
797 | } | 638 | } |
639 | |||
640 | arch_initcall(omap_dm_timer_init); | ||
diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h index 5288130be96e..4564cc697d7f 100644 --- a/arch/arm/plat-omap/include/plat/common.h +++ b/arch/arm/plat-omap/include/plat/common.h | |||
@@ -34,7 +34,11 @@ | |||
34 | struct sys_timer; | 34 | struct sys_timer; |
35 | 35 | ||
36 | extern void omap_map_common_io(void); | 36 | extern void omap_map_common_io(void); |
37 | extern struct sys_timer omap_timer; | 37 | extern struct sys_timer omap1_timer; |
38 | extern struct sys_timer omap2_timer; | ||
39 | extern struct sys_timer omap3_timer; | ||
40 | extern struct sys_timer omap3_secure_timer; | ||
41 | extern struct sys_timer omap4_timer; | ||
38 | extern bool omap_32k_timer_init(void); | 42 | extern bool omap_32k_timer_init(void); |
39 | extern int __init omap_init_clocksource_32k(void); | 43 | extern int __init omap_init_clocksource_32k(void); |
40 | extern unsigned long long notrace omap_32k_sched_clock(void); | 44 | extern unsigned long long notrace omap_32k_sched_clock(void); |
diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h index d6c70d2f4030..d0f3a2d22fd3 100644 --- a/arch/arm/plat-omap/include/plat/dmtimer.h +++ b/arch/arm/plat-omap/include/plat/dmtimer.h | |||
@@ -32,6 +32,9 @@ | |||
32 | * 675 Mass Ave, Cambridge, MA 02139, USA. | 32 | * 675 Mass Ave, Cambridge, MA 02139, USA. |
33 | */ | 33 | */ |
34 | 34 | ||
35 | #include <linux/clk.h> | ||
36 | #include <linux/delay.h> | ||
37 | |||
35 | #ifndef __ASM_ARCH_DMTIMER_H | 38 | #ifndef __ASM_ARCH_DMTIMER_H |
36 | #define __ASM_ARCH_DMTIMER_H | 39 | #define __ASM_ARCH_DMTIMER_H |
37 | 40 | ||
@@ -56,12 +59,8 @@ | |||
56 | */ | 59 | */ |
57 | #define OMAP_TIMER_IP_VERSION_1 0x1 | 60 | #define OMAP_TIMER_IP_VERSION_1 0x1 |
58 | struct omap_dm_timer; | 61 | struct omap_dm_timer; |
59 | extern struct omap_dm_timer *gptimer_wakeup; | ||
60 | extern struct sys_timer omap_timer; | ||
61 | struct clk; | 62 | struct clk; |
62 | 63 | ||
63 | int omap_dm_timer_init(void); | ||
64 | |||
65 | struct omap_dm_timer *omap_dm_timer_request(void); | 64 | struct omap_dm_timer *omap_dm_timer_request(void); |
66 | struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id); | 65 | struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id); |
67 | void omap_dm_timer_free(struct omap_dm_timer *timer); | 66 | void omap_dm_timer_free(struct omap_dm_timer *timer); |
@@ -93,5 +92,248 @@ void omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value | |||
93 | 92 | ||
94 | int omap_dm_timers_active(void); | 93 | int omap_dm_timers_active(void); |
95 | 94 | ||
95 | /* | ||
96 | * Do not use the defines below, they are not needed. They should be only | ||
97 | * used by dmtimer.c and sys_timer related code. | ||
98 | */ | ||
99 | |||
100 | /* register offsets */ | ||
101 | #define _OMAP_TIMER_ID_OFFSET 0x00 | ||
102 | #define _OMAP_TIMER_OCP_CFG_OFFSET 0x10 | ||
103 | #define _OMAP_TIMER_SYS_STAT_OFFSET 0x14 | ||
104 | #define _OMAP_TIMER_STAT_OFFSET 0x18 | ||
105 | #define _OMAP_TIMER_INT_EN_OFFSET 0x1c | ||
106 | #define _OMAP_TIMER_WAKEUP_EN_OFFSET 0x20 | ||
107 | #define _OMAP_TIMER_CTRL_OFFSET 0x24 | ||
108 | #define OMAP_TIMER_CTRL_GPOCFG (1 << 14) | ||
109 | #define OMAP_TIMER_CTRL_CAPTMODE (1 << 13) | ||
110 | #define OMAP_TIMER_CTRL_PT (1 << 12) | ||
111 | #define OMAP_TIMER_CTRL_TCM_LOWTOHIGH (0x1 << 8) | ||
112 | #define OMAP_TIMER_CTRL_TCM_HIGHTOLOW (0x2 << 8) | ||
113 | #define OMAP_TIMER_CTRL_TCM_BOTHEDGES (0x3 << 8) | ||
114 | #define OMAP_TIMER_CTRL_SCPWM (1 << 7) | ||
115 | #define OMAP_TIMER_CTRL_CE (1 << 6) /* compare enable */ | ||
116 | #define OMAP_TIMER_CTRL_PRE (1 << 5) /* prescaler enable */ | ||
117 | #define OMAP_TIMER_CTRL_PTV_SHIFT 2 /* prescaler value shift */ | ||
118 | #define OMAP_TIMER_CTRL_POSTED (1 << 2) | ||
119 | #define OMAP_TIMER_CTRL_AR (1 << 1) /* auto-reload enable */ | ||
120 | #define OMAP_TIMER_CTRL_ST (1 << 0) /* start timer */ | ||
121 | #define _OMAP_TIMER_COUNTER_OFFSET 0x28 | ||
122 | #define _OMAP_TIMER_LOAD_OFFSET 0x2c | ||
123 | #define _OMAP_TIMER_TRIGGER_OFFSET 0x30 | ||
124 | #define _OMAP_TIMER_WRITE_PEND_OFFSET 0x34 | ||
125 | #define WP_NONE 0 /* no write pending bit */ | ||
126 | #define WP_TCLR (1 << 0) | ||
127 | #define WP_TCRR (1 << 1) | ||
128 | #define WP_TLDR (1 << 2) | ||
129 | #define WP_TTGR (1 << 3) | ||
130 | #define WP_TMAR (1 << 4) | ||
131 | #define WP_TPIR (1 << 5) | ||
132 | #define WP_TNIR (1 << 6) | ||
133 | #define WP_TCVR (1 << 7) | ||
134 | #define WP_TOCR (1 << 8) | ||
135 | #define WP_TOWR (1 << 9) | ||
136 | #define _OMAP_TIMER_MATCH_OFFSET 0x38 | ||
137 | #define _OMAP_TIMER_CAPTURE_OFFSET 0x3c | ||
138 | #define _OMAP_TIMER_IF_CTRL_OFFSET 0x40 | ||
139 | #define _OMAP_TIMER_CAPTURE2_OFFSET 0x44 /* TCAR2, 34xx only */ | ||
140 | #define _OMAP_TIMER_TICK_POS_OFFSET 0x48 /* TPIR, 34xx only */ | ||
141 | #define _OMAP_TIMER_TICK_NEG_OFFSET 0x4c /* TNIR, 34xx only */ | ||
142 | #define _OMAP_TIMER_TICK_COUNT_OFFSET 0x50 /* TCVR, 34xx only */ | ||
143 | #define _OMAP_TIMER_TICK_INT_MASK_SET_OFFSET 0x54 /* TOCR, 34xx only */ | ||
144 | #define _OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET 0x58 /* TOWR, 34xx only */ | ||
145 | |||
146 | /* register offsets with the write pending bit encoded */ | ||
147 | #define WPSHIFT 16 | ||
148 | |||
149 | #define OMAP_TIMER_ID_REG (_OMAP_TIMER_ID_OFFSET \ | ||
150 | | (WP_NONE << WPSHIFT)) | ||
151 | |||
152 | #define OMAP_TIMER_OCP_CFG_REG (_OMAP_TIMER_OCP_CFG_OFFSET \ | ||
153 | | (WP_NONE << WPSHIFT)) | ||
154 | |||
155 | #define OMAP_TIMER_SYS_STAT_REG (_OMAP_TIMER_SYS_STAT_OFFSET \ | ||
156 | | (WP_NONE << WPSHIFT)) | ||
157 | |||
158 | #define OMAP_TIMER_STAT_REG (_OMAP_TIMER_STAT_OFFSET \ | ||
159 | | (WP_NONE << WPSHIFT)) | ||
160 | |||
161 | #define OMAP_TIMER_INT_EN_REG (_OMAP_TIMER_INT_EN_OFFSET \ | ||
162 | | (WP_NONE << WPSHIFT)) | ||
163 | |||
164 | #define OMAP_TIMER_WAKEUP_EN_REG (_OMAP_TIMER_WAKEUP_EN_OFFSET \ | ||
165 | | (WP_NONE << WPSHIFT)) | ||
166 | |||
167 | #define OMAP_TIMER_CTRL_REG (_OMAP_TIMER_CTRL_OFFSET \ | ||
168 | | (WP_TCLR << WPSHIFT)) | ||
169 | |||
170 | #define OMAP_TIMER_COUNTER_REG (_OMAP_TIMER_COUNTER_OFFSET \ | ||
171 | | (WP_TCRR << WPSHIFT)) | ||
172 | |||
173 | #define OMAP_TIMER_LOAD_REG (_OMAP_TIMER_LOAD_OFFSET \ | ||
174 | | (WP_TLDR << WPSHIFT)) | ||
175 | |||
176 | #define OMAP_TIMER_TRIGGER_REG (_OMAP_TIMER_TRIGGER_OFFSET \ | ||
177 | | (WP_TTGR << WPSHIFT)) | ||
178 | |||
179 | #define OMAP_TIMER_WRITE_PEND_REG (_OMAP_TIMER_WRITE_PEND_OFFSET \ | ||
180 | | (WP_NONE << WPSHIFT)) | ||
181 | |||
182 | #define OMAP_TIMER_MATCH_REG (_OMAP_TIMER_MATCH_OFFSET \ | ||
183 | | (WP_TMAR << WPSHIFT)) | ||
184 | |||
185 | #define OMAP_TIMER_CAPTURE_REG (_OMAP_TIMER_CAPTURE_OFFSET \ | ||
186 | | (WP_NONE << WPSHIFT)) | ||
187 | |||
188 | #define OMAP_TIMER_IF_CTRL_REG (_OMAP_TIMER_IF_CTRL_OFFSET \ | ||
189 | | (WP_NONE << WPSHIFT)) | ||
190 | |||
191 | #define OMAP_TIMER_CAPTURE2_REG (_OMAP_TIMER_CAPTURE2_OFFSET \ | ||
192 | | (WP_NONE << WPSHIFT)) | ||
193 | |||
194 | #define OMAP_TIMER_TICK_POS_REG (_OMAP_TIMER_TICK_POS_OFFSET \ | ||
195 | | (WP_TPIR << WPSHIFT)) | ||
196 | |||
197 | #define OMAP_TIMER_TICK_NEG_REG (_OMAP_TIMER_TICK_NEG_OFFSET \ | ||
198 | | (WP_TNIR << WPSHIFT)) | ||
199 | |||
200 | #define OMAP_TIMER_TICK_COUNT_REG (_OMAP_TIMER_TICK_COUNT_OFFSET \ | ||
201 | | (WP_TCVR << WPSHIFT)) | ||
202 | |||
203 | #define OMAP_TIMER_TICK_INT_MASK_SET_REG \ | ||
204 | (_OMAP_TIMER_TICK_INT_MASK_SET_OFFSET | (WP_TOCR << WPSHIFT)) | ||
205 | |||
206 | #define OMAP_TIMER_TICK_INT_MASK_COUNT_REG \ | ||
207 | (_OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET | (WP_TOWR << WPSHIFT)) | ||
208 | |||
209 | struct omap_dm_timer { | ||
210 | unsigned long phys_base; | ||
211 | int irq; | ||
212 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
213 | struct clk *iclk, *fclk; | ||
214 | #endif | ||
215 | void __iomem *io_base; | ||
216 | unsigned long rate; | ||
217 | unsigned reserved:1; | ||
218 | unsigned enabled:1; | ||
219 | unsigned posted:1; | ||
220 | }; | ||
221 | |||
222 | extern u32 sys_timer_reserved; | ||
223 | void omap_dm_timer_prepare(struct omap_dm_timer *timer); | ||
224 | |||
225 | static inline u32 __omap_dm_timer_read(void __iomem *base, u32 reg, | ||
226 | int posted) | ||
227 | { | ||
228 | if (posted) | ||
229 | while (__raw_readl(base + (OMAP_TIMER_WRITE_PEND_REG & 0xff)) | ||
230 | & (reg >> WPSHIFT)) | ||
231 | cpu_relax(); | ||
232 | |||
233 | return __raw_readl(base + (reg & 0xff)); | ||
234 | } | ||
235 | |||
236 | static inline void __omap_dm_timer_write(void __iomem *base, u32 reg, u32 val, | ||
237 | int posted) | ||
238 | { | ||
239 | if (posted) | ||
240 | while (__raw_readl(base + (OMAP_TIMER_WRITE_PEND_REG & 0xff)) | ||
241 | & (reg >> WPSHIFT)) | ||
242 | cpu_relax(); | ||
243 | |||
244 | __raw_writel(val, base + (reg & 0xff)); | ||
245 | } | ||
246 | |||
247 | /* Assumes the source clock has been set by caller */ | ||
248 | static inline void __omap_dm_timer_reset(void __iomem *base, int autoidle, | ||
249 | int wakeup) | ||
250 | { | ||
251 | u32 l; | ||
252 | |||
253 | l = __omap_dm_timer_read(base, OMAP_TIMER_OCP_CFG_REG, 0); | ||
254 | l |= 0x02 << 3; /* Set to smart-idle mode */ | ||
255 | l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */ | ||
256 | |||
257 | if (autoidle) | ||
258 | l |= 0x1 << 0; | ||
259 | |||
260 | if (wakeup) | ||
261 | l |= 1 << 2; | ||
262 | |||
263 | __omap_dm_timer_write(base, OMAP_TIMER_OCP_CFG_REG, l, 0); | ||
264 | |||
265 | /* Match hardware reset default of posted mode */ | ||
266 | __omap_dm_timer_write(base, OMAP_TIMER_IF_CTRL_REG, | ||
267 | OMAP_TIMER_CTRL_POSTED, 0); | ||
268 | } | ||
269 | |||
270 | static inline int __omap_dm_timer_set_source(struct clk *timer_fck, | ||
271 | struct clk *parent) | ||
272 | { | ||
273 | int ret; | ||
274 | |||
275 | clk_disable(timer_fck); | ||
276 | ret = clk_set_parent(timer_fck, parent); | ||
277 | clk_enable(timer_fck); | ||
278 | |||
279 | /* | ||
280 | * When the functional clock disappears, too quick writes seem | ||
281 | * to cause an abort. XXX Is this still necessary? | ||
282 | */ | ||
283 | __delay(300000); | ||
284 | |||
285 | return ret; | ||
286 | } | ||
287 | |||
288 | static inline void __omap_dm_timer_stop(void __iomem *base, int posted, | ||
289 | unsigned long rate) | ||
290 | { | ||
291 | u32 l; | ||
292 | |||
293 | l = __omap_dm_timer_read(base, OMAP_TIMER_CTRL_REG, posted); | ||
294 | if (l & OMAP_TIMER_CTRL_ST) { | ||
295 | l &= ~0x1; | ||
296 | __omap_dm_timer_write(base, OMAP_TIMER_CTRL_REG, l, posted); | ||
297 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
298 | /* Readback to make sure write has completed */ | ||
299 | __omap_dm_timer_read(base, OMAP_TIMER_CTRL_REG, posted); | ||
300 | /* | ||
301 | * Wait for functional clock period x 3.5 to make sure that | ||
302 | * timer is stopped | ||
303 | */ | ||
304 | udelay(3500000 / rate + 1); | ||
305 | #endif | ||
306 | } | ||
307 | |||
308 | /* Ack possibly pending interrupt */ | ||
309 | __omap_dm_timer_write(base, OMAP_TIMER_STAT_REG, | ||
310 | OMAP_TIMER_INT_OVERFLOW, 0); | ||
311 | } | ||
312 | |||
313 | static inline void __omap_dm_timer_load_start(void __iomem *base, u32 ctrl, | ||
314 | unsigned int load, int posted) | ||
315 | { | ||
316 | __omap_dm_timer_write(base, OMAP_TIMER_COUNTER_REG, load, posted); | ||
317 | __omap_dm_timer_write(base, OMAP_TIMER_CTRL_REG, ctrl, posted); | ||
318 | } | ||
319 | |||
320 | static inline void __omap_dm_timer_int_enable(void __iomem *base, | ||
321 | unsigned int value) | ||
322 | { | ||
323 | __omap_dm_timer_write(base, OMAP_TIMER_INT_EN_REG, value, 0); | ||
324 | __omap_dm_timer_write(base, OMAP_TIMER_WAKEUP_EN_REG, value, 0); | ||
325 | } | ||
326 | |||
327 | static inline unsigned int __omap_dm_timer_read_counter(void __iomem *base, | ||
328 | int posted) | ||
329 | { | ||
330 | return __omap_dm_timer_read(base, OMAP_TIMER_COUNTER_REG, posted); | ||
331 | } | ||
332 | |||
333 | static inline void __omap_dm_timer_write_status(void __iomem *base, | ||
334 | unsigned int value) | ||
335 | { | ||
336 | __omap_dm_timer_write(base, OMAP_TIMER_STAT_REG, value, 0); | ||
337 | } | ||
96 | 338 | ||
97 | #endif /* __ASM_ARCH_DMTIMER_H */ | 339 | #endif /* __ASM_ARCH_DMTIMER_H */ |
diff --git a/arch/arm/plat-omap/include/plat/irqs.h b/arch/arm/plat-omap/include/plat/irqs.h index 5a25098ea7ea..c88432005665 100644 --- a/arch/arm/plat-omap/include/plat/irqs.h +++ b/arch/arm/plat-omap/include/plat/irqs.h | |||
@@ -428,7 +428,11 @@ | |||
428 | #define INTCPS_NR_IRQS 96 | 428 | #define INTCPS_NR_IRQS 96 |
429 | 429 | ||
430 | #ifndef __ASSEMBLY__ | 430 | #ifndef __ASSEMBLY__ |
431 | extern void omap_init_irq(void); | 431 | extern void __iomem *omap_irq_base; |
432 | void omap1_init_irq(void); | ||
433 | void omap2_init_irq(void); | ||
434 | void omap3_init_irq(void); | ||
435 | void ti816x_init_irq(void); | ||
432 | extern int omap_irq_pending(void); | 436 | extern int omap_irq_pending(void); |
433 | void omap_intc_save_context(void); | 437 | void omap_intc_save_context(void); |
434 | void omap_intc_restore_context(void); | 438 | void omap_intc_restore_context(void); |
diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h index f8f690ab2997..9882c657b2d4 100644 --- a/arch/arm/plat-omap/include/plat/mcbsp.h +++ b/arch/arm/plat-omap/include/plat/mcbsp.h | |||
@@ -24,7 +24,6 @@ | |||
24 | #ifndef __ASM_ARCH_OMAP_MCBSP_H | 24 | #ifndef __ASM_ARCH_OMAP_MCBSP_H |
25 | #define __ASM_ARCH_OMAP_MCBSP_H | 25 | #define __ASM_ARCH_OMAP_MCBSP_H |
26 | 26 | ||
27 | #include <linux/completion.h> | ||
28 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
29 | 28 | ||
30 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
@@ -34,7 +33,7 @@ | |||
34 | #define OMAP_MCBSP_PLATFORM_DEVICE(port_nr) \ | 33 | #define OMAP_MCBSP_PLATFORM_DEVICE(port_nr) \ |
35 | static struct platform_device omap_mcbsp##port_nr = { \ | 34 | static struct platform_device omap_mcbsp##port_nr = { \ |
36 | .name = "omap-mcbsp-dai", \ | 35 | .name = "omap-mcbsp-dai", \ |
37 | .id = OMAP_MCBSP##port_nr, \ | 36 | .id = port_nr - 1, \ |
38 | } | 37 | } |
39 | 38 | ||
40 | #define MCBSP_CONFIG_TYPE2 0x2 | 39 | #define MCBSP_CONFIG_TYPE2 0x2 |
@@ -333,18 +332,6 @@ struct omap_mcbsp_reg_cfg { | |||
333 | }; | 332 | }; |
334 | 333 | ||
335 | typedef enum { | 334 | typedef enum { |
336 | OMAP_MCBSP1 = 0, | ||
337 | OMAP_MCBSP2, | ||
338 | OMAP_MCBSP3, | ||
339 | OMAP_MCBSP4, | ||
340 | OMAP_MCBSP5 | ||
341 | } omap_mcbsp_id; | ||
342 | |||
343 | typedef int __bitwise omap_mcbsp_io_type_t; | ||
344 | #define OMAP_MCBSP_IRQ_IO ((__force omap_mcbsp_io_type_t) 1) | ||
345 | #define OMAP_MCBSP_POLL_IO ((__force omap_mcbsp_io_type_t) 2) | ||
346 | |||
347 | typedef enum { | ||
348 | OMAP_MCBSP_WORD_8 = 0, | 335 | OMAP_MCBSP_WORD_8 = 0, |
349 | OMAP_MCBSP_WORD_12, | 336 | OMAP_MCBSP_WORD_12, |
350 | OMAP_MCBSP_WORD_16, | 337 | OMAP_MCBSP_WORD_16, |
@@ -353,38 +340,6 @@ typedef enum { | |||
353 | OMAP_MCBSP_WORD_32, | 340 | OMAP_MCBSP_WORD_32, |
354 | } omap_mcbsp_word_length; | 341 | } omap_mcbsp_word_length; |
355 | 342 | ||
356 | typedef enum { | ||
357 | OMAP_MCBSP_CLK_RISING = 0, | ||
358 | OMAP_MCBSP_CLK_FALLING, | ||
359 | } omap_mcbsp_clk_polarity; | ||
360 | |||
361 | typedef enum { | ||
362 | OMAP_MCBSP_FS_ACTIVE_HIGH = 0, | ||
363 | OMAP_MCBSP_FS_ACTIVE_LOW, | ||
364 | } omap_mcbsp_fs_polarity; | ||
365 | |||
366 | typedef enum { | ||
367 | OMAP_MCBSP_CLK_STP_MODE_NO_DELAY = 0, | ||
368 | OMAP_MCBSP_CLK_STP_MODE_DELAY, | ||
369 | } omap_mcbsp_clk_stp_mode; | ||
370 | |||
371 | |||
372 | /******* SPI specific mode **********/ | ||
373 | typedef enum { | ||
374 | OMAP_MCBSP_SPI_MASTER = 0, | ||
375 | OMAP_MCBSP_SPI_SLAVE, | ||
376 | } omap_mcbsp_spi_mode; | ||
377 | |||
378 | struct omap_mcbsp_spi_cfg { | ||
379 | omap_mcbsp_spi_mode spi_mode; | ||
380 | omap_mcbsp_clk_polarity rx_clock_polarity; | ||
381 | omap_mcbsp_clk_polarity tx_clock_polarity; | ||
382 | omap_mcbsp_fs_polarity fsx_polarity; | ||
383 | u8 clk_div; | ||
384 | omap_mcbsp_clk_stp_mode clk_stp_mode; | ||
385 | omap_mcbsp_word_length word_length; | ||
386 | }; | ||
387 | |||
388 | /* Platform specific configuration */ | 343 | /* Platform specific configuration */ |
389 | struct omap_mcbsp_ops { | 344 | struct omap_mcbsp_ops { |
390 | void (*request)(unsigned int); | 345 | void (*request)(unsigned int); |
@@ -422,25 +377,13 @@ struct omap_mcbsp { | |||
422 | void __iomem *io_base; | 377 | void __iomem *io_base; |
423 | u8 id; | 378 | u8 id; |
424 | u8 free; | 379 | u8 free; |
425 | omap_mcbsp_word_length rx_word_length; | ||
426 | omap_mcbsp_word_length tx_word_length; | ||
427 | 380 | ||
428 | omap_mcbsp_io_type_t io_type; /* IRQ or poll */ | ||
429 | /* IRQ based TX/RX */ | ||
430 | int rx_irq; | 381 | int rx_irq; |
431 | int tx_irq; | 382 | int tx_irq; |
432 | 383 | ||
433 | /* DMA stuff */ | 384 | /* DMA stuff */ |
434 | u8 dma_rx_sync; | 385 | u8 dma_rx_sync; |
435 | short dma_rx_lch; | ||
436 | u8 dma_tx_sync; | 386 | u8 dma_tx_sync; |
437 | short dma_tx_lch; | ||
438 | |||
439 | /* Completion queues */ | ||
440 | struct completion tx_irq_completion; | ||
441 | struct completion rx_irq_completion; | ||
442 | struct completion tx_dma_completion; | ||
443 | struct completion rx_dma_completion; | ||
444 | 387 | ||
445 | /* Protect the field .free, while checking if the mcbsp is in use */ | 388 | /* Protect the field .free, while checking if the mcbsp is in use */ |
446 | spinlock_t lock; | 389 | spinlock_t lock; |
@@ -499,24 +442,9 @@ int omap_mcbsp_request(unsigned int id); | |||
499 | void omap_mcbsp_free(unsigned int id); | 442 | void omap_mcbsp_free(unsigned int id); |
500 | void omap_mcbsp_start(unsigned int id, int tx, int rx); | 443 | void omap_mcbsp_start(unsigned int id, int tx, int rx); |
501 | void omap_mcbsp_stop(unsigned int id, int tx, int rx); | 444 | void omap_mcbsp_stop(unsigned int id, int tx, int rx); |
502 | void omap_mcbsp_xmit_word(unsigned int id, u32 word); | ||
503 | u32 omap_mcbsp_recv_word(unsigned int id); | ||
504 | |||
505 | int omap_mcbsp_xmit_buffer(unsigned int id, dma_addr_t buffer, unsigned int length); | ||
506 | int omap_mcbsp_recv_buffer(unsigned int id, dma_addr_t buffer, unsigned int length); | ||
507 | int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word); | ||
508 | int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 * word); | ||
509 | |||
510 | 445 | ||
511 | /* McBSP functional clock source changing function */ | 446 | /* McBSP functional clock source changing function */ |
512 | extern int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id); | 447 | extern int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id); |
513 | /* SPI specific API */ | ||
514 | void omap_mcbsp_set_spi_mode(unsigned int id, const struct omap_mcbsp_spi_cfg * spi_cfg); | ||
515 | |||
516 | /* Polled read/write functions */ | ||
517 | int omap_mcbsp_pollread(unsigned int id, u16 * buf); | ||
518 | int omap_mcbsp_pollwrite(unsigned int id, u16 buf); | ||
519 | int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type); | ||
520 | 448 | ||
521 | /* McBSP signal muxing API */ | 449 | /* McBSP signal muxing API */ |
522 | void omap2_mcbsp1_mux_clkr_src(u8 mux); | 450 | void omap2_mcbsp1_mux_clkr_src(u8 mux); |
diff --git a/arch/arm/plat-omap/include/plat/nand.h b/arch/arm/plat-omap/include/plat/nand.h index d86d1ecf0068..67fc5060183e 100644 --- a/arch/arm/plat-omap/include/plat/nand.h +++ b/arch/arm/plat-omap/include/plat/nand.h | |||
@@ -19,15 +19,11 @@ enum nand_io { | |||
19 | }; | 19 | }; |
20 | 20 | ||
21 | struct omap_nand_platform_data { | 21 | struct omap_nand_platform_data { |
22 | unsigned int options; | ||
23 | int cs; | 22 | int cs; |
24 | int gpio_irq; | ||
25 | struct mtd_partition *parts; | 23 | struct mtd_partition *parts; |
26 | struct gpmc_timings *gpmc_t; | 24 | struct gpmc_timings *gpmc_t; |
27 | int nr_parts; | 25 | int nr_parts; |
28 | int (*nand_setup)(void); | 26 | bool dev_ready; |
29 | int (*dev_ready)(struct omap_nand_platform_data *); | ||
30 | int dma_channel; | ||
31 | int gpmc_irq; | 27 | int gpmc_irq; |
32 | enum nand_io xfer_type; | 28 | enum nand_io xfer_type; |
33 | unsigned long phys_base; | 29 | unsigned long phys_base; |
diff --git a/arch/arm/plat-omap/include/plat/omap4-keypad.h b/arch/arm/plat-omap/include/plat/omap4-keypad.h index 2b1d9bc1eebb..9fe6c8783236 100644 --- a/arch/arm/plat-omap/include/plat/omap4-keypad.h +++ b/arch/arm/plat-omap/include/plat/omap4-keypad.h | |||
@@ -10,5 +10,6 @@ struct omap4_keypad_platform_data { | |||
10 | u8 cols; | 10 | u8 cols; |
11 | }; | 11 | }; |
12 | 12 | ||
13 | extern int omap4_keyboard_init(struct omap4_keypad_platform_data *); | 13 | extern int omap4_keyboard_init(struct omap4_keypad_platform_data *, |
14 | struct omap_board_data *); | ||
14 | #endif | 15 | #endif |
diff --git a/arch/arm/plat-omap/include/plat/uncompress.h b/arch/arm/plat-omap/include/plat/uncompress.h index ac4b60d9aa29..a067484cc4a2 100644 --- a/arch/arm/plat-omap/include/plat/uncompress.h +++ b/arch/arm/plat-omap/include/plat/uncompress.h | |||
@@ -148,6 +148,7 @@ static inline void __arch_decomp_setup(unsigned long arch_id) | |||
148 | /* omap3 based boards using UART3 */ | 148 | /* omap3 based boards using UART3 */ |
149 | DEBUG_LL_OMAP3(3, cm_t35); | 149 | DEBUG_LL_OMAP3(3, cm_t35); |
150 | DEBUG_LL_OMAP3(3, cm_t3517); | 150 | DEBUG_LL_OMAP3(3, cm_t3517); |
151 | DEBUG_LL_OMAP3(3, cm_t3730); | ||
151 | DEBUG_LL_OMAP3(3, craneboard); | 152 | DEBUG_LL_OMAP3(3, craneboard); |
152 | DEBUG_LL_OMAP3(3, devkit8000); | 153 | DEBUG_LL_OMAP3(3, devkit8000); |
153 | DEBUG_LL_OMAP3(3, igep0020); | 154 | DEBUG_LL_OMAP3(3, igep0020); |
diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c index 83a37c54342f..c60737c49a32 100644 --- a/arch/arm/plat-omap/iovmm.c +++ b/arch/arm/plat-omap/iovmm.c | |||
@@ -72,7 +72,7 @@ static size_t sgtable_len(const struct sg_table *sgt) | |||
72 | for_each_sg(sgt->sgl, sg, sgt->nents, i) { | 72 | for_each_sg(sgt->sgl, sg, sgt->nents, i) { |
73 | size_t bytes; | 73 | size_t bytes; |
74 | 74 | ||
75 | bytes = sg_dma_len(sg); | 75 | bytes = sg->length; |
76 | 76 | ||
77 | if (!iopgsz_ok(bytes)) { | 77 | if (!iopgsz_ok(bytes)) { |
78 | pr_err("%s: sg[%d] not iommu pagesize(%x)\n", | 78 | pr_err("%s: sg[%d] not iommu pagesize(%x)\n", |
@@ -198,7 +198,7 @@ static void *vmap_sg(const struct sg_table *sgt) | |||
198 | int err; | 198 | int err; |
199 | 199 | ||
200 | pa = sg_phys(sg); | 200 | pa = sg_phys(sg); |
201 | bytes = sg_dma_len(sg); | 201 | bytes = sg->length; |
202 | 202 | ||
203 | BUG_ON(bytes != PAGE_SIZE); | 203 | BUG_ON(bytes != PAGE_SIZE); |
204 | 204 | ||
@@ -476,7 +476,7 @@ static int map_iovm_area(struct iommu *obj, struct iovm_struct *new, | |||
476 | struct iotlb_entry e; | 476 | struct iotlb_entry e; |
477 | 477 | ||
478 | pa = sg_phys(sg); | 478 | pa = sg_phys(sg); |
479 | bytes = sg_dma_len(sg); | 479 | bytes = sg->length; |
480 | 480 | ||
481 | flags &= ~IOVMF_PGSZ_MASK; | 481 | flags &= ~IOVMF_PGSZ_MASK; |
482 | pgsz = bytes_to_iopgsz(bytes); | 482 | pgsz = bytes_to_iopgsz(bytes); |
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index 5587acf0eb2c..3c1fbdc92468 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c | |||
@@ -16,8 +16,6 @@ | |||
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/device.h> | 17 | #include <linux/device.h> |
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | #include <linux/wait.h> | ||
20 | #include <linux/completion.h> | ||
21 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
22 | #include <linux/err.h> | 20 | #include <linux/err.h> |
23 | #include <linux/clk.h> | 21 | #include <linux/clk.h> |
@@ -25,7 +23,6 @@ | |||
25 | #include <linux/io.h> | 23 | #include <linux/io.h> |
26 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
27 | 25 | ||
28 | #include <plat/dma.h> | ||
29 | #include <plat/mcbsp.h> | 26 | #include <plat/mcbsp.h> |
30 | #include <plat/omap_device.h> | 27 | #include <plat/omap_device.h> |
31 | #include <linux/pm_runtime.h> | 28 | #include <linux/pm_runtime.h> |
@@ -136,8 +133,6 @@ static irqreturn_t omap_mcbsp_tx_irq_handler(int irq, void *dev_id) | |||
136 | irqst_spcr2); | 133 | irqst_spcr2); |
137 | /* Writing zero to XSYNC_ERR clears the IRQ */ | 134 | /* Writing zero to XSYNC_ERR clears the IRQ */ |
138 | MCBSP_WRITE(mcbsp_tx, SPCR2, MCBSP_READ_CACHE(mcbsp_tx, SPCR2)); | 135 | MCBSP_WRITE(mcbsp_tx, SPCR2, MCBSP_READ_CACHE(mcbsp_tx, SPCR2)); |
139 | } else { | ||
140 | complete(&mcbsp_tx->tx_irq_completion); | ||
141 | } | 136 | } |
142 | 137 | ||
143 | return IRQ_HANDLED; | 138 | return IRQ_HANDLED; |
@@ -156,41 +151,11 @@ static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id) | |||
156 | irqst_spcr1); | 151 | irqst_spcr1); |
157 | /* Writing zero to RSYNC_ERR clears the IRQ */ | 152 | /* Writing zero to RSYNC_ERR clears the IRQ */ |
158 | MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1)); | 153 | MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1)); |
159 | } else { | ||
160 | complete(&mcbsp_rx->rx_irq_completion); | ||
161 | } | 154 | } |
162 | 155 | ||
163 | return IRQ_HANDLED; | 156 | return IRQ_HANDLED; |
164 | } | 157 | } |
165 | 158 | ||
166 | static void omap_mcbsp_tx_dma_callback(int lch, u16 ch_status, void *data) | ||
167 | { | ||
168 | struct omap_mcbsp *mcbsp_dma_tx = data; | ||
169 | |||
170 | dev_dbg(mcbsp_dma_tx->dev, "TX DMA callback : 0x%x\n", | ||
171 | MCBSP_READ(mcbsp_dma_tx, SPCR2)); | ||
172 | |||
173 | /* We can free the channels */ | ||
174 | omap_free_dma(mcbsp_dma_tx->dma_tx_lch); | ||
175 | mcbsp_dma_tx->dma_tx_lch = -1; | ||
176 | |||
177 | complete(&mcbsp_dma_tx->tx_dma_completion); | ||
178 | } | ||
179 | |||
180 | static void omap_mcbsp_rx_dma_callback(int lch, u16 ch_status, void *data) | ||
181 | { | ||
182 | struct omap_mcbsp *mcbsp_dma_rx = data; | ||
183 | |||
184 | dev_dbg(mcbsp_dma_rx->dev, "RX DMA callback : 0x%x\n", | ||
185 | MCBSP_READ(mcbsp_dma_rx, SPCR2)); | ||
186 | |||
187 | /* We can free the channels */ | ||
188 | omap_free_dma(mcbsp_dma_rx->dma_rx_lch); | ||
189 | mcbsp_dma_rx->dma_rx_lch = -1; | ||
190 | |||
191 | complete(&mcbsp_dma_rx->rx_dma_completion); | ||
192 | } | ||
193 | |||
194 | /* | 159 | /* |
195 | * omap_mcbsp_config simply write a config to the | 160 | * omap_mcbsp_config simply write a config to the |
196 | * appropriate McBSP. | 161 | * appropriate McBSP. |
@@ -758,37 +723,6 @@ static inline void omap_st_start(struct omap_mcbsp *mcbsp) {} | |||
758 | static inline void omap_st_stop(struct omap_mcbsp *mcbsp) {} | 723 | static inline void omap_st_stop(struct omap_mcbsp *mcbsp) {} |
759 | #endif | 724 | #endif |
760 | 725 | ||
761 | /* | ||
762 | * We can choose between IRQ based or polled IO. | ||
763 | * This needs to be called before omap_mcbsp_request(). | ||
764 | */ | ||
765 | int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type) | ||
766 | { | ||
767 | struct omap_mcbsp *mcbsp; | ||
768 | |||
769 | if (!omap_mcbsp_check_valid_id(id)) { | ||
770 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
771 | return -ENODEV; | ||
772 | } | ||
773 | mcbsp = id_to_mcbsp_ptr(id); | ||
774 | |||
775 | spin_lock(&mcbsp->lock); | ||
776 | |||
777 | if (!mcbsp->free) { | ||
778 | dev_err(mcbsp->dev, "McBSP%d is currently in use\n", | ||
779 | mcbsp->id); | ||
780 | spin_unlock(&mcbsp->lock); | ||
781 | return -EINVAL; | ||
782 | } | ||
783 | |||
784 | mcbsp->io_type = io_type; | ||
785 | |||
786 | spin_unlock(&mcbsp->lock); | ||
787 | |||
788 | return 0; | ||
789 | } | ||
790 | EXPORT_SYMBOL(omap_mcbsp_set_io_type); | ||
791 | |||
792 | int omap_mcbsp_request(unsigned int id) | 726 | int omap_mcbsp_request(unsigned int id) |
793 | { | 727 | { |
794 | struct omap_mcbsp *mcbsp; | 728 | struct omap_mcbsp *mcbsp; |
@@ -833,29 +767,24 @@ int omap_mcbsp_request(unsigned int id) | |||
833 | MCBSP_WRITE(mcbsp, SPCR1, 0); | 767 | MCBSP_WRITE(mcbsp, SPCR1, 0); |
834 | MCBSP_WRITE(mcbsp, SPCR2, 0); | 768 | MCBSP_WRITE(mcbsp, SPCR2, 0); |
835 | 769 | ||
836 | if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) { | 770 | err = request_irq(mcbsp->tx_irq, omap_mcbsp_tx_irq_handler, |
837 | /* We need to get IRQs here */ | 771 | 0, "McBSP", (void *)mcbsp); |
838 | init_completion(&mcbsp->tx_irq_completion); | 772 | if (err != 0) { |
839 | err = request_irq(mcbsp->tx_irq, omap_mcbsp_tx_irq_handler, | 773 | dev_err(mcbsp->dev, "Unable to request TX IRQ %d " |
840 | 0, "McBSP", (void *)mcbsp); | 774 | "for McBSP%d\n", mcbsp->tx_irq, |
775 | mcbsp->id); | ||
776 | goto err_clk_disable; | ||
777 | } | ||
778 | |||
779 | if (mcbsp->rx_irq) { | ||
780 | err = request_irq(mcbsp->rx_irq, | ||
781 | omap_mcbsp_rx_irq_handler, | ||
782 | 0, "McBSP", (void *)mcbsp); | ||
841 | if (err != 0) { | 783 | if (err != 0) { |
842 | dev_err(mcbsp->dev, "Unable to request TX IRQ %d " | 784 | dev_err(mcbsp->dev, "Unable to request RX IRQ %d " |
843 | "for McBSP%d\n", mcbsp->tx_irq, | 785 | "for McBSP%d\n", mcbsp->rx_irq, |
844 | mcbsp->id); | 786 | mcbsp->id); |
845 | goto err_clk_disable; | 787 | goto err_free_irq; |
846 | } | ||
847 | |||
848 | if (mcbsp->rx_irq) { | ||
849 | init_completion(&mcbsp->rx_irq_completion); | ||
850 | err = request_irq(mcbsp->rx_irq, | ||
851 | omap_mcbsp_rx_irq_handler, | ||
852 | 0, "McBSP", (void *)mcbsp); | ||
853 | if (err != 0) { | ||
854 | dev_err(mcbsp->dev, "Unable to request RX IRQ %d " | ||
855 | "for McBSP%d\n", mcbsp->rx_irq, | ||
856 | mcbsp->id); | ||
857 | goto err_free_irq; | ||
858 | } | ||
859 | } | 788 | } |
860 | } | 789 | } |
861 | 790 | ||
@@ -901,12 +830,9 @@ void omap_mcbsp_free(unsigned int id) | |||
901 | 830 | ||
902 | pm_runtime_put_sync(mcbsp->dev); | 831 | pm_runtime_put_sync(mcbsp->dev); |
903 | 832 | ||
904 | if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) { | 833 | if (mcbsp->rx_irq) |
905 | /* Free IRQs */ | 834 | free_irq(mcbsp->rx_irq, (void *)mcbsp); |
906 | if (mcbsp->rx_irq) | 835 | free_irq(mcbsp->tx_irq, (void *)mcbsp); |
907 | free_irq(mcbsp->rx_irq, (void *)mcbsp); | ||
908 | free_irq(mcbsp->tx_irq, (void *)mcbsp); | ||
909 | } | ||
910 | 836 | ||
911 | reg_cache = mcbsp->reg_cache; | 837 | reg_cache = mcbsp->reg_cache; |
912 | 838 | ||
@@ -943,9 +869,6 @@ void omap_mcbsp_start(unsigned int id, int tx, int rx) | |||
943 | if (cpu_is_omap34xx()) | 869 | if (cpu_is_omap34xx()) |
944 | omap_st_start(mcbsp); | 870 | omap_st_start(mcbsp); |
945 | 871 | ||
946 | mcbsp->rx_word_length = (MCBSP_READ_CACHE(mcbsp, RCR1) >> 5) & 0x7; | ||
947 | mcbsp->tx_word_length = (MCBSP_READ_CACHE(mcbsp, XCR1) >> 5) & 0x7; | ||
948 | |||
949 | /* Only enable SRG, if McBSP is master */ | 872 | /* Only enable SRG, if McBSP is master */ |
950 | w = MCBSP_READ_CACHE(mcbsp, PCR0); | 873 | w = MCBSP_READ_CACHE(mcbsp, PCR0); |
951 | if (w & (FSXM | FSRM | CLKXM | CLKRM)) | 874 | if (w & (FSXM | FSRM | CLKXM | CLKRM)) |
@@ -1043,485 +966,6 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx) | |||
1043 | } | 966 | } |
1044 | EXPORT_SYMBOL(omap_mcbsp_stop); | 967 | EXPORT_SYMBOL(omap_mcbsp_stop); |
1045 | 968 | ||
1046 | /* polled mcbsp i/o operations */ | ||
1047 | int omap_mcbsp_pollwrite(unsigned int id, u16 buf) | ||
1048 | { | ||
1049 | struct omap_mcbsp *mcbsp; | ||
1050 | |||
1051 | if (!omap_mcbsp_check_valid_id(id)) { | ||
1052 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
1053 | return -ENODEV; | ||
1054 | } | ||
1055 | |||
1056 | mcbsp = id_to_mcbsp_ptr(id); | ||
1057 | |||
1058 | MCBSP_WRITE(mcbsp, DXR1, buf); | ||
1059 | /* if frame sync error - clear the error */ | ||
1060 | if (MCBSP_READ(mcbsp, SPCR2) & XSYNC_ERR) { | ||
1061 | /* clear error */ | ||
1062 | MCBSP_WRITE(mcbsp, SPCR2, MCBSP_READ_CACHE(mcbsp, SPCR2)); | ||
1063 | /* resend */ | ||
1064 | return -1; | ||
1065 | } else { | ||
1066 | /* wait for transmit confirmation */ | ||
1067 | int attemps = 0; | ||
1068 | while (!(MCBSP_READ(mcbsp, SPCR2) & XRDY)) { | ||
1069 | if (attemps++ > 1000) { | ||
1070 | MCBSP_WRITE(mcbsp, SPCR2, | ||
1071 | MCBSP_READ_CACHE(mcbsp, SPCR2) & | ||
1072 | (~XRST)); | ||
1073 | udelay(10); | ||
1074 | MCBSP_WRITE(mcbsp, SPCR2, | ||
1075 | MCBSP_READ_CACHE(mcbsp, SPCR2) | | ||
1076 | (XRST)); | ||
1077 | udelay(10); | ||
1078 | dev_err(mcbsp->dev, "Could not write to" | ||
1079 | " McBSP%d Register\n", mcbsp->id); | ||
1080 | return -2; | ||
1081 | } | ||
1082 | } | ||
1083 | } | ||
1084 | |||
1085 | return 0; | ||
1086 | } | ||
1087 | EXPORT_SYMBOL(omap_mcbsp_pollwrite); | ||
1088 | |||
1089 | int omap_mcbsp_pollread(unsigned int id, u16 *buf) | ||
1090 | { | ||
1091 | struct omap_mcbsp *mcbsp; | ||
1092 | |||
1093 | if (!omap_mcbsp_check_valid_id(id)) { | ||
1094 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
1095 | return -ENODEV; | ||
1096 | } | ||
1097 | mcbsp = id_to_mcbsp_ptr(id); | ||
1098 | |||
1099 | /* if frame sync error - clear the error */ | ||
1100 | if (MCBSP_READ(mcbsp, SPCR1) & RSYNC_ERR) { | ||
1101 | /* clear error */ | ||
1102 | MCBSP_WRITE(mcbsp, SPCR1, MCBSP_READ_CACHE(mcbsp, SPCR1)); | ||
1103 | /* resend */ | ||
1104 | return -1; | ||
1105 | } else { | ||
1106 | /* wait for receive confirmation */ | ||
1107 | int attemps = 0; | ||
1108 | while (!(MCBSP_READ(mcbsp, SPCR1) & RRDY)) { | ||
1109 | if (attemps++ > 1000) { | ||
1110 | MCBSP_WRITE(mcbsp, SPCR1, | ||
1111 | MCBSP_READ_CACHE(mcbsp, SPCR1) & | ||
1112 | (~RRST)); | ||
1113 | udelay(10); | ||
1114 | MCBSP_WRITE(mcbsp, SPCR1, | ||
1115 | MCBSP_READ_CACHE(mcbsp, SPCR1) | | ||
1116 | (RRST)); | ||
1117 | udelay(10); | ||
1118 | dev_err(mcbsp->dev, "Could not read from" | ||
1119 | " McBSP%d Register\n", mcbsp->id); | ||
1120 | return -2; | ||
1121 | } | ||
1122 | } | ||
1123 | } | ||
1124 | *buf = MCBSP_READ(mcbsp, DRR1); | ||
1125 | |||
1126 | return 0; | ||
1127 | } | ||
1128 | EXPORT_SYMBOL(omap_mcbsp_pollread); | ||
1129 | |||
1130 | /* | ||
1131 | * IRQ based word transmission. | ||
1132 | */ | ||
1133 | void omap_mcbsp_xmit_word(unsigned int id, u32 word) | ||
1134 | { | ||
1135 | struct omap_mcbsp *mcbsp; | ||
1136 | omap_mcbsp_word_length word_length; | ||
1137 | |||
1138 | if (!omap_mcbsp_check_valid_id(id)) { | ||
1139 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
1140 | return; | ||
1141 | } | ||
1142 | |||
1143 | mcbsp = id_to_mcbsp_ptr(id); | ||
1144 | word_length = mcbsp->tx_word_length; | ||
1145 | |||
1146 | wait_for_completion(&mcbsp->tx_irq_completion); | ||
1147 | |||
1148 | if (word_length > OMAP_MCBSP_WORD_16) | ||
1149 | MCBSP_WRITE(mcbsp, DXR2, word >> 16); | ||
1150 | MCBSP_WRITE(mcbsp, DXR1, word & 0xffff); | ||
1151 | } | ||
1152 | EXPORT_SYMBOL(omap_mcbsp_xmit_word); | ||
1153 | |||
1154 | u32 omap_mcbsp_recv_word(unsigned int id) | ||
1155 | { | ||
1156 | struct omap_mcbsp *mcbsp; | ||
1157 | u16 word_lsb, word_msb = 0; | ||
1158 | omap_mcbsp_word_length word_length; | ||
1159 | |||
1160 | if (!omap_mcbsp_check_valid_id(id)) { | ||
1161 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
1162 | return -ENODEV; | ||
1163 | } | ||
1164 | mcbsp = id_to_mcbsp_ptr(id); | ||
1165 | |||
1166 | word_length = mcbsp->rx_word_length; | ||
1167 | |||
1168 | wait_for_completion(&mcbsp->rx_irq_completion); | ||
1169 | |||
1170 | if (word_length > OMAP_MCBSP_WORD_16) | ||
1171 | word_msb = MCBSP_READ(mcbsp, DRR2); | ||
1172 | word_lsb = MCBSP_READ(mcbsp, DRR1); | ||
1173 | |||
1174 | return (word_lsb | (word_msb << 16)); | ||
1175 | } | ||
1176 | EXPORT_SYMBOL(omap_mcbsp_recv_word); | ||
1177 | |||
1178 | int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word) | ||
1179 | { | ||
1180 | struct omap_mcbsp *mcbsp; | ||
1181 | omap_mcbsp_word_length tx_word_length; | ||
1182 | omap_mcbsp_word_length rx_word_length; | ||
1183 | u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0; | ||
1184 | |||
1185 | if (!omap_mcbsp_check_valid_id(id)) { | ||
1186 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
1187 | return -ENODEV; | ||
1188 | } | ||
1189 | mcbsp = id_to_mcbsp_ptr(id); | ||
1190 | tx_word_length = mcbsp->tx_word_length; | ||
1191 | rx_word_length = mcbsp->rx_word_length; | ||
1192 | |||
1193 | if (tx_word_length != rx_word_length) | ||
1194 | return -EINVAL; | ||
1195 | |||
1196 | /* First we wait for the transmitter to be ready */ | ||
1197 | spcr2 = MCBSP_READ(mcbsp, SPCR2); | ||
1198 | while (!(spcr2 & XRDY)) { | ||
1199 | spcr2 = MCBSP_READ(mcbsp, SPCR2); | ||
1200 | if (attempts++ > 1000) { | ||
1201 | /* We must reset the transmitter */ | ||
1202 | MCBSP_WRITE(mcbsp, SPCR2, | ||
1203 | MCBSP_READ_CACHE(mcbsp, SPCR2) & (~XRST)); | ||
1204 | udelay(10); | ||
1205 | MCBSP_WRITE(mcbsp, SPCR2, | ||
1206 | MCBSP_READ_CACHE(mcbsp, SPCR2) | XRST); | ||
1207 | udelay(10); | ||
1208 | dev_err(mcbsp->dev, "McBSP%d transmitter not " | ||
1209 | "ready\n", mcbsp->id); | ||
1210 | return -EAGAIN; | ||
1211 | } | ||
1212 | } | ||
1213 | |||
1214 | /* Now we can push the data */ | ||
1215 | if (tx_word_length > OMAP_MCBSP_WORD_16) | ||
1216 | MCBSP_WRITE(mcbsp, DXR2, word >> 16); | ||
1217 | MCBSP_WRITE(mcbsp, DXR1, word & 0xffff); | ||
1218 | |||
1219 | /* We wait for the receiver to be ready */ | ||
1220 | spcr1 = MCBSP_READ(mcbsp, SPCR1); | ||
1221 | while (!(spcr1 & RRDY)) { | ||
1222 | spcr1 = MCBSP_READ(mcbsp, SPCR1); | ||
1223 | if (attempts++ > 1000) { | ||
1224 | /* We must reset the receiver */ | ||
1225 | MCBSP_WRITE(mcbsp, SPCR1, | ||
1226 | MCBSP_READ_CACHE(mcbsp, SPCR1) & (~RRST)); | ||
1227 | udelay(10); | ||
1228 | MCBSP_WRITE(mcbsp, SPCR1, | ||
1229 | MCBSP_READ_CACHE(mcbsp, SPCR1) | RRST); | ||
1230 | udelay(10); | ||
1231 | dev_err(mcbsp->dev, "McBSP%d receiver not " | ||
1232 | "ready\n", mcbsp->id); | ||
1233 | return -EAGAIN; | ||
1234 | } | ||
1235 | } | ||
1236 | |||
1237 | /* Receiver is ready, let's read the dummy data */ | ||
1238 | if (rx_word_length > OMAP_MCBSP_WORD_16) | ||
1239 | word_msb = MCBSP_READ(mcbsp, DRR2); | ||
1240 | word_lsb = MCBSP_READ(mcbsp, DRR1); | ||
1241 | |||
1242 | return 0; | ||
1243 | } | ||
1244 | EXPORT_SYMBOL(omap_mcbsp_spi_master_xmit_word_poll); | ||
1245 | |||
1246 | int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 *word) | ||
1247 | { | ||
1248 | struct omap_mcbsp *mcbsp; | ||
1249 | u32 clock_word = 0; | ||
1250 | omap_mcbsp_word_length tx_word_length; | ||
1251 | omap_mcbsp_word_length rx_word_length; | ||
1252 | u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0; | ||
1253 | |||
1254 | if (!omap_mcbsp_check_valid_id(id)) { | ||
1255 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
1256 | return -ENODEV; | ||
1257 | } | ||
1258 | |||
1259 | mcbsp = id_to_mcbsp_ptr(id); | ||
1260 | |||
1261 | tx_word_length = mcbsp->tx_word_length; | ||
1262 | rx_word_length = mcbsp->rx_word_length; | ||
1263 | |||
1264 | if (tx_word_length != rx_word_length) | ||
1265 | return -EINVAL; | ||
1266 | |||
1267 | /* First we wait for the transmitter to be ready */ | ||
1268 | spcr2 = MCBSP_READ(mcbsp, SPCR2); | ||
1269 | while (!(spcr2 & XRDY)) { | ||
1270 | spcr2 = MCBSP_READ(mcbsp, SPCR2); | ||
1271 | if (attempts++ > 1000) { | ||
1272 | /* We must reset the transmitter */ | ||
1273 | MCBSP_WRITE(mcbsp, SPCR2, | ||
1274 | MCBSP_READ_CACHE(mcbsp, SPCR2) & (~XRST)); | ||
1275 | udelay(10); | ||
1276 | MCBSP_WRITE(mcbsp, SPCR2, | ||
1277 | MCBSP_READ_CACHE(mcbsp, SPCR2) | XRST); | ||
1278 | udelay(10); | ||
1279 | dev_err(mcbsp->dev, "McBSP%d transmitter not " | ||
1280 | "ready\n", mcbsp->id); | ||
1281 | return -EAGAIN; | ||
1282 | } | ||
1283 | } | ||
1284 | |||
1285 | /* We first need to enable the bus clock */ | ||
1286 | if (tx_word_length > OMAP_MCBSP_WORD_16) | ||
1287 | MCBSP_WRITE(mcbsp, DXR2, clock_word >> 16); | ||
1288 | MCBSP_WRITE(mcbsp, DXR1, clock_word & 0xffff); | ||
1289 | |||
1290 | /* We wait for the receiver to be ready */ | ||
1291 | spcr1 = MCBSP_READ(mcbsp, SPCR1); | ||
1292 | while (!(spcr1 & RRDY)) { | ||
1293 | spcr1 = MCBSP_READ(mcbsp, SPCR1); | ||
1294 | if (attempts++ > 1000) { | ||
1295 | /* We must reset the receiver */ | ||
1296 | MCBSP_WRITE(mcbsp, SPCR1, | ||
1297 | MCBSP_READ_CACHE(mcbsp, SPCR1) & (~RRST)); | ||
1298 | udelay(10); | ||
1299 | MCBSP_WRITE(mcbsp, SPCR1, | ||
1300 | MCBSP_READ_CACHE(mcbsp, SPCR1) | RRST); | ||
1301 | udelay(10); | ||
1302 | dev_err(mcbsp->dev, "McBSP%d receiver not " | ||
1303 | "ready\n", mcbsp->id); | ||
1304 | return -EAGAIN; | ||
1305 | } | ||
1306 | } | ||
1307 | |||
1308 | /* Receiver is ready, there is something for us */ | ||
1309 | if (rx_word_length > OMAP_MCBSP_WORD_16) | ||
1310 | word_msb = MCBSP_READ(mcbsp, DRR2); | ||
1311 | word_lsb = MCBSP_READ(mcbsp, DRR1); | ||
1312 | |||
1313 | word[0] = (word_lsb | (word_msb << 16)); | ||
1314 | |||
1315 | return 0; | ||
1316 | } | ||
1317 | EXPORT_SYMBOL(omap_mcbsp_spi_master_recv_word_poll); | ||
1318 | |||
1319 | /* | ||
1320 | * Simple DMA based buffer rx/tx routines. | ||
1321 | * Nothing fancy, just a single buffer tx/rx through DMA. | ||
1322 | * The DMA resources are released once the transfer is done. | ||
1323 | * For anything fancier, you should use your own customized DMA | ||
1324 | * routines and callbacks. | ||
1325 | */ | ||
1326 | int omap_mcbsp_xmit_buffer(unsigned int id, dma_addr_t buffer, | ||
1327 | unsigned int length) | ||
1328 | { | ||
1329 | struct omap_mcbsp *mcbsp; | ||
1330 | int dma_tx_ch; | ||
1331 | int src_port = 0; | ||
1332 | int dest_port = 0; | ||
1333 | int sync_dev = 0; | ||
1334 | |||
1335 | if (!omap_mcbsp_check_valid_id(id)) { | ||
1336 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
1337 | return -ENODEV; | ||
1338 | } | ||
1339 | mcbsp = id_to_mcbsp_ptr(id); | ||
1340 | |||
1341 | if (omap_request_dma(mcbsp->dma_tx_sync, "McBSP TX", | ||
1342 | omap_mcbsp_tx_dma_callback, | ||
1343 | mcbsp, | ||
1344 | &dma_tx_ch)) { | ||
1345 | dev_err(mcbsp->dev, " Unable to request DMA channel for " | ||
1346 | "McBSP%d TX. Trying IRQ based TX\n", | ||
1347 | mcbsp->id); | ||
1348 | return -EAGAIN; | ||
1349 | } | ||
1350 | mcbsp->dma_tx_lch = dma_tx_ch; | ||
1351 | |||
1352 | dev_err(mcbsp->dev, "McBSP%d TX DMA on channel %d\n", mcbsp->id, | ||
1353 | dma_tx_ch); | ||
1354 | |||
1355 | init_completion(&mcbsp->tx_dma_completion); | ||
1356 | |||
1357 | if (cpu_class_is_omap1()) { | ||
1358 | src_port = OMAP_DMA_PORT_TIPB; | ||
1359 | dest_port = OMAP_DMA_PORT_EMIFF; | ||
1360 | } | ||
1361 | if (cpu_class_is_omap2()) | ||
1362 | sync_dev = mcbsp->dma_tx_sync; | ||
1363 | |||
1364 | omap_set_dma_transfer_params(mcbsp->dma_tx_lch, | ||
1365 | OMAP_DMA_DATA_TYPE_S16, | ||
1366 | length >> 1, 1, | ||
1367 | OMAP_DMA_SYNC_ELEMENT, | ||
1368 | sync_dev, 0); | ||
1369 | |||
1370 | omap_set_dma_dest_params(mcbsp->dma_tx_lch, | ||
1371 | src_port, | ||
1372 | OMAP_DMA_AMODE_CONSTANT, | ||
1373 | mcbsp->phys_base + OMAP_MCBSP_REG_DXR1, | ||
1374 | 0, 0); | ||
1375 | |||
1376 | omap_set_dma_src_params(mcbsp->dma_tx_lch, | ||
1377 | dest_port, | ||
1378 | OMAP_DMA_AMODE_POST_INC, | ||
1379 | buffer, | ||
1380 | 0, 0); | ||
1381 | |||
1382 | omap_start_dma(mcbsp->dma_tx_lch); | ||
1383 | wait_for_completion(&mcbsp->tx_dma_completion); | ||
1384 | |||
1385 | return 0; | ||
1386 | } | ||
1387 | EXPORT_SYMBOL(omap_mcbsp_xmit_buffer); | ||
1388 | |||
1389 | int omap_mcbsp_recv_buffer(unsigned int id, dma_addr_t buffer, | ||
1390 | unsigned int length) | ||
1391 | { | ||
1392 | struct omap_mcbsp *mcbsp; | ||
1393 | int dma_rx_ch; | ||
1394 | int src_port = 0; | ||
1395 | int dest_port = 0; | ||
1396 | int sync_dev = 0; | ||
1397 | |||
1398 | if (!omap_mcbsp_check_valid_id(id)) { | ||
1399 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
1400 | return -ENODEV; | ||
1401 | } | ||
1402 | mcbsp = id_to_mcbsp_ptr(id); | ||
1403 | |||
1404 | if (omap_request_dma(mcbsp->dma_rx_sync, "McBSP RX", | ||
1405 | omap_mcbsp_rx_dma_callback, | ||
1406 | mcbsp, | ||
1407 | &dma_rx_ch)) { | ||
1408 | dev_err(mcbsp->dev, "Unable to request DMA channel for " | ||
1409 | "McBSP%d RX. Trying IRQ based RX\n", | ||
1410 | mcbsp->id); | ||
1411 | return -EAGAIN; | ||
1412 | } | ||
1413 | mcbsp->dma_rx_lch = dma_rx_ch; | ||
1414 | |||
1415 | dev_err(mcbsp->dev, "McBSP%d RX DMA on channel %d\n", mcbsp->id, | ||
1416 | dma_rx_ch); | ||
1417 | |||
1418 | init_completion(&mcbsp->rx_dma_completion); | ||
1419 | |||
1420 | if (cpu_class_is_omap1()) { | ||
1421 | src_port = OMAP_DMA_PORT_TIPB; | ||
1422 | dest_port = OMAP_DMA_PORT_EMIFF; | ||
1423 | } | ||
1424 | if (cpu_class_is_omap2()) | ||
1425 | sync_dev = mcbsp->dma_rx_sync; | ||
1426 | |||
1427 | omap_set_dma_transfer_params(mcbsp->dma_rx_lch, | ||
1428 | OMAP_DMA_DATA_TYPE_S16, | ||
1429 | length >> 1, 1, | ||
1430 | OMAP_DMA_SYNC_ELEMENT, | ||
1431 | sync_dev, 0); | ||
1432 | |||
1433 | omap_set_dma_src_params(mcbsp->dma_rx_lch, | ||
1434 | src_port, | ||
1435 | OMAP_DMA_AMODE_CONSTANT, | ||
1436 | mcbsp->phys_base + OMAP_MCBSP_REG_DRR1, | ||
1437 | 0, 0); | ||
1438 | |||
1439 | omap_set_dma_dest_params(mcbsp->dma_rx_lch, | ||
1440 | dest_port, | ||
1441 | OMAP_DMA_AMODE_POST_INC, | ||
1442 | buffer, | ||
1443 | 0, 0); | ||
1444 | |||
1445 | omap_start_dma(mcbsp->dma_rx_lch); | ||
1446 | wait_for_completion(&mcbsp->rx_dma_completion); | ||
1447 | |||
1448 | return 0; | ||
1449 | } | ||
1450 | EXPORT_SYMBOL(omap_mcbsp_recv_buffer); | ||
1451 | |||
1452 | /* | ||
1453 | * SPI wrapper. | ||
1454 | * Since SPI setup is much simpler than the generic McBSP one, | ||
1455 | * this wrapper just need an omap_mcbsp_spi_cfg structure as an input. | ||
1456 | * Once this is done, you can call omap_mcbsp_start(). | ||
1457 | */ | ||
1458 | void omap_mcbsp_set_spi_mode(unsigned int id, | ||
1459 | const struct omap_mcbsp_spi_cfg *spi_cfg) | ||
1460 | { | ||
1461 | struct omap_mcbsp *mcbsp; | ||
1462 | struct omap_mcbsp_reg_cfg mcbsp_cfg; | ||
1463 | |||
1464 | if (!omap_mcbsp_check_valid_id(id)) { | ||
1465 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
1466 | return; | ||
1467 | } | ||
1468 | mcbsp = id_to_mcbsp_ptr(id); | ||
1469 | |||
1470 | memset(&mcbsp_cfg, 0, sizeof(struct omap_mcbsp_reg_cfg)); | ||
1471 | |||
1472 | /* SPI has only one frame */ | ||
1473 | mcbsp_cfg.rcr1 |= (RWDLEN1(spi_cfg->word_length) | RFRLEN1(0)); | ||
1474 | mcbsp_cfg.xcr1 |= (XWDLEN1(spi_cfg->word_length) | XFRLEN1(0)); | ||
1475 | |||
1476 | /* Clock stop mode */ | ||
1477 | if (spi_cfg->clk_stp_mode == OMAP_MCBSP_CLK_STP_MODE_NO_DELAY) | ||
1478 | mcbsp_cfg.spcr1 |= (1 << 12); | ||
1479 | else | ||
1480 | mcbsp_cfg.spcr1 |= (3 << 11); | ||
1481 | |||
1482 | /* Set clock parities */ | ||
1483 | if (spi_cfg->rx_clock_polarity == OMAP_MCBSP_CLK_RISING) | ||
1484 | mcbsp_cfg.pcr0 |= CLKRP; | ||
1485 | else | ||
1486 | mcbsp_cfg.pcr0 &= ~CLKRP; | ||
1487 | |||
1488 | if (spi_cfg->tx_clock_polarity == OMAP_MCBSP_CLK_RISING) | ||
1489 | mcbsp_cfg.pcr0 &= ~CLKXP; | ||
1490 | else | ||
1491 | mcbsp_cfg.pcr0 |= CLKXP; | ||
1492 | |||
1493 | /* Set SCLKME to 0 and CLKSM to 1 */ | ||
1494 | mcbsp_cfg.pcr0 &= ~SCLKME; | ||
1495 | mcbsp_cfg.srgr2 |= CLKSM; | ||
1496 | |||
1497 | /* Set FSXP */ | ||
1498 | if (spi_cfg->fsx_polarity == OMAP_MCBSP_FS_ACTIVE_HIGH) | ||
1499 | mcbsp_cfg.pcr0 &= ~FSXP; | ||
1500 | else | ||
1501 | mcbsp_cfg.pcr0 |= FSXP; | ||
1502 | |||
1503 | if (spi_cfg->spi_mode == OMAP_MCBSP_SPI_MASTER) { | ||
1504 | mcbsp_cfg.pcr0 |= CLKXM; | ||
1505 | mcbsp_cfg.srgr1 |= CLKGDV(spi_cfg->clk_div - 1); | ||
1506 | mcbsp_cfg.pcr0 |= FSXM; | ||
1507 | mcbsp_cfg.srgr2 &= ~FSGM; | ||
1508 | mcbsp_cfg.xcr2 |= XDATDLY(1); | ||
1509 | mcbsp_cfg.rcr2 |= RDATDLY(1); | ||
1510 | } else { | ||
1511 | mcbsp_cfg.pcr0 &= ~CLKXM; | ||
1512 | mcbsp_cfg.srgr1 |= CLKGDV(1); | ||
1513 | mcbsp_cfg.pcr0 &= ~FSXM; | ||
1514 | mcbsp_cfg.xcr2 &= ~XDATDLY(3); | ||
1515 | mcbsp_cfg.rcr2 &= ~RDATDLY(3); | ||
1516 | } | ||
1517 | |||
1518 | mcbsp_cfg.xcr2 &= ~XPHASE; | ||
1519 | mcbsp_cfg.rcr2 &= ~RPHASE; | ||
1520 | |||
1521 | omap_mcbsp_config(id, &mcbsp_cfg); | ||
1522 | } | ||
1523 | EXPORT_SYMBOL(omap_mcbsp_set_spi_mode); | ||
1524 | |||
1525 | #ifdef CONFIG_ARCH_OMAP3 | 969 | #ifdef CONFIG_ARCH_OMAP3 |
1526 | #define max_thres(m) (mcbsp->pdata->buffer_size) | 970 | #define max_thres(m) (mcbsp->pdata->buffer_size) |
1527 | #define valid_threshold(m, val) ((val) <= max_thres(m)) | 971 | #define valid_threshold(m, val) ((val) <= max_thres(m)) |
@@ -1833,8 +1277,6 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev) | |||
1833 | spin_lock_init(&mcbsp->lock); | 1277 | spin_lock_init(&mcbsp->lock); |
1834 | mcbsp->id = id + 1; | 1278 | mcbsp->id = id + 1; |
1835 | mcbsp->free = true; | 1279 | mcbsp->free = true; |
1836 | mcbsp->dma_tx_lch = -1; | ||
1837 | mcbsp->dma_rx_lch = -1; | ||
1838 | 1280 | ||
1839 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu"); | 1281 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu"); |
1840 | if (!res) { | 1282 | if (!res) { |
@@ -1860,9 +1302,6 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev) | |||
1860 | else | 1302 | else |
1861 | mcbsp->phys_dma_base = res->start; | 1303 | mcbsp->phys_dma_base = res->start; |
1862 | 1304 | ||
1863 | /* Default I/O is IRQ based */ | ||
1864 | mcbsp->io_type = OMAP_MCBSP_IRQ_IO; | ||
1865 | |||
1866 | mcbsp->tx_irq = platform_get_irq_byname(pdev, "tx"); | 1305 | mcbsp->tx_irq = platform_get_irq_byname(pdev, "tx"); |
1867 | mcbsp->rx_irq = platform_get_irq_byname(pdev, "rx"); | 1306 | mcbsp->rx_irq = platform_get_irq_byname(pdev, "rx"); |
1868 | 1307 | ||