[PATCH v2 2/2] watchdog: qcom: improve driver with more functionality
Casey Connolly
casey.connolly at linaro.org
Tue Apr 22 14:50:47 CEST 2025
Hi Paul,
Please squash this patch into the first one, otherwise this looks good.
Did you test start/stop/reset?
Kind regards,
On 4/22/25 01:20, Paul Sajna wrote:
> - 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[] = {
>
--
Casey (she/they)
More information about the U-Boot
mailing list