On 12 May 2017 at 17:19, Álvaro Fernández Rojas <nolt...@gmail.com> wrote: > Add a new sysreset driver that uses the recently added watchdog support. > It performs a full SoC reset by calling wdt_expire_now op. > > Signed-off-by: Álvaro Fernández Rojas <nolt...@gmail.com> > --- > drivers/sysreset/Kconfig | 6 ++++ > drivers/sysreset/Makefile | 1 + > drivers/sysreset/sysreset_watchdog.c | 57 > ++++++++++++++++++++++++++++++++++++ > 3 files changed, 64 insertions(+) > create mode 100644 drivers/sysreset/sysreset_watchdog.c >
Reviewed-by: Simon Glass <s...@chromium.org> Please see below. > diff --git a/drivers/sysreset/Kconfig b/drivers/sysreset/Kconfig > index b2f7464..a6d48e8 100644 > --- a/drivers/sysreset/Kconfig > +++ b/drivers/sysreset/Kconfig > @@ -31,4 +31,10 @@ config SYSRESET_SYSCON > help > Reboot support for generic SYSCON mapped register reset. > > +config SYSRESET_WATCHDOG > + bool "Enable support for watchdog reboot driver" > + select WDT > + help > + Reboot support for generic watchdog reset. > + > endmenu > diff --git a/drivers/sysreset/Makefile b/drivers/sysreset/Makefile > index bd352e7..b683811 100644 > --- a/drivers/sysreset/Makefile > +++ b/drivers/sysreset/Makefile > @@ -7,6 +7,7 @@ > obj-$(CONFIG_SYSRESET) += sysreset-uclass.o > obj-$(CONFIG_SYSRESET_PSCI) += sysreset_psci.o > obj-$(CONFIG_SYSRESET_SYSCON) += sysreset_syscon.o > +obj-$(CONFIG_SYSRESET_WATCHDOG) += sysreset_watchdog.o > > ifndef CONFIG_SPL_BUILD > obj-$(CONFIG_ROCKCHIP_RK3036) += sysreset_rk3036.o > diff --git a/drivers/sysreset/sysreset_watchdog.c > b/drivers/sysreset/sysreset_watchdog.c > new file mode 100644 > index 0000000..caeb039 > --- /dev/null > +++ b/drivers/sysreset/sysreset_watchdog.c > @@ -0,0 +1,57 @@ > +/* > + * Copyright (C) 2017 Álvaro Fernández Rojas <nolt...@gmail.com> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include <common.h> > +#include <dm.h> > +#include <errno.h> > +#include <sysreset.h> > +#include <wdt.h> > + > +struct wdt_reboot_priv { > + struct udevice *wdt; > +}; > + > +static int wdt_reboot_request(struct udevice *dev, enum sysreset_t type) > +{ > + struct wdt_reboot_priv *priv = dev_get_priv(dev); > + > + wdt_expire_now(priv->wdt, 0); Missing error check? > + > + return -EINPROGRESS; > +} > + > +static struct sysreset_ops wdt_reboot_ops = { > + .request = wdt_reboot_request, > +}; > + > +int wdt_reboot_probe(struct udevice *dev) > +{ > + struct wdt_reboot_priv *priv = dev_get_priv(dev); > + int err; > + > + err = uclass_get_device_by_phandle(UCLASS_WDT, dev, > + "wdt", &priv->wdt); > + if (err) { > + error("unable to find wdt device\n"); > + return err; > + } > + > + return 0; > +} > + > +static const struct udevice_id wdt_reboot_ids[] = { > + { .compatible = "wdt-reboot" }, > + { /* sentinel */ } > +}; > + > +U_BOOT_DRIVER(wdt_reboot) = { > + .name = "wdt_reboot", > + .id = UCLASS_SYSRESET, > + .of_match = wdt_reboot_ids, > + .ops = &wdt_reboot_ops, > + .priv_auto_alloc_size = sizeof(struct wdt_reboot_priv), > + .probe = wdt_reboot_probe, > +}; > -- > 2.1.4 > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot