[PATCH] ARM: OMAP2+: watchdog: fix !PM boot crash, disarm timer after hwmod reset

Kevin Hilman khilman at ti.com
Mon Apr 23 13:42:13 EDT 2012


Paul Walmsley <paul at pwsan.com> writes:

> cc Santosh
>
> Hi Kevin,
>
> Nice changelog!
>
> On Fri, 13 Apr 2012, Kevin Hilman wrote:
>
>> Without runtime PM enabled, hwmod needs to leave all IP blocks in an
>> enabled state by default so any driver access to the HW will succeed.
>> This is accomplished by seting the postsetup_state to enabled for all
>> hwmods during init when runtime PM is disabled.
>> 
>> Currently, we have a special case for WDT in that its postsetup_state
>> is always set to disabled.  This is done so that the WDT is disabled
>> and the timer is disarmed at boot in case there is no WDT driver.
>> This also means that when runtime PM is disabled, if a WDT driver *is*
>> built in the kernel, the kernel will crash on the first access to the
>> WDT hardware.
>> 
>> We can't simply leave the WDT module enabled, because the timer is
>> armed by default after reset. That means that if there is no WDT
>> driver initialzed or loaded before the timer expires, the kernel will
>> reboot.
>> 
>> To fix this, a custom reset method is added to the watchdog class of
>> omap_hwmod.  This method will *always* disarm the timer after hwmod
>> reset.  The WDT timer then will only be rearmed when/if the driver is
>> loaded for the WDT.  With the timer disarmed by default, we no longer
>> need a special-case for the postsetup_state of WDT during init, so it
>> is removed.
>> 
>> Any platforms wishing to ensure the watchdog remains armed across the
>> entire boot boot can simply disable the reset-on-init feature of the
>> watchdog hwmod using omap_hwmod_no_setup_reset().
>> 
>> Tested on 3530/Overo, 4430/Panda.
>> 
>> NOTE: on 4430, the hwmod OCP reset does not seem to rearm the timer as
>> documented in the TRM (and what happens on OMAP3.)  I noticed this
>> because testing the HWMOD_INIT_NO_RESET feature with no driver loaded,
>> I expected a reboot part way through the boot, but did not see a
>> reboot.  Adding some debug to read the counter, I verified that right
>> after OCP softreset, the counter is not firing.  After writing the
>> magic start sequence, the timer starts counting.  This means that the
>> timer disarm sequence added here does not seem to be needed for 4430,
>> but is technically the correct way to ensure the timer is disarmed, so
>> it is left in for OMAP4.
>> 
>> Special thanks to Paul Walmsley for helping brainstorm ideas to fix
>> this problem.
>> 
>> Cc: Paul Walmsley <paul at pwsan.com>
>> Signed-off-by: Kevin Hilman <khilman at ti.com>
>
> This looks great, looks like it will finally fix this longstanding bug.  I 
> think Santosh hit it too a long time ago, so I suspect he will be happy 
> too.
>
> One comment: I think that omap2_wd_timer_reset() needs to be updated in 
> light of commit 3c55c1baffa5f719eb2ae9729088bc867f972f53 ("ARM: OMAP2+: 
> hwmod: Revert "ARM: OMAP2+: hwmod: Make omap_hwmod_softreset wait for 
> reset status"").  I did this here.  It's passed basic build testing but 
> haven't tried booting it yet.  Care to take a look and see if you have any 
> comments?  It's also available in the 'hwmod_devel_a_3.5' branch of 
> git://git.pwsan.com/linux-2.6

I did some testing on OMAP3530/Overo and it still works fine with your
change.

> Also, am thinking about queuing this for 3.5 rather than 3.4-rc fixes due 
> to the massive hwmod data changes queued for 3.5, and since we've 
> suffered with this bug for at least a year, but wanted to run it by you 
> first.  That should save Tony some rebase hassle.  Any opinions on this?

I'm fine with waiting for 3.5 since it's a long-standing bug and not
really a regresstion.

Thanks for updating it,

Kevin



More information about the linux-arm-kernel mailing list