lkml.org 
[lkml]   [2018]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.17 043/336] watchdog: da9063: Fix updating timeout value
    Date
    4.17-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Marco Felsch <m.felsch@pengutronix.de>

    [ Upstream commit 44ee54aabfdb3b35866ed909bde3ab01e9679385 ]

    The DA9063 watchdog has only one register field to store the timeout value
    and to enable the watchdog. The watchdog gets enabled if the value is
    not zero. There is no issue if the watchdog is already running but it
    leads into problems if the watchdog is disabled.

    If the watchdog is disabled and only the timeout value should be prepared
    the watchdog gets enabled too. Add a check to get the current watchdog
    state and update the watchdog timeout value on hw-side only if the
    watchdog is already active.

    Fixes: 5e9c16e37608 ("watchdog: Add DA9063 PMIC watchdog driver.")
    Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/watchdog/da9063_wdt.c | 17 +++++++++++++++--
    1 file changed, 15 insertions(+), 2 deletions(-)

    --- a/drivers/watchdog/da9063_wdt.c
    +++ b/drivers/watchdog/da9063_wdt.c
    @@ -99,10 +99,23 @@ static int da9063_wdt_set_timeout(struct
    {
    struct da9063 *da9063 = watchdog_get_drvdata(wdd);
    unsigned int selector;
    - int ret;
    + int ret = 0;

    selector = da9063_wdt_timeout_to_sel(timeout);
    - ret = _da9063_wdt_set_timeout(da9063, selector);
    +
    + /*
    + * There are two cases when a set_timeout() will be called:
    + * 1. The watchdog is off and someone wants to set the timeout for the
    + * further use.
    + * 2. The watchdog is already running and a new timeout value should be
    + * set.
    + *
    + * The watchdog can't store a timeout value not equal zero without
    + * enabling the watchdog, so the timeout must be buffered by the driver.
    + */
    + if (watchdog_active(wdd))
    + ret = _da9063_wdt_set_timeout(da9063, selector);
    +
    if (ret)
    dev_err(da9063->dev, "Failed to set watchdog timeout (err = %d)\n",
    ret);

    \
     
     \ /
      Last update: 2018-08-01 20:26    [W:3.710 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site