OMAP: CLK: CLKSRC: Add suspend resume hooks
Subsystems (3)
PATCH v2 1/1 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.
---
Changes in v2:
* Instead of everytime looking up for clksrc hwmod doing it once during init
* Tested on am437x-gp-evm
Probably too late for 4.18!
arch/arm/mach-omap2/timer.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
arch/arm/mach-omap2/timer.c +32 -0
@@ -70,6 +70,9 @@/* Clockevent hwmod for am335x and am437x suspend */ static struct omap_hwmod *clockevent_gpt_hwmod; +/* Clockesource hwmod for am437x suspend */ +static struct omap_hwmod *clocksource_gpt_hwmod; +#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER static unsigned long arch_timer_freq;
@@ -478,6 +481,26 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void)return ret; } +static unsigned int omap2_gptimer_clksrc_load; + +static void omap2_gptimer_clksrc_suspend (struct clocksource *unused) +{ + omap2_gptimer_clksrc_load = +__omap_dm_timer_read_counter (&clksrc,OMAP_TIMER_NONPOSTED ); + +omap_hwmod_idle (clocksource_gpt_hwmod); +} + +static void omap2_gptimer_clksrc_resume (struct clocksource *unused) +{ +omap_hwmod_enable (clocksource_gpt_hwmod); + +__omap_dm_timer_load_start (&clksrc, +OMAP_TIMER_CTRL_ST |OMAP_TIMER_CTRL_AR , + omap2_gptimer_clksrc_load, +OMAP_TIMER_NONPOSTED ); +} +static void __init omap2_gptimer_clocksource_init (int gptimer_id,const char *fck_source,const char *property)
@@ -490,6 +513,15 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id, res =omap_dm_timer_init_one (&clksrc, fck_source, property, &clocksource_gpt.name,OMAP_TIMER_NONPOSTED ); + +if (soc_is_am43xx ()) { + clocksource_gpt.suspend = omap2_gptimer_clksrc_suspend; + clocksource_gpt.resume = omap2_gptimer_clksrc_resume; + + clocksource_gpt_hwmod = +omap_hwmod_lookup (clocksource_gpt.name); + } +BUG_ON (res); __omap_dm_timer_load_start(&clksrc,
Signature · 1 line
1.9.1
Tony Lindgren
maintainerPATCH v2 1/1 OMAP: CLK: CLKSRC: Add suspend resume hooks
Quoted 3 lines · Keerthy
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.
Can't we now do this all in drivers/clocksource/timer-ti-*.c?
arch/arm/mach-omap2/timer.c static void __init omap2_gptimer_clocksource_init(int gptimer_id, · line 524
Quoted 13 lines
arch/arm/mach-omap2/timer.c +9
-0@@ -490,6 +513,15 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id, res =omap_dm_timer_init_one (&clksrc, fck_source, property, &clocksource_gpt.name,OMAP_TIMER_NONPOSTED ); + +if (soc_is_am43xx ()) { + clocksource_gpt.suspend = omap2_gptimer_clksrc_suspend; + clocksource_gpt.resume = omap2_gptimer_clksrc_resume; + + clocksource_gpt_hwmod = +omap_hwmod_lookup (clocksource_gpt.name); + } +
Then you can do this based on a quirk flag set by compatible.
Regards,
Tony
PATCH v2 1/1 OMAP: CLK: CLKSRC: Add suspend resume hooks
Quoted 5 lines · Tony Lindgren
Quoted 3 lines · Keerthy
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.
Can't we now do this all in
drivers/clocksource/timer-ti-*.c?
arch/arm/boot/dts/am4372.dtsi has compatible ti,omap-counter32k which is arch/arm/mach-omap2/timer.c compatible
IMHO clocksource suspend resume best fits under mach-omap2/timer.c just like clockevent has suspend/resume.
Quoted 19 lines
Quoted 4 lines
arch/arm/mach-omap2/timer.c +0
-0@@ -490,6 +513,15 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id, res = omap_dm_timer_init_one(&clksrc, fck_source, property, &clocksource_gpt.name,arch/arm/mach-omap2/timer.c static void __init omap2_gptimer_clocksource_init(int gptimer_id, · line 524
Quoted 10 lines
arch/arm/mach-omap2/timer.c +9
-0OMAP_TIMER_NONPOSTED); + +if (soc_is_am43xx ()) { + clocksource_gpt.suspend = omap2_gptimer_clksrc_suspend; + clocksource_gpt.resume = omap2_gptimer_clksrc_resume; + + clocksource_gpt_hwmod = +omap_hwmod_lookup (clocksource_gpt.name); + } +Then you can do this based on a quirk flag set by compatible.
Regards,
Tony
Tony Lindgren
maintainerPATCH v2 1/1 OMAP: CLK: CLKSRC: Add suspend resume hooks
Quoted 11 lines · J, KEERTHY
Quoted 5 lines · Tony Lindgren
Quoted 3 lines · Keerthy
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.
Can't we now do this all in
drivers/clocksource/timer-ti-*.c?
arch/arm/boot/dts/am4372.dtsihas compatible ti,omap-counter32k which isarch/arm/mach-omap2/timer.ccompatible
Oh OK.
Quoted 2 lines
IMHO clocksource suspend resume best fits under
mach-omap2/timer.cjust like clockevent has suspend/resume.
Yup you're right. Applying into omap-for-v4.18/soc thanks. No guarantees at this point it will get merged though.
Regards,
Tony