Skip to contentSkip to conversation

OMAP: CLK: CLKSRC: Add suspend resume hooks

PATCH Superseded Keerthy 2 participants 4 messages May 22, 2018 – May 23, 2018

Subsystems (3)
lore
Share & tools
lore

Keerthy

author
#0 lore raw

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
index 5a70ab6..98ed5ac 100644
@@ -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
maintainer
#1 lore raw

PATCH 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

author
#2 lore raw

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 -0
  				     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

maintainer
#3 lore raw

PATCH 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.dtsi has compatible ti,omap-counter32k which is arch/arm/mach-omap2/timer.c compatible

Oh OK.

Quoted 2 lines

IMHO clocksource suspend resume best fits under mach-omap2/timer.c just 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