* [U-Boot] [PATCH] bcm2835: wdt: support for the bcm2835/2836 wdt
@ 2017-01-27 9:59 Paolo Pisati
2017-01-27 9:59 ` [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog Paolo Pisati
0 siblings, 1 reply; 6+ messages in thread
From: Paolo Pisati @ 2017-01-27 9:59 UTC (permalink / raw)
To: u-boot
The following patch add support for the watchdog built into the
bcm2835/2836 chips, using the max timeout (~15s).
By default the watchdog is compiled in, but disabled.
To enable it, apply the following patch:
--- a/include/configs/rpi.h
+++ b/include/configs/rpi.h
@@ -109,6 +109,7 @@
/* Watchdog support */
#define CONFIG_BCM2835_WDT
+#define CONFIG_HW_WATCHDOG
/* Console configuration */
#define CONFIG_SYS_CBSIZE 1024
--
2.7.4
Tested on my RaspberryPi2.
Paolo Pisati (1):
bcm2835_wdt: support for the BCM2835/2836 watchdog
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
--
2.7.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog
2017-01-27 9:59 [U-Boot] [PATCH] bcm2835: wdt: support for the bcm2835/2836 wdt Paolo Pisati
@ 2017-01-27 9:59 ` Paolo Pisati
2017-01-27 16:20 ` Brüns, Stefan
0 siblings, 1 reply; 6+ messages in thread
From: Paolo Pisati @ 2017-01-27 9:59 UTC (permalink / raw)
To: u-boot
Signed-off-by: Paolo Pisati <p.pisati@gmail.com>
---
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;
+ } 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
@@ -22,6 +22,7 @@
#ifdef CONFIG_ARM64
#include <asm/armv8/mmu.h>
#endif
+#include <watchdog.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -478,6 +479,9 @@ static void rpi_disable_inactive_uart(void)
int board_init(void)
{
+#ifdef CONFIG_HW_WATCHDOG
+ hw_watchdog_init();
+#endif
#ifndef CONFIG_PL01X_SERIAL
rpi_disable_inactive_uart();
#endif
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index a007ae8..3b328ec 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -15,3 +15,4 @@ obj-$(CONFIG_XILINX_TB_WATCHDOG) += xilinx_tb_wdt.o
obj-$(CONFIG_BFIN_WATCHDOG) += bfin_wdt.o
obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt.o
obj-$(CONFIG_DESIGNWARE_WATCHDOG) += designware_wdt.o
+obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
new file mode 100644
index 0000000..c76b164
--- /dev/null
+++ b/drivers/watchdog/bcm2835_wdt.c
@@ -0,0 +1,34 @@
+/*
+ * Watchdog driver for Broadcom BCM2835
+ *
+ * Copyright (C) 2017 Paolo Pisati <p.pisati@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/wdog.h>
+
+#define SECS_TO_WDOG_TICKS(x) ((x) << 16)
+#define MAX_TIMEOUT 0xf /* ~15s */
+
+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 hw_watchdog_disable(void)
+{
+ enabled = false;
+}
diff --git a/include/configs/rpi.h b/include/configs/rpi.h
index 45d8824..c34c84b 100644
--- a/include/configs/rpi.h
+++ b/include/configs/rpi.h
@@ -107,6 +107,9 @@
#define CONFIG_CONS_INDEX 0
#define CONFIG_BAUDRATE 115200
+/* Watchdog support */
+#define CONFIG_BCM2835_WDT
+
/* Console configuration */
#define CONFIG_SYS_CBSIZE 1024
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + \
diff --git a/scripts/config_whitelist.txt b/scripts/config_whitelist.txt
index 00ee3f1..eb6cb8a 100644
--- 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
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog
2017-01-27 11:38 [U-Boot] [PATCH] bcm2835: wdt: support for the bcm2835/2836 wdt Paolo Pisati
@ 2017-01-27 11:38 ` Paolo Pisati
0 siblings, 0 replies; 6+ messages in thread
From: Paolo Pisati @ 2017-01-27 11:38 UTC (permalink / raw)
To: u-boot
Signed-off-by: Paolo Pisati <p.pisati@gmail.com>
---
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;
+ } 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
@@ -22,6 +22,7 @@
#ifdef CONFIG_ARM64
#include <asm/armv8/mmu.h>
#endif
+#include <watchdog.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -478,6 +479,9 @@ static void rpi_disable_inactive_uart(void)
int board_init(void)
{
+#ifdef CONFIG_HW_WATCHDOG
+ hw_watchdog_init();
+#endif
#ifndef CONFIG_PL01X_SERIAL
rpi_disable_inactive_uart();
#endif
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index a007ae8..3b328ec 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -15,3 +15,4 @@ obj-$(CONFIG_XILINX_TB_WATCHDOG) += xilinx_tb_wdt.o
obj-$(CONFIG_BFIN_WATCHDOG) += bfin_wdt.o
obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt.o
obj-$(CONFIG_DESIGNWARE_WATCHDOG) += designware_wdt.o
+obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
new file mode 100644
index 0000000..c76b164
--- /dev/null
+++ b/drivers/watchdog/bcm2835_wdt.c
@@ -0,0 +1,34 @@
+/*
+ * Watchdog driver for Broadcom BCM2835
+ *
+ * Copyright (C) 2017 Paolo Pisati <p.pisati@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/wdog.h>
+
+#define SECS_TO_WDOG_TICKS(x) ((x) << 16)
+#define MAX_TIMEOUT 0xf /* ~15s */
+
+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 hw_watchdog_disable(void)
+{
+ enabled = false;
+}
diff --git a/include/configs/rpi.h b/include/configs/rpi.h
index 883634a..ff057b7 100644
--- a/include/configs/rpi.h
+++ b/include/configs/rpi.h
@@ -107,6 +107,9 @@
#define CONFIG_CONS_INDEX 0
#define CONFIG_BAUDRATE 115200
+/* Watchdog support */
+#define CONFIG_BCM2835_WDT
+
/* Console configuration */
#define CONFIG_SYS_CBSIZE 1024
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + \
diff --git a/scripts/config_whitelist.txt b/scripts/config_whitelist.txt
index 00ee3f1..eb6cb8a 100644
--- 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
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog
2017-01-27 9:59 ` [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog Paolo Pisati
@ 2017-01-27 16:20 ` Brüns, Stefan
2017-02-10 15:18 ` Paolo Pisati
0 siblings, 1 reply; 6+ messages in thread
From: Brüns, Stefan @ 2017-01-27 16:20 UTC (permalink / raw)
To: u-boot
On Freitag, 27. Januar 2017 10:59:05 CET Paolo Pisati wrote:
> Signed-off-by: Paolo Pisati <p.pisati@gmail.com>
> ---
> 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
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog
2017-01-27 16:20 ` Brüns, Stefan
@ 2017-02-10 15:18 ` Paolo Pisati
0 siblings, 0 replies; 6+ messages in thread
From: Paolo Pisati @ 2017-02-10 15:18 UTC (permalink / raw)
To: u-boot
On Fri, Jan 27, 2017 at 04:20:10PM +0000, Br?ns, Stefan wrote:
> > ...
> > +
> > __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.
Ok.
> Actually, I can see no reason the watchdog setup piggybacks on the reset_cpu
> funtion.
Because there's a window after reset_cpu() is called but before real reset happens,
and if hw_watchdog_reset() is called in between, it breaks the reset procedure.
There must be a mechanism for reset_cpu() to disable the watchdog driver so it
won't interfere.
>
> I think the rule is no new CONFIG_xxx options, but appropriate options in
> KConfig.
I'll send a V2.
--
bye,
p.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog
2017-02-10 16:28 [U-Boot] [PATCH] [V2] bcm2835: wdt: support for the bcm2835/2836 wdt Paolo Pisati
@ 2017-02-10 16:28 ` Paolo Pisati
0 siblings, 0 replies; 6+ messages in thread
From: Paolo Pisati @ 2017-02-10 16:28 UTC (permalink / raw)
To: u-boot
Signed-off-by: Paolo Pisati <p.pisati@gmail.com>
---
arch/arm/mach-bcm283x/reset.c | 21 ++++++++++++++++++---
board/raspberrypi/rpi/rpi.c | 4 ++++
drivers/watchdog/Kconfig | 15 +++++++++++++++
drivers/watchdog/Makefile | 1 +
drivers/watchdog/bcm2835_wdt.c | 35 +++++++++++++++++++++++++++++++++++
5 files changed, 73 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;
+ } 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
@@ -22,6 +22,7 @@
#ifdef CONFIG_ARM64
#include <asm/armv8/mmu.h>
#endif
+#include <watchdog.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -478,6 +479,9 @@ static void rpi_disable_inactive_uart(void)
int board_init(void)
{
+#ifdef CONFIG_HW_WATCHDOG
+ hw_watchdog_init();
+#endif
#ifndef CONFIG_PL01X_SERIAL
rpi_disable_inactive_uart();
#endif
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index e69de29..1a84c41 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -0,0 +1,15 @@
+menu "Watchdog 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.
+
+endmenu
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index a007ae8..3b328ec 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -15,3 +15,4 @@ obj-$(CONFIG_XILINX_TB_WATCHDOG) += xilinx_tb_wdt.o
obj-$(CONFIG_BFIN_WATCHDOG) += bfin_wdt.o
obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt.o
obj-$(CONFIG_DESIGNWARE_WATCHDOG) += designware_wdt.o
+obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
new file mode 100644
index 0000000..6f753ae
--- /dev/null
+++ b/drivers/watchdog/bcm2835_wdt.c
@@ -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;
+}
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-02-10 16:28 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-27 9:59 [U-Boot] [PATCH] bcm2835: wdt: support for the bcm2835/2836 wdt Paolo Pisati
2017-01-27 9:59 ` [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog Paolo Pisati
2017-01-27 16:20 ` Brüns, Stefan
2017-02-10 15:18 ` Paolo Pisati
-- strict thread matches above, loose matches on Subject: below --
2017-01-27 11:38 [U-Boot] [PATCH] bcm2835: wdt: support for the bcm2835/2836 wdt Paolo Pisati
2017-01-27 11:38 ` [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog Paolo Pisati
2017-02-10 16:28 [U-Boot] [PATCH] [V2] bcm2835: wdt: support for the bcm2835/2836 wdt Paolo Pisati
2017-02-10 16:28 ` [U-Boot] [PATCH] bcm2835_wdt: support for the BCM2835/2836 watchdog Paolo Pisati
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox