[PATCH v2 2/2] watchdog: qcom: improve driver with more functionality

Paul Sajna hello at paulsajna.com
Tue Apr 22 01:20:22 CEST 2025


- 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 <hello at 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.connolly at linaro.org>
+ *   Casey Connolly <casey.connolly at linaro.org>
+ *   Paul Sajna <hello at 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




More information about the U-Boot mailing list