[U-Boot] [PATCH 2/2] watchdog: designware: Convert to DM and DT probing

Marek Vasut marex at denx.de
Thu Oct 3 07:20:15 UTC 2019


On 10/3/19 3:57 AM, Ley Foon Tan wrote:

[...]

>> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
>> index 6fd9b0a177..ec34993664 100644
>> --- a/drivers/watchdog/Kconfig
>> +++ b/drivers/watchdog/Kconfig
>> @@ -36,13 +36,6 @@ config ULP_WATCHDOG
>>         help
>>           Say Y here to enable i.MX7ULP watchdog driver.
>>
>> -config DESIGNWARE_WATCHDOG
>> -       bool "Designware watchdog timer support"
>> -       select HW_WATCHDOG
> CONFIG_HW_WATCHDOG is disabled now. Few areas of code in
> arm/mach-socfpga/ still using this CONFIG and call to
> hw_watchdog_init(). They need to remove too.
> Do we need call to uclass_get_device(UCLASS_WDT, 0, &dev) in SPL to
> probe watchdog and call to wdt_start() to start watchdog? Can't find
> place that start watchdog.

You're right, and the WDT is enabled early on, before the DM structures
are available.

I wonder whether we should do what we did on iMX -- have a non-DM WDT
driver for SPL and DM-one for U-Boot proper.

[...]

>> -void hw_watchdog_init(void)
>> +static int designware_wdt_stop(struct udevice *dev)
>>  {
>>         /* reset to disable the watchdog */
>> -       hw_watchdog_reset();
>> +       designware_wdt_reset(dev);
> Need to clear BIT(DW_WDT_CR_EN_OFFSET) in CR register to disable watchdog.

Fixed

>> +       return 0;
>> +}
>> +
>> +static int designware_wdt_start(struct udevice *dev, u64 timeout, ulong flags)
>> +{
>> +       struct designware_wdt_priv *priv = dev_get_priv(dev);
>> +
>> +       designware_wdt_stop(dev);
>> +
>>         /* set timer in miliseconds */
>> -       designware_wdt_settimeout(CONFIG_WATCHDOG_TIMEOUT_MSECS);
>> -       /* enable the watchdog */
>> -       designware_wdt_enable();
>> +       designware_wdt_settimeout(dev, timeout);
>> +
>> +       writel((DW_WDT_CR_RMOD_VAL << DW_WDT_CR_RMOD_OFFSET) |
>> +             BIT(DW_WDT_CR_EN_OFFSET),
>> +             priv->base + DW_WDT_CR);
>> +
>>         /* reset the watchdog */
>> -       hw_watchdog_reset();
>> +       designware_wdt_reset(dev);
> Need move to before enable CR_EN bit if we add clear CR_EN bit in
> designware_wdt_reset().

I think if someone needs to clear CR_EN, they should call
designware_wdt_stop(), which should clear the CR_EN.

>> +       return 0;
>> +}
>> +
>> +static int designware_wdt_probe(struct udevice *dev)
>> +{
> Need to de-assert reset for watchdog in probe using reset framework.
>> +       /* reset to disable the watchdog */
>> +       designware_wdt_reset(dev);
> designware_wdt_reset() only reset watchdog counter, but doesn't
> disable the watchdog.
> Can change call to designware_wdt_stop() if _stop() add clear CR_EN bit.

Yep, fixed, thanks.

[...]

-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list