[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