| From e4566373f1768b80b538a519495539abd928cb4a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 15 Apr 2021 11:55:06 +0300 |
| Subject: clocksource/drivers/timer-ti-dm: Save and restore timer TIOCP_CFG |
| |
| From: Tony Lindgren <tony@atomide.com> |
| |
| [ Upstream commit 9517c577f9f722270584cfb1a7b4e1354e408658 ] |
| |
| As we are using cpu_pm to save and restore context, we must also save and |
| restore the timer sysconfig register TIOCP_CFG. This is needed because |
| we are not calling PM runtime functions at all with cpu_pm. |
| |
| Fixes: b34677b0999a ("clocksource/drivers/timer-ti-dm: Implement cpu_pm notifier for context save and restore") |
| Cc: Aaro Koskinen <aaro.koskinen@iki.fi> |
| Cc: Adam Ford <aford173@gmail.com> |
| Cc: Andreas Kemnade <andreas@kemnade.info> |
| Cc: Lokesh Vutla <lokeshvutla@ti.com> |
| Cc: Peter Ujfalusi <peter.ujfalusi@gmail.com> |
| Signed-off-by: Tony Lindgren <tony@atomide.com> |
| Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> |
| Link: https://lore.kernel.org/r/20210415085506.56828-1-tony@atomide.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/clocksource/timer-ti-dm.c | 6 ++++++ |
| include/clocksource/timer-ti-dm.h | 1 + |
| 2 files changed, 7 insertions(+) |
| |
| diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-ti-dm.c |
| index 33eeabf9c3d1..e5c631f1b5cb 100644 |
| --- a/drivers/clocksource/timer-ti-dm.c |
| +++ b/drivers/clocksource/timer-ti-dm.c |
| @@ -78,6 +78,9 @@ static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg, |
| |
| static void omap_timer_restore_context(struct omap_dm_timer *timer) |
| { |
| + __omap_dm_timer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, |
| + timer->context.ocp_cfg, 0); |
| + |
| omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, |
| timer->context.twer); |
| omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, |
| @@ -95,6 +98,9 @@ static void omap_timer_restore_context(struct omap_dm_timer *timer) |
| |
| static void omap_timer_save_context(struct omap_dm_timer *timer) |
| { |
| + timer->context.ocp_cfg = |
| + __omap_dm_timer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET, 0); |
| + |
| timer->context.tclr = |
| omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); |
| timer->context.twer = |
| diff --git a/include/clocksource/timer-ti-dm.h b/include/clocksource/timer-ti-dm.h |
| index 4c61dade8835..f6da8a132639 100644 |
| --- a/include/clocksource/timer-ti-dm.h |
| +++ b/include/clocksource/timer-ti-dm.h |
| @@ -74,6 +74,7 @@ |
| #define OMAP_TIMER_ERRATA_I103_I767 0x80000000 |
| |
| struct timer_regs { |
| + u32 ocp_cfg; |
| u32 tidr; |
| u32 tier; |
| u32 twer; |
| -- |
| 2.30.2 |
| |