• Jon Hunter's avatar
    ARM: OMAP2+: Fix dmtimer set source clock failure · 20ac628b
    Jon Hunter authored
    commit 54f32a35 upstream.
    
    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.
    Signed-off-by: default avatarJon Hunter <jon-hunter@ti.com>
    Acked-by: default avatarKevin Hilman <khilman@ti.com>
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    20ac628b
dmtimer.c 18.5 KB