Lines Matching +full:wdt +full:- +full:gpio
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Driver for watchdog device controlled through GPIO-line
10 #include <linux/gpio/consumer.h>
42 gpiod_set_value_cansleep(priv->gpiod, 1); in gpio_wdt_disable()
44 /* Put GPIO back to tristate */ in gpio_wdt_disable()
45 if (priv->hw_algo == HW_ALGO_TOGGLE) in gpio_wdt_disable()
46 gpiod_direction_input(priv->gpiod); in gpio_wdt_disable()
53 switch (priv->hw_algo) { in gpio_wdt_ping()
56 priv->state = !priv->state; in gpio_wdt_ping()
57 gpiod_set_value_cansleep(priv->gpiod, priv->state); in gpio_wdt_ping()
61 gpiod_set_value_cansleep(priv->gpiod, 1); in gpio_wdt_ping()
63 gpiod_set_value_cansleep(priv->gpiod, 0); in gpio_wdt_ping()
73 priv->state = 0; in gpio_wdt_start()
74 gpiod_direction_output(priv->gpiod, priv->state); in gpio_wdt_start()
76 set_bit(WDOG_HW_RUNNING, &wdd->status); in gpio_wdt_start()
85 if (!priv->always_running) { in gpio_wdt_stop()
88 set_bit(WDOG_HW_RUNNING, &wdd->status); in gpio_wdt_stop()
97 .identity = "GPIO Watchdog",
109 struct device *dev = &pdev->dev; in gpio_wdt_probe()
118 return -ENOMEM; in gpio_wdt_probe()
126 priv->hw_algo = HW_ALGO_TOGGLE; in gpio_wdt_probe()
129 priv->hw_algo = HW_ALGO_LEVEL; in gpio_wdt_probe()
132 return -EINVAL; in gpio_wdt_probe()
135 priv->gpiod = devm_gpiod_get(dev, NULL, gflags); in gpio_wdt_probe()
136 if (IS_ERR(priv->gpiod)) in gpio_wdt_probe()
137 return PTR_ERR(priv->gpiod); in gpio_wdt_probe()
144 return -EINVAL; in gpio_wdt_probe()
146 priv->always_running = device_property_read_bool(dev, "always-running"); in gpio_wdt_probe()
148 watchdog_set_drvdata(&priv->wdd, priv); in gpio_wdt_probe()
150 priv->wdd.info = &gpio_wdt_ident; in gpio_wdt_probe()
151 priv->wdd.ops = &gpio_wdt_ops; in gpio_wdt_probe()
152 priv->wdd.min_timeout = SOFT_TIMEOUT_MIN; in gpio_wdt_probe()
153 priv->wdd.max_hw_heartbeat_ms = hw_margin; in gpio_wdt_probe()
154 priv->wdd.parent = dev; in gpio_wdt_probe()
155 priv->wdd.timeout = SOFT_TIMEOUT_DEF; in gpio_wdt_probe()
157 watchdog_init_timeout(&priv->wdd, 0, dev); in gpio_wdt_probe()
158 watchdog_set_nowayout(&priv->wdd, nowayout); in gpio_wdt_probe()
160 watchdog_stop_on_reboot(&priv->wdd); in gpio_wdt_probe()
162 if (priv->always_running) in gpio_wdt_probe()
163 gpio_wdt_start(&priv->wdd); in gpio_wdt_probe()
165 return devm_watchdog_register_device(dev, &priv->wdd); in gpio_wdt_probe()
169 { .compatible = "linux,wdt-gpio", },
176 .name = "gpio-wdt",
193 MODULE_DESCRIPTION("GPIO Watchdog");