[U-Boot] [PATCH 5/8] dm: sysreset: add watchdog-reboot driver

Simon Glass sjg at chromium.org
Tue May 16 00:17:54 UTC 2017


On 12 May 2017 at 17:19, Álvaro Fernández Rojas <noltari at 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 <noltari at 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 <sjg at 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 <noltari at 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
>


More information about the U-Boot mailing list