From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?iso-8859-1?Q?Br=FCns=2C_Stefan?= Date: Fri, 27 Jan 2017 16:20:10 +0000 Subject: [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog In-Reply-To: <1485511145-31425-2-git-send-email-p.pisati@gmail.com> References: <1485511145-31425-1-git-send-email-p.pisati@gmail.com> <1485511145-31425-2-git-send-email-p.pisati@gmail.com> Message-ID: <2765682.6PCLvXzOU7@sbruens-linux> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Freitag, 27. Januar 2017 10:59:05 CET Paolo Pisati wrote: > Signed-off-by: Paolo Pisati > --- > arch/arm/mach-bcm283x/reset.c | 21 ++++++++++++++++++--- > board/raspberrypi/rpi/rpi.c | 4 ++++ > drivers/watchdog/Makefile | 1 + > drivers/watchdog/bcm2835_wdt.c | 34 ++++++++++++++++++++++++++++++++++ > include/configs/rpi.h | 3 +++ > scripts/config_whitelist.txt | 1 + > 6 files changed, 61 insertions(+), 3 deletions(-) > create mode 100644 drivers/watchdog/bcm2835_wdt.c > > diff --git a/arch/arm/mach-bcm283x/reset.c b/arch/arm/mach-bcm283x/reset.c > index 685815c..b62cb8a 100644 > --- a/arch/arm/mach-bcm283x/reset.c > +++ b/arch/arm/mach-bcm283x/reset.c > @@ -21,18 +21,33 @@ > */ > #define BCM2835_WDOG_RSTS_RASPBERRYPI_HALT 0x555 > > +/* max ticks timeout */ > +#define BCM2835_WDOG_MAX_TIMEOUT 0x000fffff > + > +#ifdef CONFIG_BCM2835_WDT > +extern void hw_watchdog_disable(void); > +#else > +void hw_watchdog_disable(void) {} > +#endif > + > __efi_runtime_data struct bcm2835_wdog_regs *wdog_regs = > (struct bcm2835_wdog_regs *)BCM2835_WDOG_PHYSADDR; > > -void __efi_runtime reset_cpu(ulong addr) > +void __efi_runtime reset_cpu(ulong ticks) > { > - uint32_t rstc; > + uint32_t rstc, timeout; > + > + if (ticks == 0) { > + hw_watchdog_disable(); > + timeout = RESET_TIMEOUT; This is wrong. The efi runtime reset function calls this as reset_cpu(0), and then tries to call hw_watchdog_disable, which is not marked as __efi_runtime. Actually, I can see no reason the watchdog setup piggybacks on the reset_cpu funtion. > + } else > + timeout = ticks & BCM2835_WDOG_MAX_TIMEOUT; > > rstc = readl(&wdog_regs->rstc); > rstc &= ~BCM2835_WDOG_RSTC_WRCFG_MASK; > rstc |= BCM2835_WDOG_RSTC_WRCFG_FULL_RESET; > > - writel(BCM2835_WDOG_PASSWORD | RESET_TIMEOUT, &wdog_regs->wdog); > + writel(BCM2835_WDOG_PASSWORD | timeout, &wdog_regs->wdog); > writel(BCM2835_WDOG_PASSWORD | rstc, &wdog_regs->rstc); > } > > diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c > index 22e87a2..106e518 100644 > --- a/board/raspberrypi/rpi/rpi.c > +++ b/board/raspberrypi/rpi/rpi.c [...] > --- a/scripts/config_whitelist.txt > +++ b/scripts/config_whitelist.txt > @@ -294,6 +294,7 @@ CONFIG_BCH_CONST_M > CONFIG_BCH_CONST_PARAMS > CONFIG_BCH_CONST_T > CONFIG_BCM2835_GPIO > +CONFIG_BCM2835_WDT > CONFIG_BCM283X_MU_SERIAL > CONFIG_BCM_SF2_ETH > CONFIG_BCM_SF2_ETH_DEFAULT_PORT I think the rule is no new CONFIG_xxx options, but appropriate options in KConfig. Kind regards, Stefan