[U-Boot] [PATCH 07/13 v3] arm: at91: Enable watchdog support

Eugen.Hristev at microchip.com Eugen.Hristev at microchip.com
Tue Apr 2 11:26:21 UTC 2019



On 02.04.2019 11:57, Stefan Roese wrote:

> 
> This patch enables and starts the watchdog on the AT91 platform if
> configured. The WD timeout value is read in the AT91 WD device driver
> from the DT, using the "timeout-sec" DT property. If not provided in
> the DT, the default value of 2 seconds is used.
> 
> Signed-off-by: Stefan Roese <sr at denx.de>
> Cc: Heiko Schocher <hs at denx.de>
> Cc: Andreas Bießmann <andreas at biessmann.org>
> Cc: Eugen Hristev <eugen.hristev at microchip.com>
> ---
> v3:
> - Move WDT struct and macros into arch header so that it can be used
>    by the arch code to start the driver (timeout value)
> - This change now enables the use of the "timeout-sec" DT property
>    to specifiy a board specific WD timeout value


Hi Stefan,

This breaks pm9261_defconfig

  AS      arch/arm/mach-at91/arm926ejs/lowlevel_init.o
./arch/arm/include/asm/arch/at91_wdt.h: Assembler messages:
./arch/arm/include/asm/arch/at91_wdt.h:50: Error: bad instruction 
`struct at91_wdt_priv {'
./arch/arm/include/asm/arch/at91_wdt.h:51: Error: bad instruction `void 
__iomem*regs'
./arch/arm/include/asm/arch/at91_wdt.h:52: Error: bad instruction `u32 
regval'
./arch/arm/include/asm/arch/at91_wdt.h:53: Error: bad instruction `u32 
timeout'
./arch/arm/include/asm/arch/at91_wdt.h:54: Error: junk at end of line, 
first unrecognized character is `}'
scripts/Makefile.build:314: recipe for target 
'arch/arm/mach-at91/arm926ejs/lowlevel_init.o' failed


> 
> v2:
> - Remove #ifdef to enable compilation also in SPL version
> 
>   arch/arm/mach-at91/clock.c                 | 48 ++++++++++++++++++++++
>   arch/arm/mach-at91/include/mach/at91_wdt.h | 10 +++++
>   drivers/watchdog/at91sam9_wdt.c            | 10 -----
>   3 files changed, 58 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c
> index 64cbc3d1ed..1d3df2c09d 100644
> --- a/arch/arm/mach-at91/clock.c
> +++ b/arch/arm/mach-at91/clock.c
> @@ -5,12 +5,17 @@
>    */
>   
>   #include <common.h>
> +#include <dm.h>
> +#include <wdt.h>
>   #include <asm/io.h>
>   #include <asm/arch/hardware.h>
>   #include <asm/arch/at91_pmc.h>
> +#include <asm/arch/at91_wdt.h>
>   
>   #define EN_UPLL_TIMEOUT		500
>   
> +static struct udevice *watchdog_dev __attribute__((section(".data"))) = NULL;
> +
>   void at91_periph_clk_enable(int id)
>   {
>   	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
> @@ -118,3 +123,46 @@ void at91_pllicpr_init(u32 icpr)
>   
>   	writel(icpr, &pmc->pllicpr);
>   }
> +
> +/* Called by macro WATCHDOG_RESET */
> +void watchdog_reset(void)
> +{
> +	static ulong next_reset;
> +	ulong now;
> +
> +	if (!watchdog_dev)
> +		return;
> +
> +	now = get_timer(0);
> +
> +	/* Do not reset the watchdog too often */
> +	if (now > next_reset) {
> +		next_reset = now + 1000;	/* reset every 1000ms */
> +		wdt_reset(watchdog_dev);
> +	}
> +}
> +
> +int arch_early_init_r(void)
> +{
> +	struct at91_wdt_priv *priv;
> +
> +	/* Init watchdog */
> +	if (uclass_get_device_by_seq(UCLASS_WDT, 0, &watchdog_dev)) {
> +		debug("Watchdog: Not found by seq!\n");
> +		if (uclass_get_device(UCLASS_WDT, 0, &watchdog_dev)) {
> +			puts("Watchdog: Not found!\n");
> +			return 0;
> +		}
> +	}
> +
> +	priv = dev_get_priv(watchdog_dev);
> +	if (!priv) {
> +		printf("Watchdog: priv not available!\n");
> +		return 0;
> +	}
> +
> +	wdt_start(watchdog_dev, priv->timeout * 1000, 0);
> +	printf("Watchdog: Started\n");
> +
> +	return 0;
> +}
> diff --git a/arch/arm/mach-at91/include/mach/at91_wdt.h b/arch/arm/mach-at91/include/mach/at91_wdt.h
> index cd2272367b..c977b090c8 100644
> --- a/arch/arm/mach-at91/include/mach/at91_wdt.h
> +++ b/arch/arm/mach-at91/include/mach/at91_wdt.h
> @@ -43,4 +43,14 @@ typedef struct at91_wdt {
>   #define AT91_WDT_MR_WDDBGHLT		0x10000000
>   #define AT91_WDT_MR_WDIDLEHLT		0x20000000
>   
> +/* Hardware timeout in seconds */
> +#define WDT_MAX_TIMEOUT		16
> +#define WDT_DEFAULT_TIMEOUT	2
> +
> +struct at91_wdt_priv {
> +	void __iomem *regs;
> +	u32 regval;
> +	u32 timeout;
> +};
> +
>   #endif
> diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
> index 1c71778bdc..793425c8d2 100644
> --- a/drivers/watchdog/at91sam9_wdt.c
> +++ b/drivers/watchdog/at91sam9_wdt.c
> @@ -31,16 +31,6 @@ DECLARE_GLOBAL_DATA_PTR;
>    */
>   #define WDT_SEC2TICKS(s)	(((s) << 8) - 1)
>   
> -/* Hardware timeout in seconds */
> -#define WDT_MAX_TIMEOUT		16
> -#define WDT_DEFAULT_TIMEOUT	2
> -
> -struct at91_wdt_priv {
> -	void __iomem *regs;
> -	u32 regval;
> -	u32 timeout;
> -};
> -
>   /*
>    * Set the watchdog time interval in 1/256Hz (write-once)
>    * Counter is 12 bit.
> 


More information about the U-Boot mailing list