| From a189ae4c79c8c532b87cfb77b6ac10443079fd30 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 17 May 2021 23:19:45 +0530 |
| Subject: watchdog: keembay: Update WDT pre-timeout during the initialization |
| |
| From: Shruthi Sanil <shruthi.sanil@intel.com> |
| |
| [ Upstream commit 29353816300c79cb5157ed2719cc71285c7b77aa ] |
| |
| The pretimeout register has a default reset value. Hence |
| when a smaller WDT timeout is set which would be lesser than the |
| default pretimeout, the system behaves abnormally, starts |
| triggering the pretimeout interrupt even when the WDT is |
| not enabled, most of the times leading to system crash. |
| Hence an update in the pre-timeout is also required for the |
| default timeout that is being configured. |
| |
| Fixes: fa0f8d51e90d ("watchdog: Add watchdog driver for Intel Keembay Soc") |
| Reviewed-by: Guenter Roeck <linux@roeck-us.net> |
| Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Tested-by: Kris Pan <kris.pan@intel.com> |
| Signed-off-by: Shruthi Sanil <shruthi.sanil@intel.com> |
| Link: https://lore.kernel.org/r/20210517174953.19404-2-shruthi.sanil@intel.com |
| Signed-off-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/watchdog/keembay_wdt.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/drivers/watchdog/keembay_wdt.c b/drivers/watchdog/keembay_wdt.c |
| index 547d3fea33ff..f2f5c9fae29c 100644 |
| --- a/drivers/watchdog/keembay_wdt.c |
| +++ b/drivers/watchdog/keembay_wdt.c |
| @@ -29,6 +29,7 @@ |
| #define WDT_LOAD_MAX U32_MAX |
| #define WDT_LOAD_MIN 1 |
| #define WDT_TIMEOUT 5 |
| +#define WDT_PRETIMEOUT 4 |
| |
| static unsigned int timeout = WDT_TIMEOUT; |
| module_param(timeout, int, 0); |
| @@ -224,11 +225,13 @@ static int keembay_wdt_probe(struct platform_device *pdev) |
| wdt->wdd.min_timeout = WDT_LOAD_MIN; |
| wdt->wdd.max_timeout = WDT_LOAD_MAX / wdt->rate; |
| wdt->wdd.timeout = WDT_TIMEOUT; |
| + wdt->wdd.pretimeout = WDT_PRETIMEOUT; |
| |
| watchdog_set_drvdata(&wdt->wdd, wdt); |
| watchdog_set_nowayout(&wdt->wdd, nowayout); |
| watchdog_init_timeout(&wdt->wdd, timeout, dev); |
| keembay_wdt_set_timeout(&wdt->wdd, wdt->wdd.timeout); |
| + keembay_wdt_set_pretimeout(&wdt->wdd, wdt->wdd.pretimeout); |
| |
| ret = devm_watchdog_register_device(dev, &wdt->wdd); |
| if (ret) |
| -- |
| 2.30.2 |
| |