aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-omap/dmtimer.c
diff options
context:
space:
mode:
authorTarun Kanti DebBarma <tarun.kanti@ti.com>2012-03-05 19:11:00 -0500
committerTony Lindgren <tony@atomide.com>2012-03-05 19:11:00 -0500
commitdffc9daeec5e7e2a5bfcb7cbb5abf3a9dc64ffe1 (patch)
treead6fdcb1d6a82ba7dceb10337c89191977d20ca4 /arch/arm/plat-omap/dmtimer.c
parentd82ba9954b6b2c4ac91ec6f6f42be8c5215d0619 (diff)
ARM: OMAP: dmtimer: fix missing content/correction in low-power mode support
Since omap_dm_timer_write_reg/__omap_dm_timer_write is now modified to use timer->func_base OCP_CFG should not use this wrapper anymore. Instead use __raw_writel() directly and use timer->io_base instead to write to OCP_CFG. The timer->sys_stat is valid only if timer->revision is 1. In the context restore function make this correction. Save the contexts and loss count when timer is stopped. Also, disable the clock. Else, clock usecount would become imbalanced. Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@ti.com> Tested-by: Omar Ramirez Luna <omar.ramirez@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/plat-omap/dmtimer.c')
-rw-r--r--arch/arm/plat-omap/dmtimer.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c
index af3b92be8459..0b77fe87e010 100644
--- a/arch/arm/plat-omap/dmtimer.c
+++ b/arch/arm/plat-omap/dmtimer.c
@@ -80,9 +80,9 @@ static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg,
80 80
81static void omap_timer_restore_context(struct omap_dm_timer *timer) 81static void omap_timer_restore_context(struct omap_dm_timer *timer)
82{ 82{
83 omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_OFFSET, 83 __raw_writel(timer->context.tiocp_cfg,
84 timer->context.tiocp_cfg); 84 timer->io_base + OMAP_TIMER_OCP_CFG_OFFSET);
85 if (timer->revision > 1) 85 if (timer->revision == 1)
86 __raw_writel(timer->context.tistat, timer->sys_stat); 86 __raw_writel(timer->context.tistat, timer->sys_stat);
87 87
88 __raw_writel(timer->context.tisr, timer->irq_stat); 88 __raw_writel(timer->context.tisr, timer->irq_stat);
@@ -357,6 +357,19 @@ int omap_dm_timer_stop(struct omap_dm_timer *timer)
357 357
358 __omap_dm_timer_stop(timer, timer->posted, rate); 358 __omap_dm_timer_stop(timer, timer->posted, rate);
359 359
360 if (timer->loses_context && timer->get_context_loss_count)
361 timer->ctx_loss_count =
362 timer->get_context_loss_count(&timer->pdev->dev);
363
364 /*
365 * Since the register values are computed and written within
366 * __omap_dm_timer_stop, we need to use read to retrieve the
367 * context.
368 */
369 timer->context.tclr =
370 omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
371 timer->context.tisr = __raw_readl(timer->irq_stat);
372 omap_dm_timer_disable(timer);
360 return 0; 373 return 0;
361} 374}
362EXPORT_SYMBOL_GPL(omap_dm_timer_stop); 375EXPORT_SYMBOL_GPL(omap_dm_timer_stop);