diff mbox

[RFC,4/5] ARM: shmobile: r8a7790: let rst module allow watchdog resets if desired

Message ID 1422802074-1921-5-git-send-email-wsa@the-dreams.de (mailing list archive)
State RFC
Headers show

Commit Message

Wolfram Sang Feb. 1, 2015, 2:47 p.m. UTC
From: Wolfram Sang <wsa+renesas@sang-engineering.com>

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
---
 arch/arm/mach-shmobile/setup-rcar-gen2.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

Comments

Geert Uytterhoeven Feb. 2, 2015, 9:45 a.m. UTC | #1
Hi Wolfram,

On Sun, Feb 1, 2015 at 3:47 PM, Wolfram Sang <wsa@the-dreams.de> wrote:
> From: Wolfram Sang <wsa+renesas@sang-engineering.com>
>
> Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
> ---
>  arch/arm/mach-shmobile/setup-rcar-gen2.c | 16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/mach-shmobile/setup-rcar-gen2.c b/arch/arm/mach-shmobile/setup-rcar-gen2.c
> index e2b9bb46393d..0d408ac5b96a 100644
> --- a/arch/arm/mach-shmobile/setup-rcar-gen2.c
> +++ b/arch/arm/mach-shmobile/setup-rcar-gen2.c
> @@ -28,7 +28,18 @@
>  #include "common.h"
>  #include "rcar-gen2.h"
>
> -#define MODEMR 0xe6160060
> +#define WDTRSTCR       0xe6160054
> +#define MODEMR         0xe6160060
> +
> +void __init rcar_gen2_wdt_rst_init(void)
> +{
> +#if defined(CONFIG_WATCHDOG)
> +       void __iomem *p = ioremap_nocache(WDTRSTCR, 4);
> +       BUG_ON(!p);
> +       iowrite32(0xa55a0000, p);

This is dangerous. If the xWDT was left running, the system will be
restarted soon.

I think clearing the xWDT reset mask should be handled in the WDT driver
itself, when enabling the watchdog.

As the wiring between WDT and reset controller differs on the various SoCs
(R-Car Gen2 uses the RST module, R-Mobile APE6 uses the SYSC module),
I was thinking about representing this into DT, e.g. adding a node for the RST:

        rst: reset-controller@e6160000 {
                compatible = "renesas,rst-r8a7791", "syscon";
                reg = <0 0xe6160000 0 0x64>;
        };

and adding a link to the RST to the wdt node:

        syscon = <&rst 0>; /* 0 for RWDT, 1 for SWDT */

On APE6 it can become a link to the SYSC instead.
It's slightly more complicated there, as we already have a driver for the
SYSC on R-Mobile (rmobile-reset), and a device node can't be bound
by both the syscon and the rmobile-reset driver.

On older SH-Mobile / R-Mobile, the link can be left out, as the reset is
not configurable on these SoCs, I think.

Do you have a better idea?

> +       iounmap(p);
> +#endif
> +}
>
>  u32 rcar_gen2_read_mode_pins(void)
>  {
> @@ -132,6 +143,9 @@ void __init rcar_gen2_timer_init(void)
>  #ifdef CONFIG_COMMON_CLK
>         rcar_gen2_clocks_init(mode);
>  #endif
> +       /* allow watchdog timers to trigger reset */
> +       rcar_gen2_wdt_rst_init();
> +
>         clocksource_of_init();
>  }

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
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Wolfram Sang Feb. 2, 2015, 11:13 a.m. UTC | #2
> > +void __init rcar_gen2_wdt_rst_init(void)
> > +{
> > +#if defined(CONFIG_WATCHDOG)
> > +       void __iomem *p = ioremap_nocache(WDTRSTCR, 4);
> > +       BUG_ON(!p);
> > +       iowrite32(0xa55a0000, p);
> 
> This is dangerous. If the xWDT was left running, the system will be
> restarted soon.

Agreed, that might be the case.

> I think clearing the xWDT reset mask should be handled in the WDT driver
> itself, when enabling the watchdog.

Yes, and masked again if WDT is disabled.

> It's slightly more complicated there, as we already have a driver for the
> SYSC on R-Mobile (rmobile-reset), and a device node can't be bound
> by both the syscon and the rmobile-reset driver.

Is it just complicated or is it an open issue how to handle that?

> Do you have a better idea?

Nope. I also thought that something like syscon must be used if the
initialization in arch-code won't work. Still, I tried first with the
least intrusive version :)
Geert Uytterhoeven Feb. 3, 2015, 12:12 p.m. UTC | #3
Hi Wolfram,

