Skip to content

Commit

Permalink
watchdog: s3c2410: Fail probe if can't find valid timeout
Browse files Browse the repository at this point in the history
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>
Link: https://lore.kernel.org/r/20211107202943.8859-4-semen.protsenko@linaro.org
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
  • Loading branch information
Sam Protsenko authored and Wim Van Sebroeck committed Dec 28, 2021
1 parent 0b59583 commit f197d47
Showing 1 changed file with 10 additions and 11 deletions.
21 changes: 10 additions & 11 deletions drivers/watchdog/s3c2410_wdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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,
Expand All @@ -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 */
Expand Down

0 comments on commit f197d47

Please sign in to comment.