ARM: OMAP2+: Fix dmtimer set source clock failure
Subsystems (2)
PATCH 1/1 ARM: OMAP2+: Fix dmtimer set source clock failure
Calling the dmtimer function omap_dm_timer_set_source() fails if following a call to pm_runtime_put() to disable the timer. For example the following sequence would fail to set the parent clock ...
omap_dm_timer_stop(gptimer); omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_32_KHZ);
The following error message would be seen ...
omap_dm_timer_set_source: failed to set timer_32k_ck as parent
The problem is that, by design, pm_runtime_put() simply decrements the usage count and returns before the timer has actually been disabled. Therefore, setting the parent clock failed because the timer was still active when the trying to set the parent clock. Setting a parent clock will fail if the clock you are setting the parent of has a non-zero usage count. To ensure that this does not fail use pm_runtime_put_sync() when disabling the timer.
Note that this will not be seen on OMAP1 devices, because these devices do not use the clock framework for dmtimers.
--- arch/arm/plat-omap/dmtimer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/plat-omap/dmtimer.c +1 -1
@@ -258,7 +258,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_enable);void omap_dm_timer_disable (struct omap_dm_timer *timer) { -pm_runtime_put (&timer->pdev->dev); +pm_runtime_put_sync (&timer->pdev->dev); }EXPORT_SYMBOL_GPL (omap_dm_timer_disable);
Signature · 1 line
1.7.9.5
PATCH 1/1 ARM: OMAP2+: Fix dmtimer set source clock failure
Hi,
Quoted 18 lines · Jon Hunter
Calling the dmtimer function
omap_dm_timer_set_source()fails if following a call topm_runtime_put()to disable the timer. For example the following sequence would fail to set the parent clock ...omap_dm_timer_stop(gptimer); omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_32_KHZ);The following error message would be seen ...
omap_dm_timer_set_source: failed to settimer_32k_ckas parentThe problem is that, by design,
pm_runtime_put()simply decrements the usage count and returns before the timer has actually been disabled. Therefore, setting the parent clock failed because the timer was still active when the trying to set the parent clock. Setting a parent clock will fail if the clock you are setting the parent of has a non-zero usage count. To ensure that this does not fail usepm_runtime_put_sync()when disabling the timer.
Quoted 2 lines
Note that this will not be seen on OMAP1 devices, because these devices do not use the clock framework for dmtimers.
Kevin care to ack this one? This should also be Cc: stable it seems?
Regards,
Tony
Quoted 21 lines
Signed-off-by Jon Hunter <[email protected]>--- arch/arm/plat-omap/dmtimer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/arm/plat-omap/dmtimer.c +1
-1@@ -258,7 +258,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_enable);void omap_dm_timer_disable (struct omap_dm_timer *timer) { -pm_runtime_put (&timer->pdev->dev); +pm_runtime_put_sync (&timer->pdev->dev); }EXPORT_SYMBOL_GPL (omap_dm_timer_disable);Signature · 1 line
1.7.9.5
PATCH 1/1 ARM: OMAP2+: Fix dmtimer set source clock failure
In reply to Jon HunterQuoted 18 lines · Jon Hunter
Calling the dmtimer function
omap_dm_timer_set_source()fails if following a call topm_runtime_put()to disable the timer. For example the following sequence would fail to set the parent clock ...omap_dm_timer_stop(gptimer); omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_32_KHZ);The following error message would be seen ...
omap_dm_timer_set_source: failed to settimer_32k_ckas parentThe problem is that, by design,
pm_runtime_put()simply decrements the usage count and returns before the timer has actually been disabled. Therefore, setting the parent clock failed because the timer was still active when the trying to set the parent clock. Setting a parent clock will fail if the clock you are setting the parent of has a non-zero usage count. To ensure that this does not fail usepm_runtime_put_sync()when disabling the timer.
Quoted 4 lines
Note that this will not be seen on OMAP1 devices, because these devices do not use the clock framework for dmtimers.
Signed-off-by Jon Hunter <[email protected]>
Quoted 16 lines
--- arch/arm/plat-omap/dmtimer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/arm/plat-omap/dmtimer.c +1
-1@@ -258,7 +258,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_enable);void omap_dm_timer_disable (struct omap_dm_timer *timer) { -pm_runtime_put (&timer->pdev->dev); +pm_runtime_put_sync (&timer->pdev->dev); }EXPORT_SYMBOL_GPL (omap_dm_timer_disable);
PATCH 1/1 ARM: OMAP2+: Fix dmtimer set source clock failure
Quoted 20 lines · Kevin Hilman
Quoted 18 lines · Jon Hunter
Calling the dmtimer function
omap_dm_timer_set_source()fails if following a call topm_runtime_put()to disable the timer. For example the following sequence would fail to set the parent clock ...omap_dm_timer_stop(gptimer); omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_32_KHZ);The following error message would be seen ...
omap_dm_timer_set_source: failed to settimer_32k_ckas parentThe problem is that, by design,
pm_runtime_put()simply decrements the usage count and returns before the timer has actually been disabled. Therefore, setting the parent clock failed because the timer was still active when the trying to set the parent clock. Setting a parent clock will fail if the clock you are setting the parent of has a non-zero usage count. To ensure that this does not fail usepm_runtime_put_sync()when disabling the timer.
Quoted 6 lines
Quoted 4 lines
Note that this will not be seen on OMAP1 devices, because these devices do not use the clock framework for dmtimers.
Signed-off-by Jon Hunter <[email protected]>Acked-by Kevin Hilman <[email protected]>
Thanks applying into fixes with Cc stable.
Tony