111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. From bd1b9f66d5134e518419f4c4dacf1884c1616983 Mon Sep 17 00:00:00 2001
  2. From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <[email protected]>
  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. On some boards is WDI logic of max6370 chip connected via GPIO.
  10. So extend max63xx_wdt driver to allow specifying WDI logic via GPIO.
  11. Signed-off-by: Pali Rohár <[email protected]>
  12. ---
  13. drivers/watchdog/max63xx_wdt.c | 24 ++++++++++++++++++++++++
  14. 1 file changed, 24 insertions(+)
  15. --- a/drivers/watchdog/max63xx_wdt.c
  16. +++ b/drivers/watchdog/max63xx_wdt.c
  17. @@ -24,6 +24,7 @@
  18. #include <linux/io.h>
  19. #include <linux/slab.h>
  20. #include <linux/property.h>
  21. +#include <linux/gpio/consumer.h>
  22. #define DEFAULT_HEARTBEAT 60
  23. #define MAX_HEARTBEAT 60
  24. @@ -50,6 +51,9 @@ struct max63xx_wdt {
  25. void __iomem *base;
  26. spinlock_t lock;
  27. + /* GPIOs */
  28. + struct gpio_desc *gpio_wdi;
  29. +
  30. /* WDI and WSET bits write access routines */
  31. void (*ping)(struct max63xx_wdt *wdt);
  32. void (*set)(struct max63xx_wdt *wdt, u8 set);
  33. @@ -155,6 +159,17 @@ static const struct watchdog_info max63x
  34. .identity = "max63xx Watchdog",
  35. };
  36. +static void max63xx_gpio_ping(struct max63xx_wdt *wdt)
  37. +{
  38. + spin_lock(&wdt->lock);
  39. +
  40. + gpiod_set_value(wdt->gpio_wdi, 1);
  41. + udelay(1);
  42. + gpiod_set_value(wdt->gpio_wdi, 0);
  43. +
  44. + spin_unlock(&wdt->lock);
  45. +}
  46. +
  47. static void max63xx_mmap_ping(struct max63xx_wdt *wdt)
  48. {
  49. u8 val;
  50. @@ -222,10 +237,19 @@ static int max63xx_wdt_probe(struct plat
  51. return -EINVAL;
  52. }
  53. + wdt->gpio_wdi = devm_gpiod_get(dev, NULL, GPIOD_FLAGS_BIT_DIR_OUT);
  54. + if (IS_ERR(wdt->gpio_wdi) && PTR_ERR(wdt->gpio_wdi) != -ENOENT)
  55. + return dev_err_probe(dev, PTR_ERR(wdt->gpio_wdi),
  56. + "unable to request gpio: %ld\n",
  57. + PTR_ERR(wdt->gpio_wdi));
  58. +
  59. err = max63xx_mmap_init(pdev, wdt);
  60. if (err)
  61. return err;
  62. + if (!IS_ERR(wdt->gpio_wdi))
  63. + wdt->ping = max63xx_gpio_ping;
  64. +
  65. platform_set_drvdata(pdev, &wdt->wdd);
  66. watchdog_set_drvdata(&wdt->wdd, wdt);