summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-omap2/timer.c32
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 */
72static struct omap_hwmod *clockevent_gpt_hwmod; 72static struct omap_hwmod *clockevent_gpt_hwmod;
73 73
74/* Clockesource hwmod for am437x suspend */
75static struct omap_hwmod *clocksource_gpt_hwmod;
76
74#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER 77#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
75static unsigned long arch_timer_freq; 78static 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
448static unsigned int omap2_gptimer_clksrc_load;
449
450static 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
458static 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
445static void __init omap2_gptimer_clocksource_init(int gptimer_id, 468static 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,