- add the ability to start the watchdog - add the ability to reset the watchdog - remove the automatic disable in the probe function - use log macros for errors
Signed-off-by: Paul Sajna <he...@paulsajna.com> --- drivers/watchdog/qcom-wdt.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c index a7ce31ef811c717fd16700aa7d984a000763a93e..88e5fc7906825ac258393495682a75a5010473b0 100644 --- a/drivers/watchdog/qcom-wdt.c +++ b/drivers/watchdog/qcom-wdt.c @@ -4,12 +4,14 @@ * Copyright (c) Linaro Ltd. 2024 * * Authors: - * Caleb Connolly <caleb.conno...@linaro.org> + * Casey Connolly <casey.conno...@linaro.org> + * Paul Sajna <he...@paulsajna.com> * * Derived from linux/drivers/watchdog/qcom-wdt.c */ #include <dm.h> +#include <dm/device_compat.h> #include <wdt.h> #include <asm/io.h> @@ -50,7 +52,16 @@ static void __iomem *wdt_addr(struct qcom_wdt *wdt, enum wdt_reg reg) int qcom_wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags) { - /* unimplemented */ + struct qcom_wdt *wdt = dev_get_priv(dev); + + writel(0, wdt_addr(wdt, WDT_EN)); + writel(1, wdt_addr(wdt, WDT_RST)); + writel(1, wdt_addr(wdt, WDT_EN)); + writel(1, wdt_addr(wdt, WDT_EN)); + if (readl(wdt_addr(wdt, WDT_EN)) != 1) { + dev_err(dev, "Failed to enable Qualcomm watchdog!\n"); + return -EIO; + } return 0; } @@ -60,29 +71,36 @@ int qcom_wdt_stop(struct udevice *dev) writel(0, wdt_addr(wdt, WDT_EN)); if (readl(wdt_addr(wdt, WDT_EN))) { - printf("Failed to disable Qualcomm watchdog!\n"); + dev_err(dev, "Failed to disable Qualcomm watchdog!\n"); return -EIO; } return 0; } +int qcom_wdt_reset(struct udevice *dev) +{ + struct qcom_wdt *wdt = dev_get_priv(dev); + + writel(1, wdt_addr(wdt, WDT_RST)); + return 0; +} + static int qcom_wdt_probe(struct udevice *dev) { struct qcom_wdt *wdt = dev_get_priv(dev); struct qcom_wdt_match_data *data = (void *)dev_get_driver_data(dev); - int ret; wdt->base = dev_read_addr_ptr(dev); wdt->layout = data->offset; - ret = qcom_wdt_stop(dev); - - return ret; + return 0; } static const struct wdt_ops qcom_wdt_ops = { + .start = qcom_wdt_start, .stop = qcom_wdt_stop, + .reset = qcom_wdt_reset, }; static const struct udevice_id qcom_wdt_ids[] = { -- 2.49.0