mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-21 06:33:41 +00:00
620bc37c2a
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>
76 lines
2.1 KiB
Diff
76 lines
2.1 KiB
Diff
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);
|
|
|