From: Lukasz Majewski <lukma@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/2] watchdog: imx: Add DM support
Date: Tue, 4 Jun 2019 23:21:40 +0200 [thread overview]
Message-ID: <20190604232140.5e3ab6e6@jawa> (raw)
In-Reply-To: <20190512213453.5884-2-marex@denx.de>
On Sun, 12 May 2019 23:34:53 +0200
Marek Vasut <marex@denx.de> wrote:
> Add DM and DT probing support to iMX watchdog driver. This should
> allow boards to move over to this driver, enable SYSRESET_WATCHDOG
> to handle cpu_reset() if required.
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Peng Fan <Peng.Fan@freescale.com>
> Cc: Stefano Babic <sbabic@denx.de>
> ---
> drivers/watchdog/Kconfig | 2 +-
> drivers/watchdog/imx_watchdog.c | 119
> +++++++++++++++++++++++++++----- 2 files changed, 104 insertions(+),
> 17 deletions(-)
>
> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
> index f909d40f45..b2ebe528ab 100644
> --- a/drivers/watchdog/Kconfig
> +++ b/drivers/watchdog/Kconfig
> @@ -129,7 +129,7 @@ config XILINX_TB_WATCHDOG
>
> config IMX_WATCHDOG
> bool "Enable Watchdog Timer support for IMX and LSCH2 of NXP"
> - select HW_WATCHDOG
> + select HW_WATCHDOG if !WDT
> help
> Select this to enable the IMX and LSCH2 of Layerscape
> watchdog driver.
> diff --git a/drivers/watchdog/imx_watchdog.c
> b/drivers/watchdog/imx_watchdog.c index 14cc618074..53a3e9f5c7 100644
> --- a/drivers/watchdog/imx_watchdog.c
> +++ b/drivers/watchdog/imx_watchdog.c
> @@ -5,7 +5,9 @@
> */
>
> #include <common.h>
> +#include <dm.h>
> #include <asm/io.h>
> +#include <wdt.h>
> #include <watchdog.h>
> #include <asm/arch/imx-regs.h>
> #ifdef CONFIG_FSL_LSCH2
> @@ -13,20 +15,40 @@
> #endif
> #include <fsl_wdog.h>
>
> -#ifdef CONFIG_IMX_WATCHDOG
> -void hw_watchdog_reset(void)
> +static void imx_watchdog_expire_now(struct watchdog_regs *wdog)
> +{
> + clrsetbits_le16(&wdog->wcr, WCR_WT_MSK, WCR_WDE);
> +
> + writew(0x5555, &wdog->wsr);
> + writew(0xaaaa, &wdog->wsr); /* load minimum 1/2
> second timeout */
> + while (1) {
> + /*
> + * spin for .5 seconds before reset
> + */
> + }
> +}
> +
> +#if !defined(CONFIG_IMX_WATCHDOG) || \
> + (defined(CONFIG_IMX_WATCHDOG) && !CONFIG_IS_ENABLED(WDT))
> +void __attribute__((weak)) reset_cpu(ulong addr)
> {
> -#ifndef CONFIG_WATCHDOG_RESET_DISABLE
> struct watchdog_regs *wdog = (struct watchdog_regs
> *)WDOG1_BASE_ADDR;
> + imx_watchdog_expire_now(wdog);
> +}
> +#endif
> +
> +#if defined(CONFIG_IMX_WATCHDOG)
> +static void imx_watchdog_reset(struct watchdog_regs *wdog)
> +{
> +#ifndef CONFIG_WATCHDOG_RESET_DISABLE
> writew(0x5555, &wdog->wsr);
> writew(0xaaaa, &wdog->wsr);
> #endif /* CONFIG_WATCHDOG_RESET_DISABLE*/
> }
>
> -void hw_watchdog_init(void)
> +static void imx_watchdog_init(struct watchdog_regs *wdog)
> {
> - struct watchdog_regs *wdog = (struct watchdog_regs
> *)WDOG1_BASE_ADDR; u16 timeout;
>
> /*
> @@ -44,21 +66,86 @@ void hw_watchdog_init(void)
> writew(WCR_WDZST | WCR_WDBG | WCR_WDE | WCR_WDT | WCR_SRS |
> WCR_WDA | SET_WCR_WT(timeout), &wdog->wcr);
> #endif /* CONFIG_FSL_LSCH2*/
> - hw_watchdog_reset();
> + imx_watchdog_reset(wdog);
> }
> -#endif
>
> -void __attribute__((weak)) reset_cpu(ulong addr)
> +#if !CONFIG_IS_ENABLED(WDT)
> +void hw_watchdog_reset(void)
> {
> struct watchdog_regs *wdog = (struct watchdog_regs
> *)WDOG1_BASE_ADDR;
> - clrsetbits_le16(&wdog->wcr, WCR_WT_MSK, WCR_WDE);
> + imx_watchdog_reset(wdog);
> +}
>
> - writew(0x5555, &wdog->wsr);
> - writew(0xaaaa, &wdog->wsr); /* load minimum 1/2
> second timeout */
> - while (1) {
> - /*
> - * spin for .5 seconds before reset
> - */
> - }
> +void hw_watchdog_init(void)
> +{
> + struct watchdog_regs *wdog = (struct watchdog_regs
> *)WDOG1_BASE_ADDR; +
> + imx_watchdog_init(wdog);
> +}
> +#else
> +struct imx_wdt_priv {
> + void __iomem *base;
> +};
> +
> +static int imx_wdt_reset(struct udevice *dev)
> +{
> + struct imx_wdt_priv *priv = dev_get_priv(dev);
> +
> + imx_watchdog_reset(priv->base);
> +
> + return 0;
> +}
> +
> +static int imx_wdt_expire_now(struct udevice *dev, ulong flags)
> +{
> + struct imx_wdt_priv *priv = dev_get_priv(dev);
> +
> + imx_watchdog_expire_now(priv->base);
> + hang();
> +
> + return 0;
> +}
> +
> +static int imx_wdt_start(struct udevice *dev, u64 timeout, ulong
> flags) +{
> + struct imx_wdt_priv *priv = dev_get_priv(dev);
> +
> + imx_watchdog_init(priv->base);
> +
> + return 0;
> +}
> +
> +static int imx_wdt_probe(struct udevice *dev)
> +{
> + struct imx_wdt_priv *priv = dev_get_priv(dev);
> +
> + priv->base = dev_read_addr_ptr(dev);
> + if (!priv->base)
> + return -ENOENT;
> +
> + return 0;
> }
> +
> +static const struct wdt_ops imx_wdt_ops = {
> + .start = imx_wdt_start,
> + .reset = imx_wdt_reset,
> + .expire_now = imx_wdt_expire_now,
> +};
> +
> +static const struct udevice_id imx_wdt_ids[] = {
> + { .compatible = "fsl,imx21-wdt" },
> + {}
> +};
> +
> +U_BOOT_DRIVER(imx_wdt) = {
> + .name = "imx_wdt",
> + .id = UCLASS_WDT,
> + .of_match = imx_wdt_ids,
> + .probe = imx_wdt_probe,
> + .ops = &imx_wdt_ops,
> + .priv_auto_alloc_size = sizeof(struct imx_wdt_priv),
> + .flags = DM_FLAG_PRE_RELOC,
> +};
> +#endif
> +#endif
Tested-by: Lukasz Majewski <lukma@denx.de>
Test-HW: i.MX6Q - display5
For the record - one needs to add following code to dts file:
+ wdt-reboot {
+ compatible = "wdt-reboot";
+ wdt = <&wdog1>;
+ };
@ _defconfig:
+CONFIG_SYSRESET=y
+CONFIG_SYSRESET_WATCHDOG=y
@ include/<board_config>.h
+#if defined(CONFIG_SPL_BUILD)
+#undef CONFIG_WDT
+#undef CONFIG_WATCHDOG
+#define CONFIG_HW_WATCHDOG
+#endif
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190604/3e8c1bbf/attachment.sig>
next prev parent reply other threads:[~2019-06-04 21:21 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-12 21:34 [U-Boot] [PATCH 1/2] watchdog: Split WDT from SPL_WDT Marek Vasut
2019-05-12 21:34 ` [U-Boot] [PATCH 2/2] watchdog: imx: Add DM support Marek Vasut
2019-05-15 5:54 ` Peng Fan
2019-06-04 21:21 ` Lukasz Majewski [this message]
2019-05-15 5:46 ` [U-Boot] [PATCH 1/2] watchdog: Split WDT from SPL_WDT Peng Fan
2019-06-04 21:22 ` Lukasz Majewski
2019-06-05 16:24 ` Lukasz Majewski
2019-06-06 7:09 ` Lukasz Majewski
2019-06-06 7:26 ` Marek Vasut
2019-06-06 8:00 ` Lukasz Majewski
2019-06-06 8:08 ` Marek Vasut
2019-06-06 8:16 ` Lukasz Majewski
2019-06-06 8:23 ` Marek Vasut
2019-06-06 8:28 ` Lukasz Majewski
2019-06-08 6:23 ` Lukasz Majewski
2019-06-08 15:32 ` Marek Vasut
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=20190604232140.5e3ab6e6@jawa \
--to=lukma@denx.de \
--cc=u-boot@lists.denx.de \
/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: link
Be 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.