Thread (5 messages) 5 messages, 2 authors, 2017-02-15

Re: [PATCH 1/3] power: reset: Add Renesas reset driver

From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: 2017-02-15 09:16:07
Also in: linux-devicetree, linux-renesas-soc

Hi Chris,

On Mon, Feb 13, 2017 at 7:25 PM, Chris Brandt [off-list ref] wrote:
Some Renesas SoCs do not have a reset register and the only way to do a SW
controlled reset is to use the watchdog timer. Additionally, since all the
WDT timeout options are so quick, a system reset is about the only thing
it's good for.

Signed-off-by: Chris Brandt <chris.brandt@renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
quoted hunk ↗ jump to hunk
--- /dev/null
+++ b/drivers/power/reset/renesas-reset.c
@@ -0,0 +1,103 @@
+/* Watchdog Timer Registers */
+#define WTCSR 0
+#define WTCNT 2
+#define WRCSR 4
+
+static void __iomem *base;
+
+static int wdt_reset_handler(struct notifier_block *this,
+                            unsigned long mode, void *cmd)
+{
+       pr_debug("%s %lu\n", __func__, mode);
+
+       /* Dummy read (must read WRCSR:WOVF at least once before clearing) */
+       readw(base + WRCSR);
+
+       writew(0xA500, base + WRCSR);   /* Clear WOVF */
+       writew(0x5A5F, base + WRCSR);   /* Reset Enable */
+       writew(0x5A00, base + WTCNT);   /* Counter to 00 */
+       writew(0xA578, base + WTCSR);   /* Start timer */
Hardcoded register values? Please use #defines.
Yes, the 0xa5 and 0x5a are magic values, but the other bits aren't.
+
+       /* Wait for WDT overflow */
+       while (1)
+               ;
This burns CPU, and thus power, albeit for a very short time.
Perhaps add an msleep() to the loop body?

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help