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 <[email protected]> > Cc: Heiko Schocher <[email protected]> > Cc: Andreas Bießmann <[email protected]> > Cc: Eugen Hristev <[email protected]> > --- > 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. > _______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

