lkml.org 
[lkml]   [2021]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 03/12] watchdog: s3c2410: Fail probe if can't find valid timeout
    Date
    Driver can't work properly if there no valid timeout was found in
    s3c2410wdt_set_heartbeat(). Ideally, that function should be reworked in
    a way that it's always able to find some valid timeout. As a temporary
    solution let's for now just fail the driver probe in case the valid
    timeout can't be found in s3c2410wdt_set_heartbeat() function.

    Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Suggested-by: Guenter Roeck <linux@roeck-us.net>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    ---
    Changes in v4:
    - Added R-b tag by Guenter Roeck

    Changes in v3:
    - Added R-b tag by Krzysztof Kozlowski

    Changes in v2:
    - (none): it's a new patch

    drivers/watchdog/s3c2410_wdt.c | 21 ++++++++++-----------
    1 file changed, 10 insertions(+), 11 deletions(-)

    diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c
    index 2395f353e52d..00421cf22556 100644
    --- a/drivers/watchdog/s3c2410_wdt.c
    +++ b/drivers/watchdog/s3c2410_wdt.c
    @@ -515,7 +515,6 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
    struct s3c2410_wdt *wdt;
    struct resource *wdt_irq;
    unsigned int wtcon;
    - int started = 0;
    int ret;

    wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
    @@ -581,15 +580,15 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
    ret = s3c2410wdt_set_heartbeat(&wdt->wdt_device,
    wdt->wdt_device.timeout);
    if (ret) {
    - started = s3c2410wdt_set_heartbeat(&wdt->wdt_device,
    - S3C2410_WATCHDOG_DEFAULT_TIME);
    -
    - if (started == 0)
    - dev_info(dev,
    - "tmr_margin value out of range, default %d used\n",
    + ret = s3c2410wdt_set_heartbeat(&wdt->wdt_device,
    + S3C2410_WATCHDOG_DEFAULT_TIME);
    + if (ret == 0) {
    + dev_warn(dev, "tmr_margin value out of range, default %d used\n",
    S3C2410_WATCHDOG_DEFAULT_TIME);
    - else
    - dev_info(dev, "default timer value is out of range, cannot start\n");
    + } else {
    + dev_err(dev, "failed to use default timeout\n");
    + goto err_cpufreq;
    + }
    }

    ret = devm_request_irq(dev, wdt_irq->start, s3c2410wdt_irq, 0,
    @@ -613,10 +612,10 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
    if (ret < 0)
    goto err_unregister;

    - if (tmr_atboot && started == 0) {
    + if (tmr_atboot) {
    dev_info(dev, "starting watchdog timer\n");
    s3c2410wdt_start(&wdt->wdt_device);
    - } else if (!tmr_atboot) {
    + } else {
    /* if we're not enabling the watchdog, then ensure it is
    * disabled if it has been left running from the bootloader
    * or other source */
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-11-21 17:58    [W:4.223 / U:0.448 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site