mediatek: fix PWM fan on BPi-R4
[openwrt/openwrt.git] / target / linux / generic / pending-6.6 / 111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch
1 From bd1b9f66d5134e518419f4c4dacf1884c1616983 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
3 Date: Thu, 28 Apr 2022 11:13:23 +0200
4 Subject: [PATCH] watchdog: max63xx_wdt: Add support for specifying WDI logic
5 via GPIO
6 MIME-Version: 1.0
7 Content-Type: text/plain; charset=UTF-8
8 Content-Transfer-Encoding: 8bit
9
10 On some boards is WDI logic of max6370 chip connected via GPIO.
11 So extend max63xx_wdt driver to allow specifying WDI logic via GPIO.
12
13 Signed-off-by: Pali Rohár <pali@kernel.org>
14 ---
15 drivers/watchdog/max63xx_wdt.c | 24 ++++++++++++++++++++++++
16 1 file changed, 24 insertions(+)
17
18 --- a/drivers/watchdog/max63xx_wdt.c
19 +++ b/drivers/watchdog/max63xx_wdt.c
20 @@ -24,6 +24,7 @@
21 #include <linux/io.h>
22 #include <linux/slab.h>
23 #include <linux/property.h>
24 +#include <linux/gpio/consumer.h>
25
26 #define DEFAULT_HEARTBEAT 60
27 #define MAX_HEARTBEAT 60
28 @@ -50,6 +51,9 @@ struct max63xx_wdt {
29 void __iomem *base;
30 spinlock_t lock;
31
32 + /* GPIOs */
33 + struct gpio_desc *gpio_wdi;
34 +
35 /* WDI and WSET bits write access routines */
36 void (*ping)(struct max63xx_wdt *wdt);
37 void (*set)(struct max63xx_wdt *wdt, u8 set);
38 @@ -155,6 +159,17 @@ static const struct watchdog_info max63x
39 .identity = "max63xx Watchdog",
40 };
41
42 +static void max63xx_gpio_ping(struct max63xx_wdt *wdt)
43 +{
44 + spin_lock(&wdt->lock);
45 +
46 + gpiod_set_value(wdt->gpio_wdi, 1);
47 + udelay(1);
48 + gpiod_set_value(wdt->gpio_wdi, 0);
49 +
50 + spin_unlock(&wdt->lock);
51 +}
52 +
53 static void max63xx_mmap_ping(struct max63xx_wdt *wdt)
54 {
55 u8 val;
56 @@ -222,10 +237,19 @@ static int max63xx_wdt_probe(struct plat
57 return -EINVAL;
58 }
59
60 + wdt->gpio_wdi = devm_gpiod_get(dev, NULL, GPIOD_FLAGS_BIT_DIR_OUT);
61 + if (IS_ERR(wdt->gpio_wdi) && PTR_ERR(wdt->gpio_wdi) != -ENOENT)
62 + return dev_err_probe(dev, PTR_ERR(wdt->gpio_wdi),
63 + "unable to request gpio: %ld\n",
64 + PTR_ERR(wdt->gpio_wdi));
65 +
66 err = max63xx_mmap_init(pdev, wdt);
67 if (err)
68 return err;
69
70 + if (!IS_ERR(wdt->gpio_wdi))
71 + wdt->ping = max63xx_gpio_ping;
72 +
73 platform_set_drvdata(pdev, &wdt->wdd);
74 watchdog_set_drvdata(&wdt->wdd, wdt);
75