public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
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>

  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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox