aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/timer.c
diff options
context:
space:
mode:
authorKeerthy <j-keerthy@ti.com>2018-05-22 14:22:20 -0400
committerTony Lindgren <tony@atomide.com>2018-05-23 17:16:26 -0400
commit759c27bdc77577aaecb6f31768e5951a858f97a9 (patch)
tree64cdd17425c1f3cca3e84e9f23f30f31dda9890d /arch/arm/mach-omap2/timer.c
parent38c4b121b0fb6b3a861345bad8d4d3db621f1829 (diff)
OMAP: CLK: CLKSRC: Add suspend resume hooks
Add the save and restore for clksrc as part of suspend and resume so that it saves the counter value and restores. This is needed in modes like rtc+ddr in self-refresh not doing this stalls the time. Signed-off-by: Keerthy <j-keerthy@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/mach-omap2/timer.c')
-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,