From: Guenter Roeck <linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org> To: Chris Brandt <chris.brandt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org> Cc: Wim Van Sebroeck <wim-IQzOog9fTRqzQB+pC5nmwQ@public.gmane.org>, Sebastian Reichel <sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>, Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>, Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>, Simon Horman <horms-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org>, Geert Uytterhoeven <geert-Td1EMuHUCqxL1ZNQvxDV9g@public.gmane.org>, linux-renesas-soc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-watchdog-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Subject: Re: [PATCH v2 1/3] power: reset: Add Renesas reset driver Date: Thu, 16 Feb 2017 10:26:44 -0800 [thread overview] Message-ID: <20170216182644.GA17814@roeck-us.net> (raw) In-Reply-To: <20170216172320.10897-2-chris.brandt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org> On Thu, Feb 16, 2017 at 12:23:18PM -0500, Chris Brandt 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-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org> > Reviewed-by: Geert Uytterhoeven <geert+renesas-gXvu3+zWzMSzQB+pC5nmwQ@public.gmane.org> Wondering - why not use the watchdog driver and the infrastructure provided by the watchdog core (ie the restart callback) instead ? > --- > v2: > * changed DT bindings from 'wdt-reset' to 'rza-wdt' > * changed hard coded register values to defines > * added msleep to while(1) loop Sure you can sleep here ? Guenter > * removed unnecessary #include files > * added Reviewed-by: Geert Uytterhoeven > --- > drivers/power/reset/Kconfig | 9 +++ > drivers/power/reset/Makefile | 1 + > drivers/power/reset/renesas-reset.c | 112 ++++++++++++++++++++++++++++++++++++ > 3 files changed, 122 insertions(+) > create mode 100644 drivers/power/reset/renesas-reset.c > > diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig > index b8caccc..e3100c9 100644 > --- a/drivers/power/reset/Kconfig > +++ b/drivers/power/reset/Kconfig > @@ -130,6 +130,15 @@ config POWER_RESET_QNAP > > Say Y if you have a QNAP NAS. > > +config POWER_RESET_RENESAS > + tristate "Renesas WDT reset driver" > + depends on ARCH_RENESAS || COMPILE_TEST > + depends on HAS_IOMEM > + help > + Reboot support for Renesas SoCs with WDT reset. > + 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. > + > config POWER_RESET_RESTART > bool "Restart power-off driver" > help > diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile > index 11dae3b..a78a56c 100644 > --- a/drivers/power/reset/Makefile > +++ b/drivers/power/reset/Makefile > @@ -13,6 +13,7 @@ obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o > obj-$(CONFIG_POWER_RESET_PIIX4_POWEROFF) += piix4-poweroff.o > obj-$(CONFIG_POWER_RESET_LTC2952) += ltc2952-poweroff.o > obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o > +obj-$(CONFIG_POWER_RESET_RENESAS) += renesas-reset.o > obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o > obj-$(CONFIG_POWER_RESET_ST) += st-poweroff.o > obj-$(CONFIG_POWER_RESET_VERSATILE) += arm-versatile-reboot.o > diff --git a/drivers/power/reset/renesas-reset.c b/drivers/power/reset/renesas-reset.c > new file mode 100644 > index 0000000..812cee0 > --- /dev/null > +++ b/drivers/power/reset/renesas-reset.c > @@ -0,0 +1,112 @@ > +/* > + * Renesas WDT Reset Driver > + * > + * Copyright (C) 2017 Renesas Electronics America, Inc. > + * Copyright (C) 2017 Chris Brandt > + * > + * This file is subject to the terms and conditions of the GNU General Public > + * License. See the file "COPYING" in the main directory of this archive > + * for more details. > + * > + * based on rmobile-reset.c > + * > + */ > + > +#include <linux/platform_device.h> > +#include <linux/module.h> > +#include <linux/of_address.h> > +#include <linux/reboot.h> > +#include <linux/delay.h> > + > +/* Watchdog Timer Registers */ > +#define WTCSR 0 > +#define WTCSR_MAGIC 0xA500 > +#define WTSCR_WT (1<<6) > +#define WTSCR_TME (1<<5) > + > +#define WTCNT 2 > +#define WTCNT_MAGIC 0x5A00 > + > +#define WRCSR 4 > +#define WRCSR_MAGIC 0x5A00 > +#define WRCSR_RSTE (1<<6) > +#define WRCSR_CLEAR_WOVF 0xA500 /* special value */ > + > +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) */ > + readb(base + WRCSR); > + > + writew(WRCSR_CLEAR_WOVF, base + WRCSR); /* Clear WOVF */ > + writew(WRCSR_MAGIC | WRCSR_RSTE, base + WRCSR); /* Reset Enable */ > + writew(WTCNT_MAGIC, base + WTCNT); /* Counter to 00 */ > + > + /* Start timer */ > + writew(WTCSR_MAGIC | WTSCR_WT | WTSCR_TME, base + WTCSR); > + > + /* Wait for WDT overflow (reset) */ > + while (1) > + msleep(1); > + > + return NOTIFY_DONE; > +} > + > +static struct notifier_block wdt_reset_nb = { > + .notifier_call = wdt_reset_handler, > + .priority = 192, > +}; > + > +static int wdt_reset_probe(struct platform_device *pdev) > +{ > + int error; > + > + base = of_iomap(pdev->dev.of_node, 0); > + if (!base) > + return -ENODEV; > + > + error = register_restart_handler(&wdt_reset_nb); > + if (error) { > + dev_err(&pdev->dev, > + "cannot register restart handler (err=%d)\n", error); > + goto fail_unmap; > + } > + > + return 0; > + > +fail_unmap: > + iounmap(base); > + return error; > +} > + > +static int wdt_reset_remove(struct platform_device *pdev) > +{ > + unregister_restart_handler(&wdt_reset_nb); > + iounmap(base); > + return 0; > +} > + > +static const struct of_device_id wdt_reset_of_match[] = { > + { .compatible = "renesas,rza-wdt", }, > + { /* sentinel */ } > +}; > +MODULE_DEVICE_TABLE(of, wdt_reset_of_match); > + > +static struct platform_driver wdt_reset_driver = { > + .probe = wdt_reset_probe, > + .remove = wdt_reset_remove, > + .driver = { > + .name = "wdt_reset", > + .of_match_table = wdt_reset_of_match, > + }, > +}; > + > +module_platform_driver(wdt_reset_driver); > + > +MODULE_DESCRIPTION("Renesas WDT Reset Driver"); > +MODULE_AUTHOR("Chris Brandt <chris.brandt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>"); > +MODULE_LICENSE("GPL v2"); > -- > 2.10.1 > > -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html
WARNING: multiple messages have this Message-ID (diff)
From: Guenter Roeck <linux@roeck-us.net> To: Chris Brandt <chris.brandt@renesas.com> Cc: Wim Van Sebroeck <wim@iguana.be>, Sebastian Reichel <sre@kernel.org>, Rob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>, Simon Horman <horms@verge.net.au>, Geert Uytterhoeven <geert@linux-m68k.org>, linux-renesas-soc@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-watchdog@vger.kernel.org Subject: Re: [PATCH v2 1/3] power: reset: Add Renesas reset driver Date: Thu, 16 Feb 2017 10:26:44 -0800 [thread overview] Message-ID: <20170216182644.GA17814@roeck-us.net> (raw) In-Reply-To: <20170216172320.10897-2-chris.brandt@renesas.com> On Thu, Feb 16, 2017 at 12:23:18PM -0500, Chris Brandt 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> Wondering - why not use the watchdog driver and the infrastructure provided by the watchdog core (ie the restart callback) instead ? > --- > v2: > * changed DT bindings from 'wdt-reset' to 'rza-wdt' > * changed hard coded register values to defines > * added msleep to while(1) loop Sure you can sleep here ? Guenter > * removed unnecessary #include files > * added Reviewed-by: Geert Uytterhoeven > --- > drivers/power/reset/Kconfig | 9 +++ > drivers/power/reset/Makefile | 1 + > drivers/power/reset/renesas-reset.c | 112 ++++++++++++++++++++++++++++++++++++ > 3 files changed, 122 insertions(+) > create mode 100644 drivers/power/reset/renesas-reset.c > > diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig > index b8caccc..e3100c9 100644 > --- a/drivers/power/reset/Kconfig > +++ b/drivers/power/reset/Kconfig > @@ -130,6 +130,15 @@ config POWER_RESET_QNAP > > Say Y if you have a QNAP NAS. > > +config POWER_RESET_RENESAS > + tristate "Renesas WDT reset driver" > + depends on ARCH_RENESAS || COMPILE_TEST > + depends on HAS_IOMEM > + help > + Reboot support for Renesas SoCs with WDT reset. > + 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. > + > config POWER_RESET_RESTART > bool "Restart power-off driver" > help > diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile > index 11dae3b..a78a56c 100644 > --- a/drivers/power/reset/Makefile > +++ b/drivers/power/reset/Makefile > @@ -13,6 +13,7 @@ obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o > obj-$(CONFIG_POWER_RESET_PIIX4_POWEROFF) += piix4-poweroff.o > obj-$(CONFIG_POWER_RESET_LTC2952) += ltc2952-poweroff.o > obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o > +obj-$(CONFIG_POWER_RESET_RENESAS) += renesas-reset.o > obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o > obj-$(CONFIG_POWER_RESET_ST) += st-poweroff.o > obj-$(CONFIG_POWER_RESET_VERSATILE) += arm-versatile-reboot.o > diff --git a/drivers/power/reset/renesas-reset.c b/drivers/power/reset/renesas-reset.c > new file mode 100644 > index 0000000..812cee0 > --- /dev/null > +++ b/drivers/power/reset/renesas-reset.c > @@ -0,0 +1,112 @@ > +/* > + * Renesas WDT Reset Driver > + * > + * Copyright (C) 2017 Renesas Electronics America, Inc. > + * Copyright (C) 2017 Chris Brandt > + * > + * This file is subject to the terms and conditions of the GNU General Public > + * License. See the file "COPYING" in the main directory of this archive > + * for more details. > + * > + * based on rmobile-reset.c > + * > + */ > + > +#include <linux/platform_device.h> > +#include <linux/module.h> > +#include <linux/of_address.h> > +#include <linux/reboot.h> > +#include <linux/delay.h> > + > +/* Watchdog Timer Registers */ > +#define WTCSR 0 > +#define WTCSR_MAGIC 0xA500 > +#define WTSCR_WT (1<<6) > +#define WTSCR_TME (1<<5) > + > +#define WTCNT 2 > +#define WTCNT_MAGIC 0x5A00 > + > +#define WRCSR 4 > +#define WRCSR_MAGIC 0x5A00 > +#define WRCSR_RSTE (1<<6) > +#define WRCSR_CLEAR_WOVF 0xA500 /* special value */ > + > +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) */ > + readb(base + WRCSR); > + > + writew(WRCSR_CLEAR_WOVF, base + WRCSR); /* Clear WOVF */ > + writew(WRCSR_MAGIC | WRCSR_RSTE, base + WRCSR); /* Reset Enable */ > + writew(WTCNT_MAGIC, base + WTCNT); /* Counter to 00 */ > + > + /* Start timer */ > + writew(WTCSR_MAGIC | WTSCR_WT | WTSCR_TME, base + WTCSR); > + > + /* Wait for WDT overflow (reset) */ > + while (1) > + msleep(1); > + > + return NOTIFY_DONE; > +} > + > +static struct notifier_block wdt_reset_nb = { > + .notifier_call = wdt_reset_handler, > + .priority = 192, > +}; > + > +static int wdt_reset_probe(struct platform_device *pdev) > +{ > + int error; > + > + base = of_iomap(pdev->dev.of_node, 0); > + if (!base) > + return -ENODEV; > + > + error = register_restart_handler(&wdt_reset_nb); > + if (error) { > + dev_err(&pdev->dev, > + "cannot register restart handler (err=%d)\n", error); > + goto fail_unmap; > + } > + > + return 0; > + > +fail_unmap: > + iounmap(base); > + return error; > +} > + > +static int wdt_reset_remove(struct platform_device *pdev) > +{ > + unregister_restart_handler(&wdt_reset_nb); > + iounmap(base); > + return 0; > +} > + > +static const struct of_device_id wdt_reset_of_match[] = { > + { .compatible = "renesas,rza-wdt", }, > + { /* sentinel */ } > +}; > +MODULE_DEVICE_TABLE(of, wdt_reset_of_match); > + > +static struct platform_driver wdt_reset_driver = { > + .probe = wdt_reset_probe, > + .remove = wdt_reset_remove, > + .driver = { > + .name = "wdt_reset", > + .of_match_table = wdt_reset_of_match, > + }, > +}; > + > +module_platform_driver(wdt_reset_driver); > + > +MODULE_DESCRIPTION("Renesas WDT Reset Driver"); > +MODULE_AUTHOR("Chris Brandt <chris.brandt@renesas.com>"); > +MODULE_LICENSE("GPL v2"); > -- > 2.10.1 > >
next prev parent reply other threads:[~2017-02-16 18:26 UTC|newest] Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-02-16 17:23 [PATCH v2 0/3] power: reset: add reset for renesas r7s72100 Chris Brandt 2017-02-16 17:23 ` [PATCH v2 1/3] power: reset: Add Renesas reset driver Chris Brandt [not found] ` <20170216172320.10897-2-chris.brandt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org> 2017-02-16 18:26 ` Guenter Roeck [this message] 2017-02-16 18:26 ` Guenter Roeck 2017-02-16 18:40 ` Chris Brandt 2017-02-16 22:20 ` Guenter Roeck 2017-02-17 2:00 ` Chris Brandt [not found] ` <PS1PR06MB11622077DE4673C1879C05278A5D0-l4vAwRX7WilTTnd0MlXEO20DtJ1/0DrXvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 2017-02-17 4:45 ` Guenter Roeck 2017-02-17 4:45 ` Guenter Roeck [not found] ` <55cf087f-aa70-3660-1186-af9b9b20376d-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org> 2017-02-17 8:09 ` Geert Uytterhoeven 2017-02-17 8:09 ` Geert Uytterhoeven [not found] ` <CAMuHMdUChhntL0Mw2CY7au87WHj11nBi+0Q2mWSi+RcYpHXgAQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2017-02-17 10:06 ` Guenter Roeck 2017-02-17 10:06 ` Guenter Roeck 2017-02-17 10:06 ` Guenter Roeck [not found] ` <fb92af5b-6ed8-ef52-d1d1-4615b5026738-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org> 2017-02-17 13:49 ` Chris Brandt 2017-02-17 13:49 ` Chris Brandt 2017-02-22 13:35 ` Chris Brandt 2017-02-22 15:28 ` Guenter Roeck [not found] ` <20170222152815.GA23780-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org> 2017-02-22 16:04 ` Chris Brandt 2017-02-22 16:04 ` Chris Brandt [not found] ` <20170216172320.10897-1-chris.brandt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org> 2017-02-16 17:23 ` [PATCH v2 2/3] watchdog: renesas-wdt: add support for rza Chris Brandt 2017-02-16 17:23 ` Chris Brandt [not found] ` <20170216172320.10897-3-chris.brandt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org> 2017-02-17 10:27 ` Geert Uytterhoeven 2017-02-17 10:27 ` Geert Uytterhoeven 2017-02-27 16:34 ` Rob Herring 2017-02-16 17:23 ` [PATCH v2 3/3] ARM: dts: r7s72100: Add reset handler Chris Brandt [not found] ` <20170216172320.10897-4-chris.brandt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org> 2017-02-17 10:29 ` Geert Uytterhoeven 2017-02-17 10:29 ` Geert Uytterhoeven 2017-08-30 8:29 ` Simon Horman [not found] ` <20170830082940.GR10398-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org> 2017-08-30 13:22 ` Chris Brandt 2017-08-30 13:22 ` Chris Brandt [not found] ` <SG2PR06MB1165B8B815327A6768AE681A8A9C0-ESzmfEwOt/xoAsOJh7vwSm0DtJ1/0DrXvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 2017-08-30 15:57 ` Simon Horman 2017-08-30 15:57 ` Simon Horman
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20170216182644.GA17814@roeck-us.net \ --to=linux-0h96xk9xttrk1umjsbkqmq@public.gmane.org \ --cc=chris.brandt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org \ --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=geert-Td1EMuHUCqxL1ZNQvxDV9g@public.gmane.org \ --cc=horms-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org \ --cc=linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=linux-renesas-soc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=linux-watchdog-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \ --cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \ --cc=sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \ --cc=wim-IQzOog9fTRqzQB+pC5nmwQ@public.gmane.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.