diff options
-rw-r--r-- | arch/arm/mach-omap2/timer.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 4fb4dc24e5e9..e16b207e9e56 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
@@ -71,6 +71,9 @@ static struct clock_event_device clockevent_gpt; | |||
71 | /* Clockevent hwmod for am335x and am437x suspend */ | 71 | /* Clockevent hwmod for am335x and am437x suspend */ |
72 | static struct omap_hwmod *clockevent_gpt_hwmod; | 72 | static struct omap_hwmod *clockevent_gpt_hwmod; |
73 | 73 | ||
74 | /* Clockesource hwmod for am437x suspend */ | ||
75 | static struct omap_hwmod *clocksource_gpt_hwmod; | ||
76 | |||
74 | #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER | 77 | #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER |
75 | static unsigned long arch_timer_freq; | 78 | static unsigned long arch_timer_freq; |
76 | 79 | ||
@@ -442,6 +445,26 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void) | |||
442 | return ret; | 445 | return ret; |
443 | } | 446 | } |
444 | 447 | ||
448 | static unsigned int omap2_gptimer_clksrc_load; | ||
449 | |||
450 | static void omap2_gptimer_clksrc_suspend(struct clocksource *unused) | ||
451 | { | ||
452 | omap2_gptimer_clksrc_load = | ||
453 | __omap_dm_timer_read_counter(&clksrc, OMAP_TIMER_NONPOSTED); | ||
454 | |||
455 | omap_hwmod_idle(clocksource_gpt_hwmod); | ||
456 | } | ||
457 | |||
458 | static void omap2_gptimer_clksrc_resume(struct clocksource *unused) | ||
459 | { | ||
460 | omap_hwmod_enable(clocksource_gpt_hwmod); | ||
461 | |||
462 | __omap_dm_timer_load_start(&clksrc, | ||
463 | OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, | ||
464 | omap2_gptimer_clksrc_load, | ||
465 | OMAP_TIMER_NONPOSTED); | ||
466 | } | ||
467 | |||
445 | static void __init omap2_gptimer_clocksource_init(int gptimer_id, | 468 | static void __init omap2_gptimer_clocksource_init(int gptimer_id, |
446 | const char *fck_source, | 469 | const char *fck_source, |
447 | const char *property) | 470 | const char *property) |
@@ -454,6 +477,15 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id, | |||
454 | res = omap_dm_timer_init_one(&clksrc, fck_source, property, | 477 | res = omap_dm_timer_init_one(&clksrc, fck_source, property, |
455 | &clocksource_gpt.name, | 478 | &clocksource_gpt.name, |
456 | OMAP_TIMER_NONPOSTED); | 479 | OMAP_TIMER_NONPOSTED); |
480 | |||
481 | if (soc_is_am43xx()) { | ||
482 | clocksource_gpt.suspend = omap2_gptimer_clksrc_suspend; | ||
483 | clocksource_gpt.resume = omap2_gptimer_clksrc_resume; | ||
484 | |||
485 | clocksource_gpt_hwmod = | ||
486 | omap_hwmod_lookup(clocksource_gpt.name); | ||
487 | } | ||
488 | |||
457 | BUG_ON(res); | 489 | BUG_ON(res); |
458 | 490 | ||
459 | __omap_dm_timer_load_start(&clksrc, | 491 | __omap_dm_timer_load_start(&clksrc, |