mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-08-09 08:46:59 +02:00
bcm2835_wdt: support for the BCM2835/2836 watchdog
Signed-off-by: Paolo Pisati <p.pisati@gmail.com>
This commit is contained in:
parent
3e16705d3e
commit
45a6d231b2
@ -21,18 +21,33 @@
|
|||||||
*/
|
*/
|
||||||
#define BCM2835_WDOG_RSTS_RASPBERRYPI_HALT 0x555
|
#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 =
|
__efi_runtime_data struct bcm2835_wdog_regs *wdog_regs =
|
||||||
(struct bcm2835_wdog_regs *)BCM2835_WDOG_PHYSADDR;
|
(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;
|
||||||
|
} else
|
||||||
|
timeout = ticks & BCM2835_WDOG_MAX_TIMEOUT;
|
||||||
|
|
||||||
rstc = readl(&wdog_regs->rstc);
|
rstc = readl(&wdog_regs->rstc);
|
||||||
rstc &= ~BCM2835_WDOG_RSTC_WRCFG_MASK;
|
rstc &= ~BCM2835_WDOG_RSTC_WRCFG_MASK;
|
||||||
rstc |= BCM2835_WDOG_RSTC_WRCFG_FULL_RESET;
|
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);
|
writel(BCM2835_WDOG_PASSWORD | rstc, &wdog_regs->rstc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#ifdef CONFIG_ARM64
|
#ifdef CONFIG_ARM64
|
||||||
#include <asm/armv8/mmu.h>
|
#include <asm/armv8/mmu.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <watchdog.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
@ -455,6 +456,9 @@ static void rpi_disable_inactive_uart(void)
|
|||||||
|
|
||||||
int board_init(void)
|
int board_init(void)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_HW_WATCHDOG
|
||||||
|
hw_watchdog_init();
|
||||||
|
#endif
|
||||||
#ifndef CONFIG_PL01X_SERIAL
|
#ifndef CONFIG_PL01X_SERIAL
|
||||||
rpi_disable_inactive_uart();
|
rpi_disable_inactive_uart();
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,17 @@
|
|||||||
menu "Watchdog Timer Support"
|
menu "Watchdog Timer Support"
|
||||||
|
|
||||||
|
config HW_WATCHDOG
|
||||||
|
bool
|
||||||
|
|
||||||
|
config BCM2835_WDT
|
||||||
|
bool "Enable BCM2835/2836 watchdog driver"
|
||||||
|
select HW_WATCHDOG
|
||||||
|
help
|
||||||
|
Say Y here to enable the BCM2835/2836 watchdog
|
||||||
|
|
||||||
|
This provides basic infrastructure to support BCM2835/2836 watchdog
|
||||||
|
hardware, with a max timeout of ~15secs.
|
||||||
|
|
||||||
config ULP_WATCHDOG
|
config ULP_WATCHDOG
|
||||||
bool "i.MX7ULP watchdog"
|
bool "i.MX7ULP watchdog"
|
||||||
help
|
help
|
||||||
|
@ -18,3 +18,4 @@ obj-$(CONFIG_ULP_WATCHDOG) += ulp_wdog.o
|
|||||||
obj-$(CONFIG_WDT) += wdt-uclass.o
|
obj-$(CONFIG_WDT) += wdt-uclass.o
|
||||||
obj-$(CONFIG_WDT_SANDBOX) += sandbox_wdt.o
|
obj-$(CONFIG_WDT_SANDBOX) += sandbox_wdt.o
|
||||||
obj-$(CONFIG_WDT_ASPEED) += ast_wdt.o
|
obj-$(CONFIG_WDT_ASPEED) += ast_wdt.o
|
||||||
|
obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
|
||||||
|
35
drivers/watchdog/bcm2835_wdt.c
Normal file
35
drivers/watchdog/bcm2835_wdt.c
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Watchdog driver for Broadcom BCM2835
|
||||||
|
*
|
||||||
|
* Copyright (C) 2017 Paolo Pisati <p.pisati@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <efi_loader.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/arch/wdog.h>
|
||||||
|
|
||||||
|
#define SECS_TO_WDOG_TICKS(x) ((x) << 16)
|
||||||
|
#define MAX_TIMEOUT 0xf /* ~15s */
|
||||||
|
|
||||||
|
static __efi_runtime_data bool enabled = true;
|
||||||
|
|
||||||
|
extern void reset_cpu(ulong ticks);
|
||||||
|
|
||||||
|
void hw_watchdog_reset(void)
|
||||||
|
{
|
||||||
|
if (enabled)
|
||||||
|
reset_cpu(SECS_TO_WDOG_TICKS(MAX_TIMEOUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
void hw_watchdog_init(void)
|
||||||
|
{
|
||||||
|
hw_watchdog_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void __efi_runtime hw_watchdog_disable(void)
|
||||||
|
{
|
||||||
|
enabled = false;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user