• NeilBrown's avatar
    ARM: OMAP: Simplify dmtimer context-loss handling · 9cc268d5
    NeilBrown authored
    The context loss handling in dmtimer appears to assume that
    omap_dm_timer_set_load_start() or omap_dm_timer_start() and
    omap_dm_timer_stop() bracket all interactions.  Only the first two
    restore the context and the last updates the context loss counter.
    However omap_dm_timer_set_load() or omap_dm_timer_set_match() can
    reasonably be called outside this bracketing, and the fact that they
    call omap_dm_timer_enable() / omap_dm_timer_disable() suggest that
    is expected.
    
    So if, after a transition into and out of off-mode which would cause
    the dm timer to loose all state, omap_dm_timer_set_match() is called
    before omap_dm_timer_start(), the value read from OMAP_TIMER_CTRL_REG
    will be 'wrong' and this wrong value will be stored context.tclr so
    a subsequent omap_dm_timer_start() can fail (As the control register
    is wrong).
    
    Simplify this be doing the restore-from-context in
    omap_dm_timer_enable() so that whenever the timer is enabled, the
    context is correct. Also update the ctx_loss_count at the same time as
    we notice it is wrong - these is no value in delaying this until the
    omap_dm_timer_disable() as it cannot change while the timer is enabled.
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    [jon-hunter@ti.com: minor update to subject and changed variable name]
    Signed-off-by: default avatarJon Hunter <jon-hunter@ti.com>
    Acked-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarBenoit Cousson <benoit.cousson@linaro.org>
    9cc268d5
dmtimer.c 22.4 KB