Skip to contentSkip to conversation

dt-bindings: watchdog: max63xx: Add GPIO binding

PATCH In review Pali Rohár 2 participants 5 messages Jul 5, 2022 – Jul 12, 2022

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH v3 1/2 dt-bindings: watchdog: max63xx: Add GPIO binding

GPIO is optional and used for WDI logic.

---
Changes in v3:
* Extend description

---
 Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml | 4 ++++
 1 file changed, 4 insertions(+)
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +4 -0
index ab9641e845db..a0cf9e6c371d 100644
@@ -27,6 +27,10 @@ properties:
     description: This is a 1-byte memory-mapped address
     maxItems: 1
 
+  gpios:
+    description: Optional GPIO used for controlling WDI (watchdog input) when WDI bit is not mapped to memory
+    maxItems: 1
+
 required:
   - compatible
   - reg
Signature · 1 line
2.20.1
#1 lore raw

PATCH v3 2/2 watchdog: max63xx_wdt: Add support for specifying WDI logic via GPIO

On some boards is WDI logic of max6370 chip connected via GPIO. So extend max63xx_wdt driver to allow specifying WDI logic via GPIO.

---
Changes in v3:
* Use gpiod_set_value()
Changes in v2:
* Usage of dev_err_probe()
* Fixing assignment of wdt->ping
* Remove clearing of wdt->gpio_wdi
* Move YAML change to separate patch

---
 drivers/watchdog/max63xx_wdt.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)
drivers/watchdog/max63xx_wdt.c +24 -0
index 9e1541cfae0d..4718695837f6 100644
@@ -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 max63xx_wdt_info = {
 	.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 platform_device *pdev)
 		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);
 
Signature · 1 line
2.20.1
maintainer
#2 lore raw
In reply to Pali Rohár
Quoted 15 lines · Pali Rohár

GPIO is optional and used for WDI logic.

---
Changes in v3:
* Extend description

---
 Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml | 4 ++++
 1 file changed, 4 insertions(+)
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +0 -0
index ab9641e845db..a0cf9e6c371d 100644

Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml properties: · line 30

Quoted 4 lines
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +1 -0
@@ -27,6 +27,10 @@ properties:
     description: This is a 1-byte memory-mapped address
     maxItems: 1
 
+  gpios:

As I said before, add a name prefix: wdi-gpios

Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml properties: · line 31

Quoted 1 line
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +1 -0
+    description: Optional GPIO used for controlling WDI (watchdog input) when WDI bit is not mapped to memory

Wrap lines at 80 unless wrapping at 100 provides some benefit.

yamllint is set to 110 because I don't want to fix everyone's line wrap, not because that's the standard.

Quoted 9 lines
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +2 -0
+    maxItems: 1
+
 required:
   - compatible
   - reg
Signature · 1 line
2.20.1
#3 lore raw
Quoted 19 lines · On Wednesday 06 July 2022 09:07:26 Rob Herring wrote:
Quoted 18 lines · Pali Rohár

GPIO is optional and used for WDI logic.

---
Changes in v3:
* Extend description

---
 Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml | 4 ++++
 1 file changed, 4 insertions(+)
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +0 -0
index ab9641e845db..a0cf9e6c371d 100644
@@ -27,6 +27,10 @@ properties:
     description: This is a 1-byte memory-mapped address
     maxItems: 1
 
Quoted 3 lines

Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml properties: · line 30

Quoted 1 line
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +1 -0
+  gpios:

As I said before, add a name prefix: wdi-gpios

So gpio with output direction should be really named that is input?

I really do not understand this kind of thinking and making every device tree description totally illogical and inconsistent with all other.

Quoted 17 lines

Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml properties: · line 31

Quoted 1 line
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +1 -0
+    description: Optional GPIO used for controlling WDI (watchdog input) when WDI bit is not mapped to memory

Wrap lines at 80 unless wrapping at 100 provides some benefit.

yamllint is set to 110 because I don't want to fix everyone's line wrap, not because that's the standard.

Quoted 9 lines
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +2 -0
+    maxItems: 1
+
 required:
   - compatible
   - reg
Signature · 1 line
2.20.1
maintainer
#4 lore raw
Quoted 20 lines · Pali Rohár
Quoted 19 lines · On Wednesday 06 July 2022 09:07:26 Rob Herring wrote:
Quoted 18 lines · Pali Rohár

GPIO is optional and used for WDI logic.

---
Changes in v3:
* Extend description

---
 Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml | 4 ++++
 1 file changed, 4 insertions(+)
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +0 -0
index ab9641e845db..a0cf9e6c371d 100644
@@ -27,6 +27,10 @@ properties:
     description: This is a 1-byte memory-mapped address
     maxItems: 1
 
Quoted 5 lines
Quoted 3 lines

Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml properties: · line 30

Quoted 1 line
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +1 -0
+  gpios:

As I said before, add a name prefix: wdi-gpios

So gpio with output direction should be really named that is input?

Names are based on the pins they connect to, so yes. The flags cell will make it clear it is a GPIO output.

Quoted 2 lines

I really do not understand this kind of thinking and making every device tree description totally illogical and inconsistent with all other.

I don't understand what you mean.

When there is a 2nd GPIO used for this binding, what do we call it? 'gpios' doesn't scale.

Quoted 1 line
Quoted 1 line

Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml properties: · line 31

Quoted 1 line
Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +1 -0
+    description: Optional GPIO used for controlling WDI (watchdog input) when WDI bit is not mapped to memory

Look at it this way, why do I have to find and read the description here to know what 'gpios' is for when instead, it can be self-describing when I look at the datasheet and the DT to see this is the GPIO connection to WDI signal.

Rob