kernel: add support for max6370 watchdog via GPIO
authorJosef Schlehofer <pepe.schlehofer@gmail.com>
Mon, 5 Sep 2022 12:54:44 +0000 (14:54 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 4 Mar 2023 11:54:38 +0000 (12:54 +0100)
This backports the third version [1], which is awaiting upstream merge. It
adds support for watchdog max6370, which is connected via GPIO. It
is useful primarily for P2020 RDB and Turris 1.x routers, which are
not yet supported.

[1] https://www.spinics.net/lists/linux-watchdog/msg23299.html

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
target/linux/generic/pending-5.10/111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch [new file with mode: 0644]
target/linux/generic/pending-5.15/111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch [new file with mode: 0644]

diff --git a/target/linux/generic/pending-5.10/111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch b/target/linux/generic/pending-5.10/111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch
new file mode 100644 (file)
index 0000000..d2e134a
--- /dev/null
@@ -0,0 +1,75 @@
+From bd1b9f66d5134e518419f4c4dacf1884c1616983 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
+Date: Thu, 28 Apr 2022 11:13:23 +0200
+Subject: [PATCH] watchdog: max63xx_wdt: Add support for specifying WDI logic
+ via GPIO
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+On some boards is WDI logic of max6370 chip connected via GPIO.
+So extend max63xx_wdt driver to allow specifying WDI logic via GPIO.
+
+Signed-off-by: Pali Rohár <pali@kernel.org>
+---
+ drivers/watchdog/max63xx_wdt.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+--- a/drivers/watchdog/max63xx_wdt.c
++++ b/drivers/watchdog/max63xx_wdt.c
+@@ -26,6 +26,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/io.h>
+ #include <linux/slab.h>
++#include <linux/gpio/consumer.h>
+ #define DEFAULT_HEARTBEAT 60
+ #define MAX_HEARTBEAT     60
+@@ -52,6 +53,9 @@ struct max63xx_wdt {
+       void __iomem *base;
+       spinlock_t lock;
++      /* GPIOs */
++      struct gpio_desc *gpio_wdi;
++
+       /* WDI and WSET bits write access routines */
+       void (*ping)(struct max63xx_wdt *wdt);
+       void (*set)(struct max63xx_wdt *wdt, u8 set);
+@@ -157,6 +161,17 @@ static const struct watchdog_info max63x
+       .identity = "max63xx Watchdog",
+ };
++static void max63xx_gpio_ping(struct max63xx_wdt *wdt)
++{
++      spin_lock(&wdt->lock);
++
++      gpiod_set_value(wdt->gpio_wdi, 1);
++      udelay(1);
++      gpiod_set_value(wdt->gpio_wdi, 0);
++
++      spin_unlock(&wdt->lock);
++}
++
+ static void max63xx_mmap_ping(struct max63xx_wdt *wdt)
+ {
+       u8 val;
+@@ -221,10 +236,19 @@ static int max63xx_wdt_probe(struct plat
+               return -EINVAL;
+       }
++      wdt->gpio_wdi = devm_gpiod_get(dev, NULL, GPIOD_FLAGS_BIT_DIR_OUT);
++      if (IS_ERR(wdt->gpio_wdi) && PTR_ERR(wdt->gpio_wdi) != -ENOENT)
++              return dev_err_probe(dev, PTR_ERR(wdt->gpio_wdi),
++                                   "unable to request gpio: %ld\n",
++                                   PTR_ERR(wdt->gpio_wdi));
++
+       err = max63xx_mmap_init(pdev, wdt);
+       if (err)
+               return err;
++      if (!IS_ERR(wdt->gpio_wdi))
++              wdt->ping = max63xx_gpio_ping;
++
+       platform_set_drvdata(pdev, &wdt->wdd);
+       watchdog_set_drvdata(&wdt->wdd, wdt);
diff --git a/target/linux/generic/pending-5.15/111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch b/target/linux/generic/pending-5.15/111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch
new file mode 100644 (file)
index 0000000..d6b1049
--- /dev/null
@@ -0,0 +1,75 @@
+From bd1b9f66d5134e518419f4c4dacf1884c1616983 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
+Date: Thu, 28 Apr 2022 11:13:23 +0200
+Subject: [PATCH] watchdog: max63xx_wdt: Add support for specifying WDI logic
+ via GPIO
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+On some boards is WDI logic of max6370 chip connected via GPIO.
+So extend max63xx_wdt driver to allow specifying WDI logic via GPIO.
+
+Signed-off-by: Pali Rohár <pali@kernel.org>
+---
+ drivers/watchdog/max63xx_wdt.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+--- a/drivers/watchdog/max63xx_wdt.c
++++ b/drivers/watchdog/max63xx_wdt.c
+@@ -27,6 +27,7 @@
+ #include <linux/io.h>
+ #include <linux/slab.h>
+ #include <linux/property.h>
++#include <linux/gpio/consumer.h>
+ #define DEFAULT_HEARTBEAT 60
+ #define MAX_HEARTBEAT     60
+@@ -53,6 +54,9 @@ struct max63xx_wdt {
+       void __iomem *base;
+       spinlock_t lock;
++      /* GPIOs */
++      struct gpio_desc *gpio_wdi;
++
+       /* WDI and WSET bits write access routines */
+       void (*ping)(struct max63xx_wdt *wdt);
+       void (*set)(struct max63xx_wdt *wdt, u8 set);
+@@ -158,6 +162,17 @@ static const struct watchdog_info max63x
+       .identity = "max63xx Watchdog",
+ };
++static void max63xx_gpio_ping(struct max63xx_wdt *wdt)
++{
++      spin_lock(&wdt->lock);
++
++      gpiod_set_value(wdt->gpio_wdi, 1);
++      udelay(1);
++      gpiod_set_value(wdt->gpio_wdi, 0);
++
++      spin_unlock(&wdt->lock);
++}
++
+ static void max63xx_mmap_ping(struct max63xx_wdt *wdt)
+ {
+       u8 val;
+@@ -225,10 +240,19 @@ static int max63xx_wdt_probe(struct plat
+               return -EINVAL;
+       }
++      wdt->gpio_wdi = devm_gpiod_get(dev, NULL, GPIOD_FLAGS_BIT_DIR_OUT);
++      if (IS_ERR(wdt->gpio_wdi) && PTR_ERR(wdt->gpio_wdi) != -ENOENT)
++              return dev_err_probe(dev, PTR_ERR(wdt->gpio_wdi),
++                                   "unable to request gpio: %ld\n",
++                                   PTR_ERR(wdt->gpio_wdi));
++
+       err = max63xx_mmap_init(pdev, wdt);
+       if (err)
+               return err;
++      if (!IS_ERR(wdt->gpio_wdi))
++              wdt->ping = max63xx_gpio_ping;
++
+       platform_set_drvdata(pdev, &wdt->wdd);
+       watchdog_set_drvdata(&wdt->wdd, wdt);