1 // SPDX-License-Identifier: GPL-2.0+
4 #include <dm/device_compat.h>
7 #include <linux/delay.h>
14 struct gpio_wdt_priv {
15 struct gpio_desc gpio;
21 static int gpio_wdt_reset(struct udevice *dev)
23 struct gpio_wdt_priv *priv = dev_get_priv(dev);
25 switch (priv->hw_algo) {
27 /* Toggle output pin */
28 priv->state = !priv->state;
29 dm_gpio_set_value(&priv->gpio, priv->state);
33 dm_gpio_set_value(&priv->gpio, 1);
35 dm_gpio_set_value(&priv->gpio, 0);
41 static int gpio_wdt_start(struct udevice *dev, u64 timeout, ulong flags)
43 struct gpio_wdt_priv *priv = dev_get_priv(dev);
45 if (priv->always_running)
51 static int dm_probe(struct udevice *dev)
53 struct gpio_wdt_priv *priv = dev_get_priv(dev);
55 const char *algo = dev_read_string(dev, "hw_algo");
59 if (!strcmp(algo, "toggle"))
60 priv->hw_algo = HW_ALGO_TOGGLE;
61 else if (!strcmp(algo, "level"))
62 priv->hw_algo = HW_ALGO_LEVEL;
66 priv->always_running = dev_read_bool(dev, "always-running");
67 ret = gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_OUT);
69 dev_err(dev, "Request for wdt gpio failed: %d\n", ret);
73 if (priv->always_running)
74 ret = gpio_wdt_reset(dev);
79 static const struct wdt_ops gpio_wdt_ops = {
80 .start = gpio_wdt_start,
81 .reset = gpio_wdt_reset,
84 static const struct udevice_id gpio_wdt_ids[] = {
85 { .compatible = "linux,wdt-gpio" },
89 U_BOOT_DRIVER(wdt_gpio) = {
92 .of_match = gpio_wdt_ids,
95 .priv_auto = sizeof(struct gpio_wdt_priv),