* [PATCH v4 0/2] Add the NXP S32 Watchdog
@ 2025-04-10 8:26 Daniel Lezcano
2025-04-10 8:26 ` [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer Daniel Lezcano
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Daniel Lezcano @ 2025-04-10 8:26 UTC (permalink / raw)
To: wim
Cc: linux, linux-watchdog, linux-kernel, S32, ghennadi.procopciuc,
thomas.fossati, robh, krzk+dt, conor+dt, devicetree,
alexandru-catalin.ionita
The NXP S32 watchdog, referenced in the documentation as the Software
Watchdog Timer is actually a hardware watchdog. The system has one
watchdog per core but an assertation does not directly reset the
system as this behavior relies on a particular setup and another
component which is not part of these changes. However the first
watchdog on the system, tied with the Cortex-M4 #0 is a particular
case where it will reset the system directly. This is enough for the
watchdog purpose on Linux.
The watchdog relies on the default timeout described in the device
tree but if another timeout is needed at boot time, it can be changed
with the module parameter.
If the kernel has to service the watchdog in place of the userspace,
it can specify the 'early-enable' option at boot time.
And finally, if starting the watchdog has no wayback then the option
'nowayout' can be also specified in the boot option.
Changelog:
- v4:
- Update the watchdog timeout when the callback is called (Alexandru-Catalin Ionita)
- Fix the clocks bindings to have all the clocks described (Krzysztof Kozlowski)
- v3:
- Add the clocks for the module and the register (Ghennadi Procopciuc)
- Use the clock name from the driver
- Removed Review-by tag from Krzysztof Kozlowski as the bindings changed
- v2:
- Removed debugfs code as considered pointless for a such simple
driver (Arnd Bergmann)
- Replaced __raw_readl / __raw_writel by readl and writel (Arnd Bergmann)
- Reordered alphabetically the headers (Guenter Roeck)
- Enclosed macro parameter into parenthesis (Guenter Roeck)
- Fixed checkpatch reported errors (Guenter Roeck)
- Clarified a ping on a stopped timer does not affect it (Guenter Roeck)
- Used wdt_is_running() to save an extra IO (Guenter Roeck)
- Fixed a misleading comment about starting the watchdog at boot time (Guenter Roeck)
- Replaced allocation size sizeof(struct ...) by sizeof(*var) (Krzysztof Kozlowski)
- Drop old way of describing the module and use table module device (Krzysztof Kozlowski)
- Replaced additionalProperties by unevaluatedProperties (Rob Herring)
- Removed the DT bindings description as it is obvious (Ghennadi Procopciuc)
- Fixed DT bindings compatible string (Krzysztof Kozlowski)
- v1: initial posting
Daniel Lezcano (2):
dt-bindings: watchdog: Add NXP Software Watchdog Timer
watchdog: Add the Watchdog Timer for the NXP S32 platform
.../bindings/watchdog/nxp,s32g2-swt.yaml | 54 +++
drivers/watchdog/Kconfig | 9 +
drivers/watchdog/Makefile | 1 +
drivers/watchdog/s32g_wdt.c | 315 ++++++++++++++++++
4 files changed, 379 insertions(+)
create mode 100644 Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml
create mode 100644 drivers/watchdog/s32g_wdt.c
--
2.43.0
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer
2025-04-10 8:26 [PATCH v4 0/2] Add the NXP S32 Watchdog Daniel Lezcano
@ 2025-04-10 8:26 ` Daniel Lezcano
2025-04-11 16:27 ` Rob Herring (Arm)
` (2 more replies)
2025-04-10 8:26 ` [PATCH v4 2/2] watchdog: Add the Watchdog Timer for the NXP S32 platform Daniel Lezcano
2025-05-14 15:30 ` [PATCH v4 0/2] Add the NXP S32 Watchdog Daniel Lezcano
2 siblings, 3 replies; 13+ messages in thread
From: Daniel Lezcano @ 2025-04-10 8:26 UTC (permalink / raw)
To: wim
Cc: linux, linux-watchdog, linux-kernel, S32, ghennadi.procopciuc,
thomas.fossati, robh, krzk+dt, conor+dt, devicetree,
alexandru-catalin.ionita
Describe the Software Watchdog Timer available on the S32G platforms.
Cc: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
Cc: Thomas Fossati <thomas.fossati@linaro.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
.../bindings/watchdog/nxp,s32g2-swt.yaml | 54 +++++++++++++++++++
1 file changed, 54 insertions(+)
create mode 100644 Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml
diff --git a/Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml b/Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml
new file mode 100644
index 000000000000..8f168a05b50c
--- /dev/null
+++ b/Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml
@@ -0,0 +1,54 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/watchdog/nxp,s32g2-swt.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: NXP Software Watchdog Timer (SWT)
+
+maintainers:
+ - Daniel Lezcano <daniel.lezcano@kernel.org>
+
+allOf:
+ - $ref: watchdog.yaml#
+
+properties:
+ compatible:
+ oneOf:
+ - const: nxp,s32g2-swt
+ - items:
+ - const: nxp,s32g3-swt
+ - const: nxp,s32g2-swt
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ items:
+ - description: Counter clock
+ - description: Module clock
+ - description: Register clock
+
+ clock-names:
+ items:
+ - const: counter
+ - const: module
+ - const: register
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - clock-names
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ watchdog@40100000 {
+ compatible = "nxp,s32g2-swt";
+ reg = <0x40100000 0x1000>;
+ clocks = <&clks 0x3a>, <&clks 0x3b>, <&clks 0x3c>;
+ clock-names = "counter", "module", "register";
+ timeout-sec = <10>;
+ };
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 2/2] watchdog: Add the Watchdog Timer for the NXP S32 platform
2025-04-10 8:26 [PATCH v4 0/2] Add the NXP S32 Watchdog Daniel Lezcano
2025-04-10 8:26 ` [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer Daniel Lezcano
@ 2025-04-10 8:26 ` Daniel Lezcano
2025-04-12 3:22 ` Guenter Roeck
2025-04-14 9:07 ` Alexandru-Catalin Ionita
2025-05-14 15:30 ` [PATCH v4 0/2] Add the NXP S32 Watchdog Daniel Lezcano
2 siblings, 2 replies; 13+ messages in thread
From: Daniel Lezcano @ 2025-04-10 8:26 UTC (permalink / raw)
To: wim
Cc: linux, linux-watchdog, linux-kernel, S32, ghennadi.procopciuc,
thomas.fossati, robh, krzk+dt, conor+dt, devicetree,
alexandru-catalin.ionita
The S32 platform has several Watchdog Timer available and tied with a
CPU. The SWT0 is the only one which directly asserts the reset line,
other SWT require an external setup to configure the reset behavior
which is not part of this change.
As a side note, in the NXP documentation, the s32g2 and s32g3
reference manuals refer the watchdog as the 'Software Timer Watchdog'
where the name can be misleading as it is actually a hardware
watchdog.
The maximum watchdog timeout value depends on the clock feeding the
SWT counter which is 32bits wide. On the s32g274-rb2, the clock has a
rate of 51MHz which result on 83 seconds maximum timeout.
The timeout can be specified via the device tree with the usual
existing bindings 'timeout-sec' or via the module param timeout.
The watchdog can be loaded with the 'nowayout' option, preventing the
watchdog to be stopped.
The watchdog can be started at boot time with the 'early-enable'
option, thus letting the watchdog framework to service the watchdog
counter.
The watchdog support the magic character to stop when the userspace
releases the device.
Cc: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
Cc: Thomas Fossati <thomas.fossati@linaro.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/watchdog/Kconfig | 9 ++
drivers/watchdog/Makefile | 1 +
drivers/watchdog/s32g_wdt.c | 315 ++++++++++++++++++++++++++++++++++++
3 files changed, 325 insertions(+)
create mode 100644 drivers/watchdog/s32g_wdt.c
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index f81705f8539a..4ab4275ef49f 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -792,6 +792,15 @@ config IMX7ULP_WDT
To compile this driver as a module, choose M here: the
module will be called imx7ulp_wdt.
+config S32G_WDT
+ tristate "S32G Watchdog"
+ depends on ARCH_S32 || COMPILE_TEST
+ select WATCHDOG_CORE
+ help
+ This is the driver for the hardware watchdog on the NXP
+ S32G platforms. If you wish to have watchdog support
+ enabled, say Y, otherwise say N.
+
config DB500_WATCHDOG
tristate "ST-Ericsson DB800 watchdog"
depends on MFD_DB8500_PRCMU
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index 8411626fa162..d0f9826e32c3 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -69,6 +69,7 @@ obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o
obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o
obj-$(CONFIG_IMX_SC_WDT) += imx_sc_wdt.o
obj-$(CONFIG_IMX7ULP_WDT) += imx7ulp_wdt.o
+obj-$(CONFIG_S32G_WDT) += s32g_wdt.o
obj-$(CONFIG_DB500_WATCHDOG) += db8500_wdt.o
obj-$(CONFIG_RETU_WATCHDOG) += retu_wdt.o
obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
diff --git a/drivers/watchdog/s32g_wdt.c b/drivers/watchdog/s32g_wdt.c
new file mode 100644
index 000000000000..ad55063060af
--- /dev/null
+++ b/drivers/watchdog/s32g_wdt.c
@@ -0,0 +1,315 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Watchdog driver for S32G SoC
+ *
+ * Copyright 2017-2019, 2021-2025 NXP.
+ *
+ */
+#include <linux/clk.h>
+#include <linux/debugfs.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/watchdog.h>
+
+#define DRIVER_NAME "s32g-swt"
+
+#define S32G_SWT_CR(__base) ((__base) + 0x00) /* Control Register offset */
+#define S32G_SWT_CR_SM (BIT(9) | BIT(10)) /* -> Service Mode */
+#define S32G_SWT_CR_STP BIT(2) /* -> Stop Mode Control */
+#define S32G_SWT_CR_FRZ BIT(1) /* -> Debug Mode Control */
+#define S32G_SWT_CR_WEN BIT(0) /* -> Watchdog Enable */
+
+#define S32G_SWT_TO(__base) ((__base) + 0x08) /* Timeout Register offset */
+
+#define S32G_SWT_SR(__base) ((__base) + 0x10) /* Service Register offset */
+#define S32G_WDT_SEQ1 0xA602 /* -> service sequence number 1 */
+#define S32G_WDT_SEQ2 0xB480 /* -> service sequence number 2 */
+
+#define S32G_SWT_CO(__base) ((__base) + 0x14) /* Counter output register */
+
+#define S32G_WDT_DEFAULT_TIMEOUT 30
+
+struct s32g_wdt_device {
+ int rate;
+ void __iomem *base;
+ struct watchdog_device wdog;
+};
+
+static bool nowayout = WATCHDOG_NOWAYOUT;
+module_param(nowayout, bool, 0);
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
+ __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+
+static unsigned int timeout_param = S32G_WDT_DEFAULT_TIMEOUT;
+module_param(timeout_param, uint, 0);
+MODULE_PARM_DESC(timeout_param, "Watchdog timeout in seconds (default="
+ __MODULE_STRING(S32G_WDT_DEFAULT_TIMEOUT) ")");
+
+static bool early_enable;
+module_param(early_enable, bool, 0);
+MODULE_PARM_DESC(early_enable,
+ "Watchdog is started on module insertion (default=false)");
+
+static const struct watchdog_info s32g_wdt_info = {
+ .identity = "s32g watchdog",
+ .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE |
+ WDIOC_GETTIMEOUT | WDIOC_GETTIMELEFT,
+};
+
+static struct s32g_wdt_device *wdd_to_s32g_wdt(struct watchdog_device *wdd)
+{
+ return container_of(wdd, struct s32g_wdt_device, wdog);
+}
+
+static unsigned int wdog_sec_to_count(struct s32g_wdt_device *wdev, unsigned int timeout)
+{
+ return wdev->rate * timeout;
+}
+
+static int s32g_wdt_ping(struct watchdog_device *wdog)
+{
+ struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
+
+ writel(S32G_WDT_SEQ1, S32G_SWT_SR(wdev->base));
+ writel(S32G_WDT_SEQ2, S32G_SWT_SR(wdev->base));
+
+ return 0;
+}
+
+static int s32g_wdt_start(struct watchdog_device *wdog)
+{
+ struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
+ unsigned long val;
+
+ val = readl(S32G_SWT_CR(wdev->base));
+
+ val |= S32G_SWT_CR_WEN;
+
+ writel(val, S32G_SWT_CR(wdev->base));
+
+ return 0;
+}
+
+static int s32g_wdt_stop(struct watchdog_device *wdog)
+{
+ struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
+ unsigned long val;
+
+ val = readl(S32G_SWT_CR(wdev->base));
+
+ val &= ~S32G_SWT_CR_WEN;
+
+ writel(val, S32G_SWT_CR(wdev->base));
+
+ return 0;
+}
+
+static int s32g_wdt_set_timeout(struct watchdog_device *wdog, unsigned int timeout)
+{
+ struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
+
+ writel(wdog_sec_to_count(wdev, timeout), S32G_SWT_TO(wdev->base));
+
+ wdog->timeout = timeout;
+
+ /*
+ * Conforming to the documentation, the timeout counter is
+ * loaded when servicing is operated (aka ping) or when the
+ * counter is enabled. In case the watchdog is already started
+ * it must be stopped and started again to update the timeout
+ * register or a ping can be sent to refresh the counter. Here
+ * we choose to send a ping to the watchdog which is harmless
+ * if the watchdog is stopped.
+ */
+ return s32g_wdt_ping(wdog);
+}
+
+static unsigned int s32g_wdt_get_timeleft(struct watchdog_device *wdog)
+{
+ struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
+ unsigned long counter;
+ bool is_running;
+
+ /*
+ * The counter output can be read only if the SWT is
+ * disabled. Given the latency between the internal counter
+ * and the counter output update, there can be very small
+ * difference. However, we can accept this matter of fact
+ * given the resolution is a second based unit for the output.
+ */
+ is_running = watchdog_hw_running(wdog);
+
+ if (is_running)
+ s32g_wdt_stop(wdog);
+
+ counter = readl(S32G_SWT_CO(wdev->base));
+
+ if (is_running)
+ s32g_wdt_start(wdog);
+
+ return counter / wdev->rate;
+}
+
+static const struct watchdog_ops s32g_wdt_ops = {
+ .owner = THIS_MODULE,
+ .start = s32g_wdt_start,
+ .stop = s32g_wdt_stop,
+ .ping = s32g_wdt_ping,
+ .set_timeout = s32g_wdt_set_timeout,
+ .get_timeleft = s32g_wdt_get_timeleft,
+};
+
+static void s32g_wdt_init(struct s32g_wdt_device *wdev)
+{
+ unsigned long val;
+
+ /* Set the watchdog's Time-Out value */
+ val = wdog_sec_to_count(wdev, wdev->wdog.timeout);
+
+ writel(val, S32G_SWT_TO(wdev->base));
+
+ /*
+ * Get the control register content. We are at init time, the
+ * watchdog should not be started.
+ */
+ val = readl(S32G_SWT_CR(wdev->base));
+
+ /*
+ * We want to allow the watchdog timer to be stopped when
+ * device enters debug mode.
+ */
+ val |= S32G_SWT_CR_FRZ;
+
+ /*
+ * However, when the CPU is in WFI or suspend mode, the
+ * watchdog must continue. The documentation refers it as the
+ * stopped mode.
+ */
+ val &= ~S32G_SWT_CR_STP;
+
+ /*
+ * Use Fixed Service Sequence to ping the watchdog which is
+ * 0x00 configuration value for the service mode. It should be
+ * already set because it is the default value but we reset it
+ * in case.
+ */
+ val &= ~S32G_SWT_CR_SM;
+
+ writel(val, S32G_SWT_CR(wdev->base));
+
+ /*
+ * When the 'early_enable' option is set, we start the
+ * watchdog from the kernel.
+ */
+ if (early_enable) {
+ s32g_wdt_start(&wdev->wdog);
+ set_bit(WDOG_HW_RUNNING, &wdev->wdog.status);
+ }
+}
+
+static int s32g_wdt_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct resource *res;
+ struct clk *clk;
+ struct s32g_wdt_device *wdev;
+ struct watchdog_device *wdog;
+ int ret;
+
+ wdev = devm_kzalloc(dev, sizeof(*wdev), GFP_KERNEL);
+ if (!wdev)
+ return -ENOMEM;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ wdev->base = devm_ioremap_resource(dev, res);
+ if (IS_ERR(wdev->base))
+ return dev_err_probe(&pdev->dev, PTR_ERR(wdev->base), "Can not get resource\n");
+
+ clk = devm_clk_get_enabled(dev, "counter");
+ if (IS_ERR(clk))
+ return dev_err_probe(dev, PTR_ERR(clk), "Can't get Watchdog clock\n");
+
+ wdev->rate = clk_get_rate(clk);
+ if (!wdev->rate) {
+ dev_err(dev, "Input clock rate is not valid\n");
+ return -EINVAL;
+ }
+
+ wdog = &wdev->wdog;
+ wdog->info = &s32g_wdt_info;
+ wdog->ops = &s32g_wdt_ops;
+
+ /*
+ * The code converts the timeout into a counter a value, if
+ * the value is less than 0x100, then it is clamped by the SWT
+ * module, so it is safe to specify a zero value as the
+ * minimum timeout.
+ */
+ wdog->min_timeout = 0;
+
+ /*
+ * The counter register is a 32 bits long, so the maximum
+ * counter value is UINT_MAX and the timeout in second is the
+ * value divided by the rate.
+ *
+ * For instance, a rate of 51MHz lead to 84 seconds maximum
+ * timeout.
+ */
+ wdog->max_timeout = UINT_MAX / wdev->rate;
+
+ /*
+ * The module param and the DT 'timeout-sec' property will
+ * override the default value if they are specified.
+ */
+ ret = watchdog_init_timeout(wdog, timeout_param, dev);
+ if (ret)
+ return ret;
+
+ /*
+ * As soon as the watchdog is started, there is no way to stop
+ * it if the 'nowayout' option is set at boot time
+ */
+ watchdog_set_nowayout(wdog, nowayout);
+
+ /*
+ * The devm_ version of the watchdog_register_device()
+ * function will call watchdog_unregister_device() when the
+ * device is removed.
+ */
+ watchdog_stop_on_unregister(wdog);
+
+ s32g_wdt_init(wdev);
+
+ ret = devm_watchdog_register_device(dev, wdog);
+ if (ret)
+ return dev_err_probe(dev, ret, "Cannot register watchdog device\n");
+
+ dev_info(dev, "S32G Watchdog Timer Registered, timeout=%ds, nowayout=%d, early_enable=%d\n",
+ wdog->timeout, nowayout, early_enable);
+
+ return 0;
+}
+
+static const struct of_device_id s32g_wdt_dt_ids[] = {
+ { .compatible = "nxp,s32g2-swt" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, s32g_wdt_dt_ids);
+
+static struct platform_driver s32g_wdt_driver = {
+ .probe = s32g_wdt_probe,
+ .driver = {
+ .name = DRIVER_NAME,
+ .of_match_table = s32g_wdt_dt_ids,
+ },
+};
+
+module_platform_driver(s32g_wdt_driver);
+
+MODULE_AUTHOR("Daniel Lezcano <daniel.lezcano@linaro.org>");
+MODULE_DESCRIPTION("Watchdog driver for S32G SoC");
+MODULE_LICENSE("GPL");
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer
2025-04-10 8:26 ` [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer Daniel Lezcano
@ 2025-04-11 16:27 ` Rob Herring (Arm)
2025-04-12 3:23 ` Guenter Roeck
2025-04-24 14:12 ` Daniel Lezcano
2 siblings, 0 replies; 13+ messages in thread
From: Rob Herring (Arm) @ 2025-04-11 16:27 UTC (permalink / raw)
To: Daniel Lezcano
Cc: linux-watchdog, conor+dt, devicetree, alexandru-catalin.ionita,
linux, krzk+dt, ghennadi.procopciuc, S32, linux-kernel,
thomas.fossati, wim
On Thu, 10 Apr 2025 10:26:13 +0200, Daniel Lezcano wrote:
> Describe the Software Watchdog Timer available on the S32G platforms.
>
> Cc: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
> Cc: Thomas Fossati <thomas.fossati@linaro.org>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> ---
> .../bindings/watchdog/nxp,s32g2-swt.yaml | 54 +++++++++++++++++++
> 1 file changed, 54 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml
>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 2/2] watchdog: Add the Watchdog Timer for the NXP S32 platform
2025-04-10 8:26 ` [PATCH v4 2/2] watchdog: Add the Watchdog Timer for the NXP S32 platform Daniel Lezcano
@ 2025-04-12 3:22 ` Guenter Roeck
2025-04-14 9:07 ` Alexandru-Catalin Ionita
1 sibling, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2025-04-12 3:22 UTC (permalink / raw)
To: Daniel Lezcano, wim
Cc: linux-watchdog, linux-kernel, S32, ghennadi.procopciuc,
thomas.fossati, robh, krzk+dt, conor+dt, devicetree,
alexandru-catalin.ionita
On 4/10/25 01:26, Daniel Lezcano wrote:
> The S32 platform has several Watchdog Timer available and tied with a
> CPU. The SWT0 is the only one which directly asserts the reset line,
> other SWT require an external setup to configure the reset behavior
> which is not part of this change.
>
> As a side note, in the NXP documentation, the s32g2 and s32g3
> reference manuals refer the watchdog as the 'Software Timer Watchdog'
> where the name can be misleading as it is actually a hardware
> watchdog.
>
> The maximum watchdog timeout value depends on the clock feeding the
> SWT counter which is 32bits wide. On the s32g274-rb2, the clock has a
> rate of 51MHz which result on 83 seconds maximum timeout.
>
> The timeout can be specified via the device tree with the usual
> existing bindings 'timeout-sec' or via the module param timeout.
>
> The watchdog can be loaded with the 'nowayout' option, preventing the
> watchdog to be stopped.
>
> The watchdog can be started at boot time with the 'early-enable'
> option, thus letting the watchdog framework to service the watchdog
> counter.
>
> The watchdog support the magic character to stop when the userspace
> releases the device.
>
> Cc: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
> Cc: Thomas Fossati <thomas.fossati@linaro.org>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> ---
> drivers/watchdog/Kconfig | 9 ++
> drivers/watchdog/Makefile | 1 +
> drivers/watchdog/s32g_wdt.c | 315 ++++++++++++++++++++++++++++++++++++
> 3 files changed, 325 insertions(+)
> create mode 100644 drivers/watchdog/s32g_wdt.c
>
> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
> index f81705f8539a..4ab4275ef49f 100644
> --- a/drivers/watchdog/Kconfig
> +++ b/drivers/watchdog/Kconfig
> @@ -792,6 +792,15 @@ config IMX7ULP_WDT
> To compile this driver as a module, choose M here: the
> module will be called imx7ulp_wdt.
>
> +config S32G_WDT
> + tristate "S32G Watchdog"
> + depends on ARCH_S32 || COMPILE_TEST
> + select WATCHDOG_CORE
> + help
> + This is the driver for the hardware watchdog on the NXP
> + S32G platforms. If you wish to have watchdog support
> + enabled, say Y, otherwise say N.
> +
> config DB500_WATCHDOG
> tristate "ST-Ericsson DB800 watchdog"
> depends on MFD_DB8500_PRCMU
> diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
> index 8411626fa162..d0f9826e32c3 100644
> --- a/drivers/watchdog/Makefile
> +++ b/drivers/watchdog/Makefile
> @@ -69,6 +69,7 @@ obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o
> obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o
> obj-$(CONFIG_IMX_SC_WDT) += imx_sc_wdt.o
> obj-$(CONFIG_IMX7ULP_WDT) += imx7ulp_wdt.o
> +obj-$(CONFIG_S32G_WDT) += s32g_wdt.o
> obj-$(CONFIG_DB500_WATCHDOG) += db8500_wdt.o
> obj-$(CONFIG_RETU_WATCHDOG) += retu_wdt.o
> obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
> diff --git a/drivers/watchdog/s32g_wdt.c b/drivers/watchdog/s32g_wdt.c
> new file mode 100644
> index 000000000000..ad55063060af
> --- /dev/null
> +++ b/drivers/watchdog/s32g_wdt.c
> @@ -0,0 +1,315 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Watchdog driver for S32G SoC
> + *
> + * Copyright 2017-2019, 2021-2025 NXP.
> + *
> + */
> +#include <linux/clk.h>
> +#include <linux/debugfs.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/moduleparam.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/watchdog.h>
> +
> +#define DRIVER_NAME "s32g-swt"
> +
> +#define S32G_SWT_CR(__base) ((__base) + 0x00) /* Control Register offset */
> +#define S32G_SWT_CR_SM (BIT(9) | BIT(10)) /* -> Service Mode */
> +#define S32G_SWT_CR_STP BIT(2) /* -> Stop Mode Control */
> +#define S32G_SWT_CR_FRZ BIT(1) /* -> Debug Mode Control */
> +#define S32G_SWT_CR_WEN BIT(0) /* -> Watchdog Enable */
> +
> +#define S32G_SWT_TO(__base) ((__base) + 0x08) /* Timeout Register offset */
> +
> +#define S32G_SWT_SR(__base) ((__base) + 0x10) /* Service Register offset */
> +#define S32G_WDT_SEQ1 0xA602 /* -> service sequence number 1 */
> +#define S32G_WDT_SEQ2 0xB480 /* -> service sequence number 2 */
> +
> +#define S32G_SWT_CO(__base) ((__base) + 0x14) /* Counter output register */
> +
> +#define S32G_WDT_DEFAULT_TIMEOUT 30
> +
> +struct s32g_wdt_device {
> + int rate;
> + void __iomem *base;
> + struct watchdog_device wdog;
> +};
> +
> +static bool nowayout = WATCHDOG_NOWAYOUT;
> +module_param(nowayout, bool, 0);
> +MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
> + __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
> +
> +static unsigned int timeout_param = S32G_WDT_DEFAULT_TIMEOUT;
> +module_param(timeout_param, uint, 0);
> +MODULE_PARM_DESC(timeout_param, "Watchdog timeout in seconds (default="
> + __MODULE_STRING(S32G_WDT_DEFAULT_TIMEOUT) ")");
> +
> +static bool early_enable;
> +module_param(early_enable, bool, 0);
> +MODULE_PARM_DESC(early_enable,
> + "Watchdog is started on module insertion (default=false)");
> +
> +static const struct watchdog_info s32g_wdt_info = {
> + .identity = "s32g watchdog",
> + .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE |
> + WDIOC_GETTIMEOUT | WDIOC_GETTIMELEFT,
> +};
> +
> +static struct s32g_wdt_device *wdd_to_s32g_wdt(struct watchdog_device *wdd)
> +{
> + return container_of(wdd, struct s32g_wdt_device, wdog);
> +}
> +
> +static unsigned int wdog_sec_to_count(struct s32g_wdt_device *wdev, unsigned int timeout)
> +{
> + return wdev->rate * timeout;
> +}
> +
> +static int s32g_wdt_ping(struct watchdog_device *wdog)
> +{
> + struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
> +
> + writel(S32G_WDT_SEQ1, S32G_SWT_SR(wdev->base));
> + writel(S32G_WDT_SEQ2, S32G_SWT_SR(wdev->base));
> +
> + return 0;
> +}
> +
> +static int s32g_wdt_start(struct watchdog_device *wdog)
> +{
> + struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
> + unsigned long val;
> +
> + val = readl(S32G_SWT_CR(wdev->base));
> +
> + val |= S32G_SWT_CR_WEN;
> +
> + writel(val, S32G_SWT_CR(wdev->base));
> +
> + return 0;
> +}
> +
> +static int s32g_wdt_stop(struct watchdog_device *wdog)
> +{
> + struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
> + unsigned long val;
> +
> + val = readl(S32G_SWT_CR(wdev->base));
> +
> + val &= ~S32G_SWT_CR_WEN;
> +
> + writel(val, S32G_SWT_CR(wdev->base));
> +
> + return 0;
> +}
> +
> +static int s32g_wdt_set_timeout(struct watchdog_device *wdog, unsigned int timeout)
> +{
> + struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
> +
> + writel(wdog_sec_to_count(wdev, timeout), S32G_SWT_TO(wdev->base));
> +
> + wdog->timeout = timeout;
> +
> + /*
> + * Conforming to the documentation, the timeout counter is
> + * loaded when servicing is operated (aka ping) or when the
> + * counter is enabled. In case the watchdog is already started
> + * it must be stopped and started again to update the timeout
> + * register or a ping can be sent to refresh the counter. Here
> + * we choose to send a ping to the watchdog which is harmless
> + * if the watchdog is stopped.
> + */
> + return s32g_wdt_ping(wdog);
> +}
> +
> +static unsigned int s32g_wdt_get_timeleft(struct watchdog_device *wdog)
> +{
> + struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
> + unsigned long counter;
> + bool is_running;
> +
> + /*
> + * The counter output can be read only if the SWT is
> + * disabled. Given the latency between the internal counter
> + * and the counter output update, there can be very small
> + * difference. However, we can accept this matter of fact
> + * given the resolution is a second based unit for the output.
> + */
> + is_running = watchdog_hw_running(wdog);
> +
> + if (is_running)
> + s32g_wdt_stop(wdog);
> +
> + counter = readl(S32G_SWT_CO(wdev->base));
> +
> + if (is_running)
> + s32g_wdt_start(wdog);
> +
> + return counter / wdev->rate;
> +}
> +
> +static const struct watchdog_ops s32g_wdt_ops = {
> + .owner = THIS_MODULE,
> + .start = s32g_wdt_start,
> + .stop = s32g_wdt_stop,
> + .ping = s32g_wdt_ping,
> + .set_timeout = s32g_wdt_set_timeout,
> + .get_timeleft = s32g_wdt_get_timeleft,
> +};
> +
> +static void s32g_wdt_init(struct s32g_wdt_device *wdev)
> +{
> + unsigned long val;
> +
> + /* Set the watchdog's Time-Out value */
> + val = wdog_sec_to_count(wdev, wdev->wdog.timeout);
> +
> + writel(val, S32G_SWT_TO(wdev->base));
> +
> + /*
> + * Get the control register content. We are at init time, the
> + * watchdog should not be started.
> + */
> + val = readl(S32G_SWT_CR(wdev->base));
> +
> + /*
> + * We want to allow the watchdog timer to be stopped when
> + * device enters debug mode.
> + */
> + val |= S32G_SWT_CR_FRZ;
> +
> + /*
> + * However, when the CPU is in WFI or suspend mode, the
> + * watchdog must continue. The documentation refers it as the
> + * stopped mode.
> + */
> + val &= ~S32G_SWT_CR_STP;
> +
> + /*
> + * Use Fixed Service Sequence to ping the watchdog which is
> + * 0x00 configuration value for the service mode. It should be
> + * already set because it is the default value but we reset it
> + * in case.
> + */
> + val &= ~S32G_SWT_CR_SM;
> +
> + writel(val, S32G_SWT_CR(wdev->base));
> +
> + /*
> + * When the 'early_enable' option is set, we start the
> + * watchdog from the kernel.
> + */
> + if (early_enable) {
> + s32g_wdt_start(&wdev->wdog);
> + set_bit(WDOG_HW_RUNNING, &wdev->wdog.status);
> + }
> +}
> +
> +static int s32g_wdt_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct resource *res;
> + struct clk *clk;
> + struct s32g_wdt_device *wdev;
> + struct watchdog_device *wdog;
> + int ret;
> +
> + wdev = devm_kzalloc(dev, sizeof(*wdev), GFP_KERNEL);
> + if (!wdev)
> + return -ENOMEM;
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + wdev->base = devm_ioremap_resource(dev, res);
> + if (IS_ERR(wdev->base))
> + return dev_err_probe(&pdev->dev, PTR_ERR(wdev->base), "Can not get resource\n");
> +
> + clk = devm_clk_get_enabled(dev, "counter");
> + if (IS_ERR(clk))
> + return dev_err_probe(dev, PTR_ERR(clk), "Can't get Watchdog clock\n");
> +
> + wdev->rate = clk_get_rate(clk);
> + if (!wdev->rate) {
> + dev_err(dev, "Input clock rate is not valid\n");
> + return -EINVAL;
> + }
> +
> + wdog = &wdev->wdog;
> + wdog->info = &s32g_wdt_info;
> + wdog->ops = &s32g_wdt_ops;
> +
> + /*
> + * The code converts the timeout into a counter a value, if
> + * the value is less than 0x100, then it is clamped by the SWT
> + * module, so it is safe to specify a zero value as the
> + * minimum timeout.
> + */
> + wdog->min_timeout = 0;
> +
> + /*
> + * The counter register is a 32 bits long, so the maximum
> + * counter value is UINT_MAX and the timeout in second is the
> + * value divided by the rate.
> + *
> + * For instance, a rate of 51MHz lead to 84 seconds maximum
> + * timeout.
> + */
> + wdog->max_timeout = UINT_MAX / wdev->rate;
> +
> + /*
> + * The module param and the DT 'timeout-sec' property will
> + * override the default value if they are specified.
> + */
> + ret = watchdog_init_timeout(wdog, timeout_param, dev);
> + if (ret)
> + return ret;
> +
> + /*
> + * As soon as the watchdog is started, there is no way to stop
> + * it if the 'nowayout' option is set at boot time
> + */
> + watchdog_set_nowayout(wdog, nowayout);
> +
> + /*
> + * The devm_ version of the watchdog_register_device()
> + * function will call watchdog_unregister_device() when the
> + * device is removed.
> + */
> + watchdog_stop_on_unregister(wdog);
> +
> + s32g_wdt_init(wdev);
> +
> + ret = devm_watchdog_register_device(dev, wdog);
> + if (ret)
> + return dev_err_probe(dev, ret, "Cannot register watchdog device\n");
> +
> + dev_info(dev, "S32G Watchdog Timer Registered, timeout=%ds, nowayout=%d, early_enable=%d\n",
> + wdog->timeout, nowayout, early_enable);
> +
> + return 0;
> +}
> +
> +static const struct of_device_id s32g_wdt_dt_ids[] = {
> + { .compatible = "nxp,s32g2-swt" },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, s32g_wdt_dt_ids);
> +
> +static struct platform_driver s32g_wdt_driver = {
> + .probe = s32g_wdt_probe,
> + .driver = {
> + .name = DRIVER_NAME,
> + .of_match_table = s32g_wdt_dt_ids,
> + },
> +};
> +
> +module_platform_driver(s32g_wdt_driver);
> +
> +MODULE_AUTHOR("Daniel Lezcano <daniel.lezcano@linaro.org>");
> +MODULE_DESCRIPTION("Watchdog driver for S32G SoC");
> +MODULE_LICENSE("GPL");
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer
2025-04-10 8:26 ` [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer Daniel Lezcano
2025-04-11 16:27 ` Rob Herring (Arm)
@ 2025-04-12 3:23 ` Guenter Roeck
2025-04-24 14:12 ` Daniel Lezcano
2 siblings, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2025-04-12 3:23 UTC (permalink / raw)
To: Daniel Lezcano, wim
Cc: linux-watchdog, linux-kernel, S32, ghennadi.procopciuc,
thomas.fossati, robh, krzk+dt, conor+dt, devicetree,
alexandru-catalin.ionita
On 4/10/25 01:26, Daniel Lezcano wrote:
> Describe the Software Watchdog Timer available on the S32G platforms.
>
> Cc: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
> Cc: Thomas Fossati <thomas.fossati@linaro.org>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> ---
> .../bindings/watchdog/nxp,s32g2-swt.yaml | 54 +++++++++++++++++++
> 1 file changed, 54 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml
>
> diff --git a/Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml b/Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml
> new file mode 100644
> index 000000000000..8f168a05b50c
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml
> @@ -0,0 +1,54 @@
> +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/watchdog/nxp,s32g2-swt.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: NXP Software Watchdog Timer (SWT)
> +
> +maintainers:
> + - Daniel Lezcano <daniel.lezcano@kernel.org>
> +
> +allOf:
> + - $ref: watchdog.yaml#
> +
> +properties:
> + compatible:
> + oneOf:
> + - const: nxp,s32g2-swt
> + - items:
> + - const: nxp,s32g3-swt
> + - const: nxp,s32g2-swt
> +
> + reg:
> + maxItems: 1
> +
> + clocks:
> + items:
> + - description: Counter clock
> + - description: Module clock
> + - description: Register clock
> +
> + clock-names:
> + items:
> + - const: counter
> + - const: module
> + - const: register
> +
> +required:
> + - compatible
> + - reg
> + - clocks
> + - clock-names
> +
> +unevaluatedProperties: false
> +
> +examples:
> + - |
> + watchdog@40100000 {
> + compatible = "nxp,s32g2-swt";
> + reg = <0x40100000 0x1000>;
> + clocks = <&clks 0x3a>, <&clks 0x3b>, <&clks 0x3c>;
> + clock-names = "counter", "module", "register";
> + timeout-sec = <10>;
> + };
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 2/2] watchdog: Add the Watchdog Timer for the NXP S32 platform
2025-04-10 8:26 ` [PATCH v4 2/2] watchdog: Add the Watchdog Timer for the NXP S32 platform Daniel Lezcano
2025-04-12 3:22 ` Guenter Roeck
@ 2025-04-14 9:07 ` Alexandru-Catalin Ionita
1 sibling, 0 replies; 13+ messages in thread
From: Alexandru-Catalin Ionita @ 2025-04-14 9:07 UTC (permalink / raw)
To: Daniel Lezcano, wim
Cc: linux, linux-watchdog, linux-kernel, S32, ghennadi.procopciuc,
thomas.fossati, robh, krzk+dt, conor+dt, devicetree
On 10-Apr-25 11:26 AM, Daniel Lezcano wrote:
> The S32 platform has several Watchdog Timer available and tied with a
> CPU. The SWT0 is the only one which directly asserts the reset line,
> other SWT require an external setup to configure the reset behavior
> which is not part of this change.
>
> As a side note, in the NXP documentation, the s32g2 and s32g3
> reference manuals refer the watchdog as the 'Software Timer Watchdog'
> where the name can be misleading as it is actually a hardware
> watchdog.
>
> The maximum watchdog timeout value depends on the clock feeding the
> SWT counter which is 32bits wide. On the s32g274-rb2, the clock has a
> rate of 51MHz which result on 83 seconds maximum timeout.
>
> The timeout can be specified via the device tree with the usual
> existing bindings 'timeout-sec' or via the module param timeout.
>
> The watchdog can be loaded with the 'nowayout' option, preventing the
> watchdog to be stopped.
>
> The watchdog can be started at boot time with the 'early-enable'
> option, thus letting the watchdog framework to service the watchdog
> counter.
>
> The watchdog support the magic character to stop when the userspace
> releases the device.
>
> Cc: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
> Cc: Thomas Fossati <thomas.fossati@linaro.org>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Tested-by: Alexandru-Catalin Ionita <alexandru-catalin.ionita@nxp.com>
> ---
> drivers/watchdog/Kconfig | 9 ++
> drivers/watchdog/Makefile | 1 +
> drivers/watchdog/s32g_wdt.c | 315 ++++++++++++++++++++++++++++++++++++
> 3 files changed, 325 insertions(+)
> create mode 100644 drivers/watchdog/s32g_wdt.c
>
> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
> index f81705f8539a..4ab4275ef49f 100644
> --- a/drivers/watchdog/Kconfig
> +++ b/drivers/watchdog/Kconfig
> @@ -792,6 +792,15 @@ config IMX7ULP_WDT
> To compile this driver as a module, choose M here: the
> module will be called imx7ulp_wdt.
>
> +config S32G_WDT
> + tristate "S32G Watchdog"
> + depends on ARCH_S32 || COMPILE_TEST
> + select WATCHDOG_CORE
> + help
> + This is the driver for the hardware watchdog on the NXP
> + S32G platforms. If you wish to have watchdog support
> + enabled, say Y, otherwise say N.
> +
> config DB500_WATCHDOG
> tristate "ST-Ericsson DB800 watchdog"
> depends on MFD_DB8500_PRCMU
> diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
> index 8411626fa162..d0f9826e32c3 100644
> --- a/drivers/watchdog/Makefile
> +++ b/drivers/watchdog/Makefile
> @@ -69,6 +69,7 @@ obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o
> obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o
> obj-$(CONFIG_IMX_SC_WDT) += imx_sc_wdt.o
> obj-$(CONFIG_IMX7ULP_WDT) += imx7ulp_wdt.o
> +obj-$(CONFIG_S32G_WDT) += s32g_wdt.o
> obj-$(CONFIG_DB500_WATCHDOG) += db8500_wdt.o
> obj-$(CONFIG_RETU_WATCHDOG) += retu_wdt.o
> obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
> diff --git a/drivers/watchdog/s32g_wdt.c b/drivers/watchdog/s32g_wdt.c
> new file mode 100644
> index 000000000000..ad55063060af
> --- /dev/null
> +++ b/drivers/watchdog/s32g_wdt.c
> @@ -0,0 +1,315 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Watchdog driver for S32G SoC
> + *
> + * Copyright 2017-2019, 2021-2025 NXP.
> + *
> + */
> +#include <linux/clk.h>
> +#include <linux/debugfs.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/moduleparam.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/watchdog.h>
> +
> +#define DRIVER_NAME "s32g-swt"
> +
> +#define S32G_SWT_CR(__base) ((__base) + 0x00) /* Control Register offset */
> +#define S32G_SWT_CR_SM (BIT(9) | BIT(10)) /* -> Service Mode */
> +#define S32G_SWT_CR_STP BIT(2) /* -> Stop Mode Control */
> +#define S32G_SWT_CR_FRZ BIT(1) /* -> Debug Mode Control */
> +#define S32G_SWT_CR_WEN BIT(0) /* -> Watchdog Enable */
> +
> +#define S32G_SWT_TO(__base) ((__base) + 0x08) /* Timeout Register offset */
> +
> +#define S32G_SWT_SR(__base) ((__base) + 0x10) /* Service Register offset */
> +#define S32G_WDT_SEQ1 0xA602 /* -> service sequence number 1 */
> +#define S32G_WDT_SEQ2 0xB480 /* -> service sequence number 2 */
> +
> +#define S32G_SWT_CO(__base) ((__base) + 0x14) /* Counter output register */
> +
> +#define S32G_WDT_DEFAULT_TIMEOUT 30
> +
> +struct s32g_wdt_device {
> + int rate;
> + void __iomem *base;
> + struct watchdog_device wdog;
> +};
> +
> +static bool nowayout = WATCHDOG_NOWAYOUT;
> +module_param(nowayout, bool, 0);
> +MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
> + __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
> +
> +static unsigned int timeout_param = S32G_WDT_DEFAULT_TIMEOUT;
> +module_param(timeout_param, uint, 0);
> +MODULE_PARM_DESC(timeout_param, "Watchdog timeout in seconds (default="
> + __MODULE_STRING(S32G_WDT_DEFAULT_TIMEOUT) ")");
> +
> +static bool early_enable;
> +module_param(early_enable, bool, 0);
> +MODULE_PARM_DESC(early_enable,
> + "Watchdog is started on module insertion (default=false)");
> +
> +static const struct watchdog_info s32g_wdt_info = {
> + .identity = "s32g watchdog",
> + .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE |
> + WDIOC_GETTIMEOUT | WDIOC_GETTIMELEFT,
> +};
> +
> +static struct s32g_wdt_device *wdd_to_s32g_wdt(struct watchdog_device *wdd)
> +{
> + return container_of(wdd, struct s32g_wdt_device, wdog);
> +}
> +
> +static unsigned int wdog_sec_to_count(struct s32g_wdt_device *wdev, unsigned int timeout)
> +{
> + return wdev->rate * timeout;
> +}
> +
> +static int s32g_wdt_ping(struct watchdog_device *wdog)
> +{
> + struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
> +
> + writel(S32G_WDT_SEQ1, S32G_SWT_SR(wdev->base));
> + writel(S32G_WDT_SEQ2, S32G_SWT_SR(wdev->base));
> +
> + return 0;
> +}
> +
> +static int s32g_wdt_start(struct watchdog_device *wdog)
> +{
> + struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
> + unsigned long val;
> +
> + val = readl(S32G_SWT_CR(wdev->base));
> +
> + val |= S32G_SWT_CR_WEN;
> +
> + writel(val, S32G_SWT_CR(wdev->base));
> +
> + return 0;
> +}
> +
> +static int s32g_wdt_stop(struct watchdog_device *wdog)
> +{
> + struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
> + unsigned long val;
> +
> + val = readl(S32G_SWT_CR(wdev->base));
> +
> + val &= ~S32G_SWT_CR_WEN;
> +
> + writel(val, S32G_SWT_CR(wdev->base));
> +
> + return 0;
> +}
> +
> +static int s32g_wdt_set_timeout(struct watchdog_device *wdog, unsigned int timeout)
> +{
> + struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
> +
> + writel(wdog_sec_to_count(wdev, timeout), S32G_SWT_TO(wdev->base));
> +
> + wdog->timeout = timeout;
> +
> + /*
> + * Conforming to the documentation, the timeout counter is
> + * loaded when servicing is operated (aka ping) or when the
> + * counter is enabled. In case the watchdog is already started
> + * it must be stopped and started again to update the timeout
> + * register or a ping can be sent to refresh the counter. Here
> + * we choose to send a ping to the watchdog which is harmless
> + * if the watchdog is stopped.
> + */
> + return s32g_wdt_ping(wdog);
> +}
> +
> +static unsigned int s32g_wdt_get_timeleft(struct watchdog_device *wdog)
> +{
> + struct s32g_wdt_device *wdev = wdd_to_s32g_wdt(wdog);
> + unsigned long counter;
> + bool is_running;
> +
> + /*
> + * The counter output can be read only if the SWT is
> + * disabled. Given the latency between the internal counter
> + * and the counter output update, there can be very small
> + * difference. However, we can accept this matter of fact
> + * given the resolution is a second based unit for the output.
> + */
> + is_running = watchdog_hw_running(wdog);
> +
> + if (is_running)
> + s32g_wdt_stop(wdog);
> +
> + counter = readl(S32G_SWT_CO(wdev->base));
> +
> + if (is_running)
> + s32g_wdt_start(wdog);
> +
> + return counter / wdev->rate;
> +}
> +
> +static const struct watchdog_ops s32g_wdt_ops = {
> + .owner = THIS_MODULE,
> + .start = s32g_wdt_start,
> + .stop = s32g_wdt_stop,
> + .ping = s32g_wdt_ping,
> + .set_timeout = s32g_wdt_set_timeout,
> + .get_timeleft = s32g_wdt_get_timeleft,
> +};
> +
> +static void s32g_wdt_init(struct s32g_wdt_device *wdev)
> +{
> + unsigned long val;
> +
> + /* Set the watchdog's Time-Out value */
> + val = wdog_sec_to_count(wdev, wdev->wdog.timeout);
> +
> + writel(val, S32G_SWT_TO(wdev->base));
> +
> + /*
> + * Get the control register content. We are at init time, the
> + * watchdog should not be started.
> + */
> + val = readl(S32G_SWT_CR(wdev->base));
> +
> + /*
> + * We want to allow the watchdog timer to be stopped when
> + * device enters debug mode.
> + */
> + val |= S32G_SWT_CR_FRZ;
> +
> + /*
> + * However, when the CPU is in WFI or suspend mode, the
> + * watchdog must continue. The documentation refers it as the
> + * stopped mode.
> + */
> + val &= ~S32G_SWT_CR_STP;
> +
> + /*
> + * Use Fixed Service Sequence to ping the watchdog which is
> + * 0x00 configuration value for the service mode. It should be
> + * already set because it is the default value but we reset it
> + * in case.
> + */
> + val &= ~S32G_SWT_CR_SM;
> +
> + writel(val, S32G_SWT_CR(wdev->base));
> +
> + /*
> + * When the 'early_enable' option is set, we start the
> + * watchdog from the kernel.
> + */
> + if (early_enable) {
> + s32g_wdt_start(&wdev->wdog);
> + set_bit(WDOG_HW_RUNNING, &wdev->wdog.status);
> + }
> +}
> +
> +static int s32g_wdt_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct resource *res;
> + struct clk *clk;
> + struct s32g_wdt_device *wdev;
> + struct watchdog_device *wdog;
> + int ret;
> +
> + wdev = devm_kzalloc(dev, sizeof(*wdev), GFP_KERNEL);
> + if (!wdev)
> + return -ENOMEM;
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + wdev->base = devm_ioremap_resource(dev, res);
> + if (IS_ERR(wdev->base))
> + return dev_err_probe(&pdev->dev, PTR_ERR(wdev->base), "Can not get resource\n");
> +
> + clk = devm_clk_get_enabled(dev, "counter");
> + if (IS_ERR(clk))
> + return dev_err_probe(dev, PTR_ERR(clk), "Can't get Watchdog clock\n");
> +
> + wdev->rate = clk_get_rate(clk);
> + if (!wdev->rate) {
> + dev_err(dev, "Input clock rate is not valid\n");
> + return -EINVAL;
> + }
> +
> + wdog = &wdev->wdog;
> + wdog->info = &s32g_wdt_info;
> + wdog->ops = &s32g_wdt_ops;
> +
> + /*
> + * The code converts the timeout into a counter a value, if
> + * the value is less than 0x100, then it is clamped by the SWT
> + * module, so it is safe to specify a zero value as the
> + * minimum timeout.
> + */
> + wdog->min_timeout = 0;
> +
> + /*
> + * The counter register is a 32 bits long, so the maximum
> + * counter value is UINT_MAX and the timeout in second is the
> + * value divided by the rate.
> + *
> + * For instance, a rate of 51MHz lead to 84 seconds maximum
> + * timeout.
> + */
> + wdog->max_timeout = UINT_MAX / wdev->rate;
> +
> + /*
> + * The module param and the DT 'timeout-sec' property will
> + * override the default value if they are specified.
> + */
> + ret = watchdog_init_timeout(wdog, timeout_param, dev);
> + if (ret)
> + return ret;
> +
> + /*
> + * As soon as the watchdog is started, there is no way to stop
> + * it if the 'nowayout' option is set at boot time
> + */
> + watchdog_set_nowayout(wdog, nowayout);
> +
> + /*
> + * The devm_ version of the watchdog_register_device()
> + * function will call watchdog_unregister_device() when the
> + * device is removed.
> + */
> + watchdog_stop_on_unregister(wdog);
> +
> + s32g_wdt_init(wdev);
> +
> + ret = devm_watchdog_register_device(dev, wdog);
> + if (ret)
> + return dev_err_probe(dev, ret, "Cannot register watchdog device\n");
> +
> + dev_info(dev, "S32G Watchdog Timer Registered, timeout=%ds, nowayout=%d, early_enable=%d\n",
> + wdog->timeout, nowayout, early_enable);
> +
> + return 0;
> +}
> +
> +static const struct of_device_id s32g_wdt_dt_ids[] = {
> + { .compatible = "nxp,s32g2-swt" },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, s32g_wdt_dt_ids);
> +
> +static struct platform_driver s32g_wdt_driver = {
> + .probe = s32g_wdt_probe,
> + .driver = {
> + .name = DRIVER_NAME,
> + .of_match_table = s32g_wdt_dt_ids,
> + },
> +};
> +
> +module_platform_driver(s32g_wdt_driver);
> +
> +MODULE_AUTHOR("Daniel Lezcano <daniel.lezcano@linaro.org>");
> +MODULE_DESCRIPTION("Watchdog driver for S32G SoC");
> +MODULE_LICENSE("GPL");
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer
2025-04-10 8:26 ` [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer Daniel Lezcano
2025-04-11 16:27 ` Rob Herring (Arm)
2025-04-12 3:23 ` Guenter Roeck
@ 2025-04-24 14:12 ` Daniel Lezcano
2 siblings, 0 replies; 13+ messages in thread
From: Daniel Lezcano @ 2025-04-24 14:12 UTC (permalink / raw)
To: wim
Cc: linux, linux-watchdog, linux-kernel, S32, ghennadi.procopciuc,
thomas.fossati, robh, krzk+dt, conor+dt, devicetree,
alexandru-catalin.ionita
Hi Wim,
On 10/04/2025 10:26, Daniel Lezcano wrote:
> Describe the Software Watchdog Timer available on the S32G platforms.
>
> Cc: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
> Cc: Thomas Fossati <thomas.fossati@linaro.org>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> ---
I do believe all the comments have been taken into account, the driver
has been reviewed and tested.
Is it possible to merge those changes in order to have them available in
linux-next ?
Thanks
-- Daniel
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/2] Add the NXP S32 Watchdog
2025-04-10 8:26 [PATCH v4 0/2] Add the NXP S32 Watchdog Daniel Lezcano
2025-04-10 8:26 ` [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer Daniel Lezcano
2025-04-10 8:26 ` [PATCH v4 2/2] watchdog: Add the Watchdog Timer for the NXP S32 platform Daniel Lezcano
@ 2025-05-14 15:30 ` Daniel Lezcano
2025-05-14 18:09 ` Guenter Roeck
2 siblings, 1 reply; 13+ messages in thread
From: Daniel Lezcano @ 2025-05-14 15:30 UTC (permalink / raw)
To: wim
Cc: linux, linux-watchdog, linux-kernel, S32, ghennadi.procopciuc,
thomas.fossati, robh, krzk+dt, conor+dt, devicetree,
alexandru-catalin.ionita
On 4/10/25 10:26, Daniel Lezcano wrote:
> The NXP S32 watchdog, referenced in the documentation as the Software
> Watchdog Timer is actually a hardware watchdog. The system has one
> watchdog per core but an assertation does not directly reset the
> system as this behavior relies on a particular setup and another
> component which is not part of these changes. However the first
> watchdog on the system, tied with the Cortex-M4 #0 is a particular
> case where it will reset the system directly. This is enough for the
> watchdog purpose on Linux.
>
> The watchdog relies on the default timeout described in the device
> tree but if another timeout is needed at boot time, it can be changed
> with the module parameter.
>
> If the kernel has to service the watchdog in place of the userspace,
> it can specify the 'early-enable' option at boot time.
>
> And finally, if starting the watchdog has no wayback then the option
> 'nowayout' can be also specified in the boot option.
>
> Changelog:
>
> - v4:
> - Update the watchdog timeout when the callback is called (Alexandru-Catalin Ionita)
> - Fix the clocks bindings to have all the clocks described (Krzysztof Kozlowski)
>
> - v3:
> - Add the clocks for the module and the register (Ghennadi Procopciuc)
> - Use the clock name from the driver
> - Removed Review-by tag from Krzysztof Kozlowski as the bindings changed
>
> - v2:
> - Removed debugfs code as considered pointless for a such simple
> driver (Arnd Bergmann)
> - Replaced __raw_readl / __raw_writel by readl and writel (Arnd Bergmann)
> - Reordered alphabetically the headers (Guenter Roeck)
> - Enclosed macro parameter into parenthesis (Guenter Roeck)
> - Fixed checkpatch reported errors (Guenter Roeck)
> - Clarified a ping on a stopped timer does not affect it (Guenter Roeck)
> - Used wdt_is_running() to save an extra IO (Guenter Roeck)
> - Fixed a misleading comment about starting the watchdog at boot time (Guenter Roeck)
> - Replaced allocation size sizeof(struct ...) by sizeof(*var) (Krzysztof Kozlowski)
> - Drop old way of describing the module and use table module device (Krzysztof Kozlowski)
> - Replaced additionalProperties by unevaluatedProperties (Rob Herring)
> - Removed the DT bindings description as it is obvious (Ghennadi Procopciuc)
> - Fixed DT bindings compatible string (Krzysztof Kozlowski)
>
> - v1: initial posting
>
> Daniel Lezcano (2):
> dt-bindings: watchdog: Add NXP Software Watchdog Timer
> watchdog: Add the Watchdog Timer for the NXP S32 platform
>
> .../bindings/watchdog/nxp,s32g2-swt.yaml | 54 +++
> drivers/watchdog/Kconfig | 9 +
> drivers/watchdog/Makefile | 1 +
> drivers/watchdog/s32g_wdt.c | 315 ++++++++++++++++++
> 4 files changed, 379 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml
> create mode 100644 drivers/watchdog/s32g_wdt.c
Hi,
Gentle ping, we are close to the merge window.
Thanks!
-- Daniel
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/2] Add the NXP S32 Watchdog
2025-05-14 15:30 ` [PATCH v4 0/2] Add the NXP S32 Watchdog Daniel Lezcano
@ 2025-05-14 18:09 ` Guenter Roeck
2025-05-28 13:17 ` Daniel Lezcano
0 siblings, 1 reply; 13+ messages in thread
From: Guenter Roeck @ 2025-05-14 18:09 UTC (permalink / raw)
To: Daniel Lezcano, wim
Cc: linux-watchdog, linux-kernel, S32, ghennadi.procopciuc,
thomas.fossati, robh, krzk+dt, conor+dt, devicetree,
alexandru-catalin.ionita
On 5/14/25 08:30, Daniel Lezcano wrote:
> On 4/10/25 10:26, Daniel Lezcano wrote:
>> The NXP S32 watchdog, referenced in the documentation as the Software
>> Watchdog Timer is actually a hardware watchdog. The system has one
>> watchdog per core but an assertation does not directly reset the
>> system as this behavior relies on a particular setup and another
>> component which is not part of these changes. However the first
>> watchdog on the system, tied with the Cortex-M4 #0 is a particular
>> case where it will reset the system directly. This is enough for the
>> watchdog purpose on Linux.
>>
>> The watchdog relies on the default timeout described in the device
>> tree but if another timeout is needed at boot time, it can be changed
>> with the module parameter.
>>
>> If the kernel has to service the watchdog in place of the userspace,
>> it can specify the 'early-enable' option at boot time.
>>
>> And finally, if starting the watchdog has no wayback then the option
>> 'nowayout' can be also specified in the boot option.
>>
>> Changelog:
>>
>> - v4:
>> - Update the watchdog timeout when the callback is called (Alexandru-Catalin Ionita)
>> - Fix the clocks bindings to have all the clocks described (Krzysztof Kozlowski)
>>
>> - v3:
>> - Add the clocks for the module and the register (Ghennadi Procopciuc)
>> - Use the clock name from the driver
>> - Removed Review-by tag from Krzysztof Kozlowski as the bindings changed
>>
>> - v2:
>> - Removed debugfs code as considered pointless for a such simple
>> driver (Arnd Bergmann)
>> - Replaced __raw_readl / __raw_writel by readl and writel (Arnd Bergmann)
>> - Reordered alphabetically the headers (Guenter Roeck)
>> - Enclosed macro parameter into parenthesis (Guenter Roeck)
>> - Fixed checkpatch reported errors (Guenter Roeck)
>> - Clarified a ping on a stopped timer does not affect it (Guenter Roeck)
>> - Used wdt_is_running() to save an extra IO (Guenter Roeck)
>> - Fixed a misleading comment about starting the watchdog at boot time (Guenter Roeck)
>> - Replaced allocation size sizeof(struct ...) by sizeof(*var) (Krzysztof Kozlowski)
>> - Drop old way of describing the module and use table module device (Krzysztof Kozlowski)
>> - Replaced additionalProperties by unevaluatedProperties (Rob Herring)
>> - Removed the DT bindings description as it is obvious (Ghennadi Procopciuc)
>> - Fixed DT bindings compatible string (Krzysztof Kozlowski)
>>
>> - v1: initial posting
>>
>> Daniel Lezcano (2):
>> dt-bindings: watchdog: Add NXP Software Watchdog Timer
>> watchdog: Add the Watchdog Timer for the NXP S32 platform
>>
>> .../bindings/watchdog/nxp,s32g2-swt.yaml | 54 +++
>> drivers/watchdog/Kconfig | 9 +
>> drivers/watchdog/Makefile | 1 +
>> drivers/watchdog/s32g_wdt.c | 315 ++++++++++++++++++
>> 4 files changed, 379 insertions(+)
>> create mode 100644 Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml
>> create mode 100644 drivers/watchdog/s32g_wdt.c
>
> Hi,
>
> Gentle ping, we are close to the merge window.
>
AFAICS the patches do have Reviewed-by: tags, so this is just waiting for Wim
to pick it up.
Guenter
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/2] Add the NXP S32 Watchdog
2025-05-14 18:09 ` Guenter Roeck
@ 2025-05-28 13:17 ` Daniel Lezcano
2025-05-28 19:24 ` Wim Van Sebroeck
0 siblings, 1 reply; 13+ messages in thread
From: Daniel Lezcano @ 2025-05-28 13:17 UTC (permalink / raw)
To: Guenter Roeck, wim
Cc: linux-watchdog, linux-kernel, S32, ghennadi.procopciuc,
thomas.fossati, robh, krzk+dt, conor+dt, devicetree,
alexandru-catalin.ionita
Hi Guenter, Wim,
On 14/05/2025 20:09, Guenter Roeck wrote:
[ ... ]
> AFAICS the patches do have Reviewed-by: tags, so this is just waiting
> for Wim
> to pick it up.
I fetched the watchdog tree and saw it was updated from May 23th but I
don't see this watchdog series.
Is it possible to give a status about it ?
Thanks
-- Daniel
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/2] Add the NXP S32 Watchdog
2025-05-28 13:17 ` Daniel Lezcano
@ 2025-05-28 19:24 ` Wim Van Sebroeck
2025-05-29 17:56 ` Daniel Lezcano
0 siblings, 1 reply; 13+ messages in thread
From: Wim Van Sebroeck @ 2025-05-28 19:24 UTC (permalink / raw)
To: Daniel Lezcano
Cc: Guenter Roeck, wim, linux-watchdog, linux-kernel, S32,
ghennadi.procopciuc, thomas.fossati, robh, krzk+dt, conor+dt,
devicetree, alexandru-catalin.ionita
Hi Daniel,
> Hi Guenter, Wim,
>
> On 14/05/2025 20:09, Guenter Roeck wrote:
>
> [ ... ]
>
> >AFAICS the patches do have Reviewed-by: tags, so this is just
> >waiting for Wim
> >to pick it up.
>
> I fetched the watchdog tree and saw it was updated from May 23th but
> I don't see this watchdog series.
>
> Is it possible to give a status about it ?
commit bd3f54ec559b554671e5a683e05794abe3a609df
Author: Daniel Lezcano <daniel.lezcano@linaro.org>
Date: Thu Apr 10 10:26:14 2025 +0200
watchdog: Add the Watchdog Timer for the NXP S32 platform
It's in linux-watchdog-next since the 24th.
It will be sent to Linus probably this weekend.
Kind regards,
Wim.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/2] Add the NXP S32 Watchdog
2025-05-28 19:24 ` Wim Van Sebroeck
@ 2025-05-29 17:56 ` Daniel Lezcano
0 siblings, 0 replies; 13+ messages in thread
From: Daniel Lezcano @ 2025-05-29 17:56 UTC (permalink / raw)
To: Wim Van Sebroeck
Cc: Guenter Roeck, linux-watchdog, linux-kernel, S32,
ghennadi.procopciuc, thomas.fossati, robh, krzk+dt, conor+dt,
devicetree, alexandru-catalin.ionita
Hi Wim,
thanks for the update
-- Daniel
On 5/28/25 21:24, Wim Van Sebroeck wrote:
> Hi Daniel,
>
>> Hi Guenter, Wim,
>>
>> On 14/05/2025 20:09, Guenter Roeck wrote:
>>
>> [ ... ]
>>
>>> AFAICS the patches do have Reviewed-by: tags, so this is just
>>> waiting for Wim
>>> to pick it up.
>>
>> I fetched the watchdog tree and saw it was updated from May 23th but
>> I don't see this watchdog series.
>>
>> Is it possible to give a status about it ?
>
> commit bd3f54ec559b554671e5a683e05794abe3a609df
> Author: Daniel Lezcano <daniel.lezcano@linaro.org>
> Date: Thu Apr 10 10:26:14 2025 +0200
>
> watchdog: Add the Watchdog Timer for the NXP S32 platform
>
>
> It's in linux-watchdog-next since the 24th.
> It will be sent to Linus probably this weekend.
>
> Kind regards,
> Wim.
>
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-05-29 17:56 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-10 8:26 [PATCH v4 0/2] Add the NXP S32 Watchdog Daniel Lezcano
2025-04-10 8:26 ` [PATCH v4 1/2] dt-bindings: watchdog: Add NXP Software Watchdog Timer Daniel Lezcano
2025-04-11 16:27 ` Rob Herring (Arm)
2025-04-12 3:23 ` Guenter Roeck
2025-04-24 14:12 ` Daniel Lezcano
2025-04-10 8:26 ` [PATCH v4 2/2] watchdog: Add the Watchdog Timer for the NXP S32 platform Daniel Lezcano
2025-04-12 3:22 ` Guenter Roeck
2025-04-14 9:07 ` Alexandru-Catalin Ionita
2025-05-14 15:30 ` [PATCH v4 0/2] Add the NXP S32 Watchdog Daniel Lezcano
2025-05-14 18:09 ` Guenter Roeck
2025-05-28 13:17 ` Daniel Lezcano
2025-05-28 19:24 ` Wim Van Sebroeck
2025-05-29 17:56 ` Daniel Lezcano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).