* [PATCH 0/2] watchdog: add Renesas Window Watchdog support @ 2025-09-17 18:56 Wolfram Sang 2025-09-17 18:56 ` [PATCH 1/2] dt-bindings: watchdog: Add Renesas WWDT Wolfram Sang 2025-09-17 18:56 ` [PATCH 2/2] watchdog: renesas_wwdt: add driver Wolfram Sang 0 siblings, 2 replies; 6+ messages in thread From: Wolfram Sang @ 2025-09-17 18:56 UTC (permalink / raw) To: linux-renesas-soc Cc: Wolfram Sang, Conor Dooley, devicetree, Geert Uytterhoeven, Guenter Roeck, Krzysztof Kozlowski, linux-watchdog, Magnus Damm, Rob Herring, Wim Van Sebroeck This Window Watchdog is a little peculiar because it can only be setup once but we cannot find out if this write already happened. So, configuration is delegated to the firmware/bootloader and the driver will adapt to whatever is configured. The driver handles all bits described in the datasheets. This is really all there is. Tested on a SparrowHawk board (Renesas R-Car V4H). Looking forward to comments! Wolfram Sang (2): dt-bindings: watchdog: Add Renesas WWDT watchdog: renesas_wwdt: add driver .../bindings/watchdog/renesas,wwdt.yaml | 78 +++++++++ drivers/watchdog/Kconfig | 8 + drivers/watchdog/Makefile | 1 + drivers/watchdog/renesas_wwdt.c | 156 ++++++++++++++++++ 4 files changed, 243 insertions(+) create mode 100644 Documentation/devicetree/bindings/watchdog/renesas,wwdt.yaml create mode 100644 drivers/watchdog/renesas_wwdt.c -- 2.47.2 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] dt-bindings: watchdog: Add Renesas WWDT 2025-09-17 18:56 [PATCH 0/2] watchdog: add Renesas Window Watchdog support Wolfram Sang @ 2025-09-17 18:56 ` Wolfram Sang 2025-09-17 19:16 ` Conor Dooley 2025-09-17 18:56 ` [PATCH 2/2] watchdog: renesas_wwdt: add driver Wolfram Sang 1 sibling, 1 reply; 6+ messages in thread From: Wolfram Sang @ 2025-09-17 18:56 UTC (permalink / raw) To: linux-renesas-soc Cc: Wolfram Sang, Wim Van Sebroeck, Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven, Magnus Damm, linux-watchdog, devicetree Describe the Window Watchdog Timer found on Renesas R-Car SoCs from late Gen3 onwards. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> --- Passes the binding check here. .../bindings/watchdog/renesas,wwdt.yaml | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 Documentation/devicetree/bindings/watchdog/renesas,wwdt.yaml diff --git a/Documentation/devicetree/bindings/watchdog/renesas,wwdt.yaml b/Documentation/devicetree/bindings/watchdog/renesas,wwdt.yaml new file mode 100644 index 000000000000..921713dd40fa --- /dev/null +++ b/Documentation/devicetree/bindings/watchdog/renesas,wwdt.yaml @@ -0,0 +1,78 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/watchdog/renesas,wwdt.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Renesas Window Watchdog Timer (WWDT) Controller + +maintainers: + - Wolfram Sang <wsa+renesas@sang-engineering.com> + +properties: + compatible: + items: + - const: renesas,r8a779g0-wwdt # V4H + - const: renesas,rcar-gen4-wwdt + + reg: + maxItems: 1 + + interrupts: + items: + - description: Pretimeout, 75% of overflow reached + - description: Error occurred + + interrupt-names: + items: + - const: pretimeout + - const: error + + clocks: + items: + - description: Bus clock + - description: Counting clock + + clock-names: + items: + - const: bus + - const: cnt + + power-domains: + maxItems: 1 + + resets: + maxItems: 1 + +required: + - compatible + - reg + - clocks + - clock-names + - resets + - power-domains + +allOf: + - $ref: watchdog.yaml# + +additionalProperties: false + +examples: + - | + #include <dt-bindings/clock/r8a779g0-cpg-mssr.h> + #include <dt-bindings/power/r8a779g0-sysc.h> + #include <dt-bindings/interrupt-controller/arm-gic.h> + + wwdt0: watchdog@ffc90000 { + compatible = "renesas,r8a779g0-wwdt", + "renesas,rcar-gen4-wwdt"; + reg = <0xffc90000 0x10>; + interrupts = <GIC_SPI 310 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 311 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "pretimeout", "error"; + clocks = <&cpg CPG_CORE R8A779G0_CLK_SASYNCRT>, + <&cpg CPG_CORE R8A779G0_CLK_R>; + clock-names = "bus", "cnt"; + power-domains = <&sysc R8A779G0_PD_ALWAYS_ON>; + resets = <&cpg 1200>; + }; -- 2.47.2 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] dt-bindings: watchdog: Add Renesas WWDT 2025-09-17 18:56 ` [PATCH 1/2] dt-bindings: watchdog: Add Renesas WWDT Wolfram Sang @ 2025-09-17 19:16 ` Conor Dooley 0 siblings, 0 replies; 6+ messages in thread From: Conor Dooley @ 2025-09-17 19:16 UTC (permalink / raw) To: Wolfram Sang Cc: linux-renesas-soc, Wim Van Sebroeck, Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven, Magnus Damm, linux-watchdog, devicetree [-- Attachment #1: Type: text/plain, Size: 3016 bytes --] On Wed, Sep 17, 2025 at 08:56:48PM +0200, Wolfram Sang wrote: > Describe the Window Watchdog Timer found on Renesas R-Car SoCs from late > Gen3 onwards. > > Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> > --- > > Passes the binding check here. > > .../bindings/watchdog/renesas,wwdt.yaml | 78 +++++++++++++++++++ > 1 file changed, 78 insertions(+) > create mode 100644 Documentation/devicetree/bindings/watchdog/renesas,wwdt.yaml > > diff --git a/Documentation/devicetree/bindings/watchdog/renesas,wwdt.yaml b/Documentation/devicetree/bindings/watchdog/renesas,wwdt.yaml > new file mode 100644 > index 000000000000..921713dd40fa > --- /dev/null > +++ b/Documentation/devicetree/bindings/watchdog/renesas,wwdt.yaml filename matching the base compatible please > @@ -0,0 +1,78 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/watchdog/renesas,wwdt.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Renesas Window Watchdog Timer (WWDT) Controller > + > +maintainers: > + - Wolfram Sang <wsa+renesas@sang-engineering.com> > + > +properties: > + compatible: > + items: > + - const: renesas,r8a779g0-wwdt # V4H > + - const: renesas,rcar-gen4-wwdt > + > + reg: > + maxItems: 1 > + > + interrupts: > + items: > + - description: Pretimeout, 75% of overflow reached > + - description: Error occurred > + > + interrupt-names: > + items: > + - const: pretimeout > + - const: error > + > + clocks: > + items: > + - description: Bus clock > + - description: Counting clock > + > + clock-names: > + items: > + - const: bus > + - const: cnt > + > + power-domains: > + maxItems: 1 > + > + resets: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + - clocks > + - clock-names > + - resets > + - power-domains > + > +allOf: > + - $ref: watchdog.yaml# > + > +additionalProperties: false > + > +examples: > + - | > + #include <dt-bindings/clock/r8a779g0-cpg-mssr.h> > + #include <dt-bindings/power/r8a779g0-sysc.h> > + #include <dt-bindings/interrupt-controller/arm-gic.h> > + > + wwdt0: watchdog@ffc90000 { and remove the wwwdt0 label here as it has no users. > + compatible = "renesas,r8a779g0-wwdt", > + "renesas,rcar-gen4-wwdt"; > + reg = <0xffc90000 0x10>; > + interrupts = <GIC_SPI 310 IRQ_TYPE_LEVEL_HIGH>, > + <GIC_SPI 311 IRQ_TYPE_LEVEL_HIGH>; > + interrupt-names = "pretimeout", "error"; > + clocks = <&cpg CPG_CORE R8A779G0_CLK_SASYNCRT>, > + <&cpg CPG_CORE R8A779G0_CLK_R>; > + clock-names = "bus", "cnt"; > + power-domains = <&sysc R8A779G0_PD_ALWAYS_ON>; > + resets = <&cpg 1200>; > + }; > -- > 2.47.2 > [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] watchdog: renesas_wwdt: add driver 2025-09-17 18:56 [PATCH 0/2] watchdog: add Renesas Window Watchdog support Wolfram Sang 2025-09-17 18:56 ` [PATCH 1/2] dt-bindings: watchdog: Add Renesas WWDT Wolfram Sang @ 2025-09-17 18:56 ` Wolfram Sang 2025-09-18 14:22 ` kernel test robot 2025-10-06 11:58 ` Geert Uytterhoeven 1 sibling, 2 replies; 6+ messages in thread From: Wolfram Sang @ 2025-09-17 18:56 UTC (permalink / raw) To: linux-renesas-soc Cc: Wolfram Sang, Wim Van Sebroeck, Guenter Roeck, Geert Uytterhoeven, Magnus Damm, linux-watchdog This driver adds support for the Renesas Window Watchdog Timer (WWDT). Because it can only be setup once after boot and we cannot know if this already happened, it is mandated that the firmware configures the watchdog. Linux then adapts according to the given config. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> --- drivers/watchdog/Kconfig | 8 ++ drivers/watchdog/Makefile | 1 + drivers/watchdog/renesas_wwdt.c | 156 ++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+) create mode 100644 drivers/watchdog/renesas_wwdt.c diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 0c25b2ed44eb..8d59dad28e58 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -958,6 +958,14 @@ config RENESAS_WDT This driver adds watchdog support for the integrated watchdogs in the Renesas R-Car and other SH-Mobile SoCs (usually named RWDT or SWDT). +config RENESAS_WWDT + tristate "Renesas Window WWDT Watchdog" + depends on ARCH_RENESAS || COMPILE_TEST + select WATCHDOG_CORE + help + This driver adds watchdog support for a window timer found in some + Renesas R-Car Gen3 and later SoCs. + config RENESAS_RZAWDT tristate "Renesas RZ/A WDT Watchdog" depends on ARCH_RENESAS || COMPILE_TEST diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index bbd4d62d2cc3..4f9aea38e96e 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile @@ -85,6 +85,7 @@ obj-$(CONFIG_DIGICOLOR_WATCHDOG) += digicolor_wdt.o obj-$(CONFIG_LPC18XX_WATCHDOG) += lpc18xx_wdt.o obj-$(CONFIG_BCM7038_WDT) += bcm7038_wdt.o obj-$(CONFIG_RENESAS_WDT) += renesas_wdt.o +obj-$(CONFIG_RENESAS_WWDT) += renesas_wwdt.o obj-$(CONFIG_RENESAS_RZAWDT) += rza_wdt.o obj-$(CONFIG_RENESAS_RZN1WDT) += rzn1_wdt.o obj-$(CONFIG_RENESAS_RZG2LWDT) += rzg2l_wdt.o diff --git a/drivers/watchdog/renesas_wwdt.c b/drivers/watchdog/renesas_wwdt.c new file mode 100644 index 000000000000..0cd47e4213a5 --- /dev/null +++ b/drivers/watchdog/renesas_wwdt.c @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Driver for the Renesas Window Watchdog Timer (WWDT) + */ + +#include <linux/clk.h> +#include <linux/interrupt.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/watchdog.h> + +#define WDTA0WDTE 0x00 +#define WDTA0RUN BIT(7) +#define WDTA0_KEY 0x2c + +#define WDTA0MD 0x0c +#define WDTA0OVF(x) FIELD_GET(GENMASK(6, 4), x) +#define WDTA0WIE BIT(3) +#define WDTA0ERM BIT(2) +#define WDTA0WS(x) FIELD_GET(GENMASK(1, 0), x) + +struct wwdt_priv { + void __iomem *base; + struct watchdog_device wdev; +}; + +static int wwdt_start(struct watchdog_device *wdev) +{ + struct wwdt_priv *priv = watchdog_get_drvdata(wdev); + + writeb(WDTA0RUN | WDTA0_KEY, priv->base + WDTA0WDTE); + return 0; +} + +static const struct watchdog_info wwdt_ident = { + .options = WDIOF_KEEPALIVEPING | WDIOF_ALARMONLY | WDIOF_PRETIMEOUT, + .identity = "Renesas Window Watchdog", +}; + +static const struct watchdog_ops wwdt_ops = { + .owner = THIS_MODULE, + .start = wwdt_start, +}; + +static irqreturn_t wwdt_error_irq(int irq, void *dev_id) +{ + struct device *dev = dev_id; + + dev_warn(dev, "Watchdog timed out\n"); + return IRQ_HANDLED; +} + +static irqreturn_t wwdt_pretimeout_irq(int irq, void *dev_id) +{ + struct watchdog_device *wdev = dev_id; + + watchdog_notify_pretimeout(wdev); + return IRQ_HANDLED; +} + +static int wwdt_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct wwdt_priv *priv; + struct watchdog_device *wdev; + struct clk *clk; + unsigned long rate; + unsigned int interval, window_size; + int ret; + u8 val; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + + clk = devm_clk_get(dev, "cnt"); + if (IS_ERR(clk)) + return PTR_ERR(clk); + + rate = clk_get_rate(clk); + if (!rate) + return -EINVAL; + + wdev = &priv->wdev; + + val = readb(priv->base + WDTA0WDTE); + if (val & WDTA0RUN) + set_bit(WDOG_HW_RUNNING, &wdev->status); + + val = readb(priv->base + WDTA0MD); + interval = 1 << (9 + WDTA0OVF(val)); + /* size of the closed(!) window per mille */ + window_size = 250 * (3 - WDTA0WS(val)); + + wdev->info = &wwdt_ident; + wdev->ops = &wwdt_ops; + wdev->parent = dev; + wdev->max_hw_heartbeat_ms = 1000 * interval / rate; + wdev->min_hw_heartbeat_ms = window_size * interval / rate; + wdev->timeout = DIV_ROUND_UP(wdev->max_hw_heartbeat_ms, 1000); + + watchdog_set_drvdata(wdev, priv); + watchdog_set_nowayout(wdev, true); + + if (!(val & WDTA0ERM)) { + ret = platform_get_irq_byname(pdev, "error"); + if (ret < 0) + return ret; + + ret = devm_request_threaded_irq(dev, ret, NULL, wwdt_error_irq, + IRQF_ONESHOT, NULL, dev); + if (ret < 0) + return ret; + } + + if (val & WDTA0WIE) { + ret = platform_get_irq_byname(pdev, "pretimeout"); + if (ret < 0) + return ret; + + ret = devm_request_threaded_irq(dev, ret, NULL, wwdt_pretimeout_irq, + IRQF_ONESHOT, NULL, wdev); + if (ret < 0) + return ret; + } + + devm_watchdog_register_device(dev, wdev); + + return 0; +} + +static const struct of_device_id renesas_wwdt_ids[] = { + { .compatible = "renesas,rcar-gen4-wwdt", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, renesas_wwdt_ids); + +static struct platform_driver renesas_wwdt_driver = { + .driver = { + .name = "renesas_wwdt", + .of_match_table = renesas_wwdt_ids, + }, + .probe = wwdt_probe, +}; +module_platform_driver(renesas_wwdt_driver); + +MODULE_DESCRIPTION("Renesas Window Watchdog (WWDT) Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Wolfram Sang <wsa+renesas@sang-engineering.com>"); -- 2.47.2 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] watchdog: renesas_wwdt: add driver 2025-09-17 18:56 ` [PATCH 2/2] watchdog: renesas_wwdt: add driver Wolfram Sang @ 2025-09-18 14:22 ` kernel test robot 2025-10-06 11:58 ` Geert Uytterhoeven 1 sibling, 0 replies; 6+ messages in thread From: kernel test robot @ 2025-09-18 14:22 UTC (permalink / raw) To: Wolfram Sang, linux-renesas-soc Cc: oe-kbuild-all, Wolfram Sang, Wim Van Sebroeck, Guenter Roeck, Geert Uytterhoeven, Magnus Damm, linux-watchdog Hi Wolfram, kernel test robot noticed the following build errors: [auto build test ERROR on robh/for-next] [also build test ERROR on groeck-staging/hwmon-next linus/master v6.17-rc6 next-20250917] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Wolfram-Sang/dt-bindings-watchdog-Add-Renesas-WWDT/20250918-070043 base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next patch link: https://lore.kernel.org/r/20250917185651.12428-3-wsa%2Brenesas%40sang-engineering.com patch subject: [PATCH 2/2] watchdog: renesas_wwdt: add driver config: m68k-allmodconfig (https://download.01.org/0day-ci/archive/20250918/202509182204.LwGhKzRi-lkp@intel.com/config) compiler: m68k-linux-gcc (GCC) 15.1.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250918/202509182204.LwGhKzRi-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202509182204.LwGhKzRi-lkp@intel.com/ All errors (new ones prefixed by >>): drivers/watchdog/renesas_wwdt.c: In function 'wwdt_probe': >> drivers/watchdog/renesas_wwdt.c:20:25: error: implicit declaration of function 'FIELD_GET' [-Wimplicit-function-declaration] 20 | #define WDTA0OVF(x) FIELD_GET(GENMASK(6, 4), x) | ^~~~~~~~~ drivers/watchdog/renesas_wwdt.c:98:30: note: in expansion of macro 'WDTA0OVF' 98 | interval = 1 << (9 + WDTA0OVF(val)); | ^~~~~~~~ vim +/FIELD_GET +20 drivers/watchdog/renesas_wwdt.c 18 19 #define WDTA0MD 0x0c > 20 #define WDTA0OVF(x) FIELD_GET(GENMASK(6, 4), x) 21 #define WDTA0WIE BIT(3) 22 #define WDTA0ERM BIT(2) 23 #define WDTA0WS(x) FIELD_GET(GENMASK(1, 0), x) 24 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] watchdog: renesas_wwdt: add driver 2025-09-17 18:56 ` [PATCH 2/2] watchdog: renesas_wwdt: add driver Wolfram Sang 2025-09-18 14:22 ` kernel test robot @ 2025-10-06 11:58 ` Geert Uytterhoeven 1 sibling, 0 replies; 6+ messages in thread From: Geert Uytterhoeven @ 2025-10-06 11:58 UTC (permalink / raw) To: Wolfram Sang Cc: linux-renesas-soc, Wim Van Sebroeck, Guenter Roeck, Geert Uytterhoeven, Magnus Damm, linux-watchdog Hi Wolfram, On Wed, 17 Sept 2025 at 20:57, Wolfram Sang <wsa+renesas@sang-engineering.com> wrote: > This driver adds support for the Renesas Window Watchdog Timer (WWDT). > Because it can only be setup once after boot and we cannot know if this > already happened, it is mandated that the firmware configures the > watchdog. Linux then adapts according to the given config. > > Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Thanks for your patch! I didn't get to reviewing this driver yet, so here's just the initial comment from scripts/checkpatch.pl: > --- /dev/null > +++ b/drivers/watchdog/renesas_wwdt.c > +MODULE_DESCRIPTION("Renesas Window Watchdog (WWDT) Driver"); > +MODULE_LICENSE("GPL v2"); WARNING: Prefer "GPL" over "GPL v2" - see commit bf7fbeeae6db ("module: Cure the MODULE_LICENSE "GPL" vs. "GPL v2" bogosity") Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-10-06 11:58 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-09-17 18:56 [PATCH 0/2] watchdog: add Renesas Window Watchdog support Wolfram Sang 2025-09-17 18:56 ` [PATCH 1/2] dt-bindings: watchdog: Add Renesas WWDT Wolfram Sang 2025-09-17 19:16 ` Conor Dooley 2025-09-17 18:56 ` [PATCH 2/2] watchdog: renesas_wwdt: add driver Wolfram Sang 2025-09-18 14:22 ` kernel test robot 2025-10-06 11:58 ` Geert Uytterhoeven
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).