On Mon, Feb 2, 2015 at 12:13 PM, Wolfram Sang <wsa@the-dreams.de> wrote:
>> It's slightly more complicated there, as we already have a driver for the
>> SYSC on R-Mobile (rmobile-reset), and a device node can't be bound
>> by both the syscon and the rmobile-reset driver.
>
> Is it just complicated or is it an open issue how to handle that?

If the syscon drivers binds against the device, rmobile-reset can no
longer bind against it. One solution is to convert rmobile-reset to use
syscon, so both the rwdt and the rmobile-reset drivers would access it
through syscon.
But currently syscon provides access to the first register bank of a device
only, while the RESCNT register is part of the second bank.

>> Do you have a better idea?
>
> Nope. I also thought that something like syscon must be used if the
> initialization in arch-code won't work. Still, I tried first with the
> least intrusive version :)

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
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Laurent Pinchart Feb. 3, 2015, 1:47 p.m. UTC | #4
On Tuesday 03 February 2015 13:12:31 Geert Uytterhoeven wrote:
> Hi Wolfram,
> 
> On Mon, Feb 2, 2015 at 12:13 PM, Wolfram Sang <wsa@the-dreams.de> wrote:
> >> It's slightly more complicated there, as we already have a driver for the
> >> SYSC on R-Mobile (rmobile-reset), and a device node can't be bound
> >> by both the syscon and the rmobile-reset driver.
> > 
> > Is it just complicated or is it an open issue how to handle that?
> 
> If the syscon drivers binds against the device, rmobile-reset can no
> longer bind against it. One solution is to convert rmobile-reset to use
> syscon, so both the rwdt and the rmobile-reset drivers would access it
> through syscon.
> But currently syscon provides access to the first register bank of a device
> only, while the RESCNT register is part of the second bank.

Shouldn't syscon be split into an API that individual drivers can implement 
and a default driver for syscon devices that just need to expose one register 
bank ?

> >> Do you have a better idea?
> > 
> > Nope. I also thought that something like syscon must be used if the
> > initialization in arch-code won't work. Still, I tried first with the
> > least intrusive version :)
diff mbox

Patch

diff --git a/arch/arm/mach-shmobile/setup-rcar-gen2.c b/arch/arm/mach-shmobile/setup-rcar-gen2.c
index e2b9bb46393d..0d408ac5b96a 100644
--- a/arch/arm/mach-shmobile/setup-rcar-gen2.c
+++ b/arch/arm/mach-shmobile/setup-rcar-gen2.c
@@ -28,7 +28,18 @@ 
 #include "common.h"
 #include "rcar-gen2.h"
 
-#define MODEMR 0xe6160060
+#define WDTRSTCR	0xe6160054
+#define MODEMR		0xe6160060
+
+void __init rcar_gen2_wdt_rst_init(void)
+{
+#if defined(CONFIG_WATCHDOG)
+	void __iomem *p = ioremap_nocache(WDTRSTCR, 4);
+	BUG_ON(!p);
+	iowrite32(0xa55a0000, p);
+	iounmap(p);
+#endif
+}
 
 u32 rcar_gen2_read_mode_pins(void)
 {
@@ -132,6 +143,9 @@  void __init rcar_gen2_timer_init(void)
 #ifdef CONFIG_COMMON_CLK
 	rcar_gen2_clocks_init(mode);
 #endif
+	/* allow watchdog timers to trigger reset */
+	rcar_gen2_wdt_rst_init();
+
 	clocksource_of_init();
 }