* [PATCH RESEND v4 0/2] Add reaction control in rti
@ 2026-02-03 18:19 Judith Mendez
2026-02-03 18:19 ` [PATCH RESEND v4 1/2] dt-bindings: watchdog: ti,rti-wdt: Add ti,am62l-rti-wdt compatible Judith Mendez
2026-02-03 18:19 ` [PATCH RESEND v4 2/2] watchdog: rti_wdt: Add reaction control Judith Mendez
0 siblings, 2 replies; 5+ messages in thread
From: Judith Mendez @ 2026-02-03 18:19 UTC (permalink / raw)
To: Judith Mendez, Wim Van Sebroeck, Guenter Roeck, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: Tero Kristo, linux-watchdog, devicetree, linux-kernel
This allows for reaction control in rti driver. Since AM62L SoC [0]
does not have WWD reset output routed to a ESM module like all other
K3 SoC's and has the reset output signal routed to the reset HW block,
add a new compatible for AM62L and configure reset reaction for AM62L
SoC instead of NMI.
This patch has been tested on AM62L EVM [1].
Resending this v4 since the original v4 seems to have been
forgotten.
Changes since v4:
- rebase against next branch
v4: https://lore.kernel.org/all/20250721235705.1160972-1-jm@ti.com/
v3: https://lore.kernel.org/linux-devicetree/20250707180002.3918865-1-jm@ti.com/
v2: https://lore.kernel.org/linux-devicetree/20250625143338.2381726-1-jm@ti.com/
v1-resend: https://lore.kernel.org/linux-devicetree/20250624202605.1333645-1-jm@ti.com/
v1: https://lore.kernel.org/linux-devicetree/20250624194509.1314095-1-jm@ti.com/
[0] https://www.ti.com/product/AM62L
[1] https://www.ti.com/tool/TMDS62LEVM
Judith Mendez (2):
dt-bindings: watchdog: ti,rti-wdt: Add ti,am62l-rti-wdt compatible
watchdog: rti_wdt: Add reaction control
.../bindings/watchdog/ti,rti-wdt.yaml | 1 +
drivers/watchdog/rti_wdt.c | 32 ++++++++++++++++---
2 files changed, 29 insertions(+), 4 deletions(-)
--
2.52.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH RESEND v4 1/2] dt-bindings: watchdog: ti,rti-wdt: Add ti,am62l-rti-wdt compatible
2026-02-03 18:19 [PATCH RESEND v4 0/2] Add reaction control in rti Judith Mendez
@ 2026-02-03 18:19 ` Judith Mendez
2026-02-03 18:19 ` [PATCH RESEND v4 2/2] watchdog: rti_wdt: Add reaction control Judith Mendez
1 sibling, 0 replies; 5+ messages in thread
From: Judith Mendez @ 2026-02-03 18:19 UTC (permalink / raw)
To: Judith Mendez, Wim Van Sebroeck, Guenter Roeck, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: Tero Kristo, linux-watchdog, devicetree, linux-kernel
Add a new compatible ti,am62l-rti-wdt for am62l SoC [0].
[0] https://www.ti.com/product/AM62L
Signed-off-by: Judith Mendez <jm@ti.com>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
Documentation/devicetree/bindings/watchdog/ti,rti-wdt.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/watchdog/ti,rti-wdt.yaml b/Documentation/devicetree/bindings/watchdog/ti,rti-wdt.yaml
index 62ddc284a524c..2966e5bfb6c09 100644
--- a/Documentation/devicetree/bindings/watchdog/ti,rti-wdt.yaml
+++ b/Documentation/devicetree/bindings/watchdog/ti,rti-wdt.yaml
@@ -23,6 +23,7 @@ allOf:
properties:
compatible:
enum:
+ - ti,am62l-rti-wdt
- ti,j7-rti-wdt
reg:
--
2.52.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH RESEND v4 2/2] watchdog: rti_wdt: Add reaction control
2026-02-03 18:19 [PATCH RESEND v4 0/2] Add reaction control in rti Judith Mendez
2026-02-03 18:19 ` [PATCH RESEND v4 1/2] dt-bindings: watchdog: ti,rti-wdt: Add ti,am62l-rti-wdt compatible Judith Mendez
@ 2026-02-03 18:19 ` Judith Mendez
2026-02-03 19:13 ` Andrew Davis
1 sibling, 1 reply; 5+ messages in thread
From: Judith Mendez @ 2026-02-03 18:19 UTC (permalink / raw)
To: Judith Mendez, Wim Van Sebroeck, Guenter Roeck, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: Tero Kristo, linux-watchdog, devicetree, linux-kernel
This allows to configure reaction between NMI and reset for WWD.
On K3 SoC's other than AM62L SoC [0], watchdog reset output is routed
to the ESM module which can subsequently route the signal to safety
master or SoC reset. On AM62L, the watchdog reset output is routed
to the SoC HW reset block. So, add a new compatible for AM62l to add
SoC data and configure reaction to reset instead of NMI.
[0] https://www.ti.com/product/AM62L
Signed-off-by: Judith Mendez <jm@ti.com>
---
drivers/watchdog/rti_wdt.c | 32 ++++++++++++++++++++++++++++----
1 file changed, 28 insertions(+), 4 deletions(-)
diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c
index be7d7db475911..483e22efedf9b 100644
--- a/drivers/watchdog/rti_wdt.c
+++ b/drivers/watchdog/rti_wdt.c
@@ -35,7 +35,8 @@
#define RTIWWDRXCTRL 0xa4
#define RTIWWDSIZECTRL 0xa8
-#define RTIWWDRX_NMI 0xa
+#define RTIWWDRXN_RST 0x5
+#define RTIWWDRXN_NMI 0xa
#define RTIWWDSIZE_50P 0x50
#define RTIWWDSIZE_25P 0x500
@@ -63,22 +64,29 @@
static int heartbeat;
+struct rti_wdt_data {
+ bool nmi;
+};
+
/*
* struct to hold data for each WDT device
* @base - base io address of WD device
* @freq - source clock frequency of WDT
* @wdd - hold watchdog device as is in WDT core
+ * @data - hold configuration data
*/
struct rti_wdt_device {
void __iomem *base;
unsigned long freq;
struct watchdog_device wdd;
+ const struct rti_wdt_data *data;
};
static int rti_wdt_start(struct watchdog_device *wdd)
{
u32 timer_margin;
struct rti_wdt_device *wdt = watchdog_get_drvdata(wdd);
+ u8 reaction;
int ret;
ret = pm_runtime_resume_and_get(wdd->parent);
@@ -101,8 +109,13 @@ static int rti_wdt_start(struct watchdog_device *wdd)
*/
wdd->min_hw_heartbeat_ms = 520 * wdd->timeout + MAX_HW_ERROR;
- /* Generate NMI when wdt expires */
- writel_relaxed(RTIWWDRX_NMI, wdt->base + RTIWWDRXCTRL);
+ /* Reset device if wdt serviced outside of window or generate NMI if available */
+ if (wdt->data->nmi)
+ reaction = RTIWWDRXN_NMI;
+ else
+ reaction = RTIWWDRXN_RST;
+
+ writel_relaxed(reaction, wdt->base + RTIWWDRXCTRL);
/* Open window size 50%; this is the largest window size available */
writel_relaxed(RTIWWDSIZE_50P, wdt->base + RTIWWDSIZECTRL);
@@ -254,6 +267,8 @@ static int rti_wdt_probe(struct platform_device *pdev)
wdd->timeout = DEFAULT_HEARTBEAT;
wdd->parent = dev;
+ wdt->data = device_get_match_data(dev);
+
watchdog_set_drvdata(wdd, wdt);
watchdog_set_nowayout(wdd, 1);
watchdog_set_restart_priority(wdd, 128);
@@ -361,8 +376,17 @@ static void rti_wdt_remove(struct platform_device *pdev)
pm_runtime_disable(&pdev->dev);
}
+static struct rti_wdt_data j7_wdt = {
+ .nmi = true,
+};
+
+static struct rti_wdt_data am62l_wdt = {
+ .nmi = false,
+};
+
static const struct of_device_id rti_wdt_of_match[] = {
- { .compatible = "ti,j7-rti-wdt", },
+ { .compatible = "ti,j7-rti-wdt", .data = &j7_wdt },
+ { .compatible = "ti,am62l-rti-wdt", .data = &am62l_wdt },
{},
};
MODULE_DEVICE_TABLE(of, rti_wdt_of_match);
--
2.52.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH RESEND v4 2/2] watchdog: rti_wdt: Add reaction control
2026-02-03 18:19 ` [PATCH RESEND v4 2/2] watchdog: rti_wdt: Add reaction control Judith Mendez
@ 2026-02-03 19:13 ` Andrew Davis
2026-02-05 0:53 ` Judith Mendez
0 siblings, 1 reply; 5+ messages in thread
From: Andrew Davis @ 2026-02-03 19:13 UTC (permalink / raw)
To: Judith Mendez, Wim Van Sebroeck, Guenter Roeck, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: Tero Kristo, linux-watchdog, devicetree, linux-kernel
On 2/3/26 12:19 PM, Judith Mendez wrote:
> This allows to configure reaction between NMI and reset for WWD.
>
> On K3 SoC's other than AM62L SoC [0], watchdog reset output is routed
> to the ESM module which can subsequently route the signal to safety
> master or SoC reset. On AM62L, the watchdog reset output is routed
> to the SoC HW reset block. So, add a new compatible for AM62l to add
> SoC data and configure reaction to reset instead of NMI.
>
> [0] https://www.ti.com/product/AM62L
> Signed-off-by: Judith Mendez <jm@ti.com>
> ---
> drivers/watchdog/rti_wdt.c | 32 ++++++++++++++++++++++++++++----
> 1 file changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c
> index be7d7db475911..483e22efedf9b 100644
> --- a/drivers/watchdog/rti_wdt.c
> +++ b/drivers/watchdog/rti_wdt.c
> @@ -35,7 +35,8 @@
> #define RTIWWDRXCTRL 0xa4
> #define RTIWWDSIZECTRL 0xa8
>
> -#define RTIWWDRX_NMI 0xa
> +#define RTIWWDRXN_RST 0x5
> +#define RTIWWDRXN_NMI 0xa
>
> #define RTIWWDSIZE_50P 0x50
> #define RTIWWDSIZE_25P 0x500
> @@ -63,22 +64,29 @@
>
> static int heartbeat;
>
> +struct rti_wdt_data {
> + bool nmi;
> +};
> +
> /*
> * struct to hold data for each WDT device
> * @base - base io address of WD device
> * @freq - source clock frequency of WDT
> * @wdd - hold watchdog device as is in WDT core
> + * @data - hold configuration data
> */
> struct rti_wdt_device {
> void __iomem *base;
> unsigned long freq;
> struct watchdog_device wdd;
> + const struct rti_wdt_data *data;
Don't store the whole device match data struct, just store the
information you need, so
* @nmi - Set to true if this WDT instance supports generating NMI
bool nmi;
> };
>
> static int rti_wdt_start(struct watchdog_device *wdd)
> {
> u32 timer_margin;
> struct rti_wdt_device *wdt = watchdog_get_drvdata(wdd);
> + u8 reaction;
> int ret;
>
> ret = pm_runtime_resume_and_get(wdd->parent);
> @@ -101,8 +109,13 @@ static int rti_wdt_start(struct watchdog_device *wdd)
> */
> wdd->min_hw_heartbeat_ms = 520 * wdd->timeout + MAX_HW_ERROR;
>
> - /* Generate NMI when wdt expires */
> - writel_relaxed(RTIWWDRX_NMI, wdt->base + RTIWWDRXCTRL);
> + /* Reset device if wdt serviced outside of window or generate NMI if available */
I think where we had issues before was this comment, it should match the code
and it can do so while being very similar to the comment as it was before:
/* When WDT expires, generate an NMI or reset the device if NMI is not supported */
> + if (wdt->data->nmi)
> + reaction = RTIWWDRXN_NMI;
> + else
> + reaction = RTIWWDRXN_RST;
> +
> + writel_relaxed(reaction, wdt->base + RTIWWDRXCTRL);
>
> /* Open window size 50%; this is the largest window size available */
> writel_relaxed(RTIWWDSIZE_50P, wdt->base + RTIWWDSIZECTRL);
> @@ -254,6 +267,8 @@ static int rti_wdt_probe(struct platform_device *pdev)
> wdd->timeout = DEFAULT_HEARTBEAT;
> wdd->parent = dev;
>
> + wdt->data = device_get_match_data(dev);
Should be rare, but this can fail to find match data so you should
check for NULL here. Then as above, just extract out the data you
need (nmi).
Andrew
> +
> watchdog_set_drvdata(wdd, wdt);
> watchdog_set_nowayout(wdd, 1);
> watchdog_set_restart_priority(wdd, 128);
> @@ -361,8 +376,17 @@ static void rti_wdt_remove(struct platform_device *pdev)
> pm_runtime_disable(&pdev->dev);
> }
>
> +static struct rti_wdt_data j7_wdt = {
> + .nmi = true,
> +};
> +
> +static struct rti_wdt_data am62l_wdt = {
> + .nmi = false,
> +};
> +
> static const struct of_device_id rti_wdt_of_match[] = {
> - { .compatible = "ti,j7-rti-wdt", },
> + { .compatible = "ti,j7-rti-wdt", .data = &j7_wdt },
> + { .compatible = "ti,am62l-rti-wdt", .data = &am62l_wdt },
> {},
> };
> MODULE_DEVICE_TABLE(of, rti_wdt_of_match);
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH RESEND v4 2/2] watchdog: rti_wdt: Add reaction control
2026-02-03 19:13 ` Andrew Davis
@ 2026-02-05 0:53 ` Judith Mendez
0 siblings, 0 replies; 5+ messages in thread
From: Judith Mendez @ 2026-02-05 0:53 UTC (permalink / raw)
To: Andrew Davis, Wim Van Sebroeck, Guenter Roeck, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: Tero Kristo, linux-watchdog, devicetree, linux-kernel
Hi Andrew,
On 2/3/26 1:13 PM, Andrew Davis wrote:
> On 2/3/26 12:19 PM, Judith Mendez wrote:
>> This allows to configure reaction between NMI and reset for WWD.
>>
>> On K3 SoC's other than AM62L SoC [0], watchdog reset output is routed
>> to the ESM module which can subsequently route the signal to safety
>> master or SoC reset. On AM62L, the watchdog reset output is routed
>> to the SoC HW reset block. So, add a new compatible for AM62l to add
>> SoC data and configure reaction to reset instead of NMI.
>>
>> [0] https://www.ti.com/product/AM62L
>> Signed-off-by: Judith Mendez <jm@ti.com>
>> ---
>> drivers/watchdog/rti_wdt.c | 32 ++++++++++++++++++++++++++++----
>> 1 file changed, 28 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c
>> index be7d7db475911..483e22efedf9b 100644
>> --- a/drivers/watchdog/rti_wdt.c
>> +++ b/drivers/watchdog/rti_wdt.c
>> @@ -35,7 +35,8 @@
>> #define RTIWWDRXCTRL 0xa4
>> #define RTIWWDSIZECTRL 0xa8
>> -#define RTIWWDRX_NMI 0xa
>> +#define RTIWWDRXN_RST 0x5
>> +#define RTIWWDRXN_NMI 0xa
>> #define RTIWWDSIZE_50P 0x50
>> #define RTIWWDSIZE_25P 0x500
>> @@ -63,22 +64,29 @@
>> static int heartbeat;
>> +struct rti_wdt_data {
>> + bool nmi;
>> +};
>> +
>> /*
>> * struct to hold data for each WDT device
>> * @base - base io address of WD device
>> * @freq - source clock frequency of WDT
>> * @wdd - hold watchdog device as is in WDT core
>> + * @data - hold configuration data
>> */
>> struct rti_wdt_device {
>> void __iomem *base;
>> unsigned long freq;
>> struct watchdog_device wdd;
>> + const struct rti_wdt_data *data;
>
> Don't store the whole device match data struct, just store the
> information you need, so
>
> * @nmi - Set to true if this WDT instance supports generating NMI
> bool nmi;
>
>> };
>> static int rti_wdt_start(struct watchdog_device *wdd)
>> {
>> u32 timer_margin;
>> struct rti_wdt_device *wdt = watchdog_get_drvdata(wdd);
>> + u8 reaction;
>> int ret;
>> ret = pm_runtime_resume_and_get(wdd->parent);
>> @@ -101,8 +109,13 @@ static int rti_wdt_start(struct watchdog_device
>> *wdd)
>> */
>> wdd->min_hw_heartbeat_ms = 520 * wdd->timeout + MAX_HW_ERROR;
>> - /* Generate NMI when wdt expires */
>> - writel_relaxed(RTIWWDRX_NMI, wdt->base + RTIWWDRXCTRL);
>> + /* Reset device if wdt serviced outside of window or generate NMI
>> if available */
>
> I think where we had issues before was this comment, it should match the
> code
> and it can do so while being very similar to the comment as it was before:
>
> /* When WDT expires, generate an NMI or reset the device if NMI is not
> supported */
oops, sorry, will fix... again
>
>> + if (wdt->data->nmi)
>> + reaction = RTIWWDRXN_NMI;
>> + else
>> + reaction = RTIWWDRXN_RST;
>> +
>> + writel_relaxed(reaction, wdt->base + RTIWWDRXCTRL);
>> /* Open window size 50%; this is the largest window size
>> available */
>> writel_relaxed(RTIWWDSIZE_50P, wdt->base + RTIWWDSIZECTRL);
>> @@ -254,6 +267,8 @@ static int rti_wdt_probe(struct platform_device
>> *pdev)
>> wdd->timeout = DEFAULT_HEARTBEAT;
>> wdd->parent = dev;
>> + wdt->data = device_get_match_data(dev);
>
> Should be rare, but this can fail to find match data so you should
> check for NULL here. Then as above, just extract out the data you
> need (nmi).
>
Thanks for reviewing!
I will fix accordingly and respin the series.
~ Judith
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-02-05 0:53 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-03 18:19 [PATCH RESEND v4 0/2] Add reaction control in rti Judith Mendez
2026-02-03 18:19 ` [PATCH RESEND v4 1/2] dt-bindings: watchdog: ti,rti-wdt: Add ti,am62l-rti-wdt compatible Judith Mendez
2026-02-03 18:19 ` [PATCH RESEND v4 2/2] watchdog: rti_wdt: Add reaction control Judith Mendez
2026-02-03 19:13 ` Andrew Davis
2026-02-05 0:53 ` Judith Mendez
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox