123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- From bd1b9f66d5134e518419f4c4dacf1884c1616983 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <[email protected]>
- 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 <[email protected]>
- ---
- 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);
-
|