git: ccb0e6e15f3d - main - aw_wdog: Add support for H616
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 09 Feb 2026 10:23:37 UTC
The branch main has been updated by thj:
URL: https://cgit.FreeBSD.org/src/commit/?id=ccb0e6e15f3dd00288d1823ffaf6920916ae457c
commit ccb0e6e15f3dd00288d1823ffaf6920916ae457c
Author: Tom Jones <thj@FreeBSD.org>
AuthorDate: 2026-02-09 10:05:46 +0000
Commit: Tom Jones <thj@FreeBSD.org>
CommitDate: 2026-02-09 10:22:19 +0000
aw_wdog: Add support for H616
Reviewed by: manu
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D54913
---
sys/arm/allwinner/aw_wdog.c | 30 +++++++++++++++++++++++++++---
1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/sys/arm/allwinner/aw_wdog.c b/sys/arm/allwinner/aw_wdog.c
index acfbdd8fe6d0..b6b2749f0cda 100644
--- a/sys/arm/allwinner/aw_wdog.c
+++ b/sys/arm/allwinner/aw_wdog.c
@@ -52,25 +52,32 @@
#define A10_WDOG_CTRL 0x00
#define A31_WDOG_CTRL 0x10
#define D1_WDOG_CTRL 0x10
+#define H616_WDOG_CTRL 0xB0
#define WDOG_CTRL_RESTART (1 << 0)
#define A31_WDOG_CTRL_KEY (0xa57 << 1)
#define D1_WDOG_CTRL_KEY (0xa57 << 1)
+#define H616_WDOG_CTRL_KEY (0xa57 << 1)
#define A10_WDOG_MODE 0x04
#define A31_WDOG_MODE 0x18
#define D1_WDOG_MODE 0x18
+#define H616_WDOG_MODE 0xB8
#define D1_WDOG_MODE_KEY (0x16AA << 16)
#define A10_WDOG_MODE_INTVL_SHIFT 3
#define A31_WDOG_MODE_INTVL_SHIFT 4
#define D1_WDOG_MODE_INTVL_SHIFT 4
+#define H616_WDOG_MODE_INTVL_SHIFT 4
#define A10_WDOG_MODE_RST_EN (1 << 1)
#define WDOG_MODE_EN (1 << 0)
#define A31_WDOG_CONFIG 0x14
#define D1_WDOG_CONFIG 0x14
+#define H616_WDOG_CONFIG 0xB4
#define A31_WDOG_CONFIG_RST_EN_SYSTEM (1 << 0)
#define A31_WDOG_CONFIG_RST_EN_INT (2 << 0)
#define D1_WDOG_CONFIG_KEY (0x16AA << 16)
#define D1_WDOG_CONFIG_RST_EN_SYSTEM (1 << 0)
#define D1_WDOG_CONFIG_RST_EN_INT (2 << 0)
+#define H616_WDOG_CONFIG_RST_EN_SYSTEM (1 << 0)
+#define H616_WDOG_CONFIG_RST_EN_INT (2 << 0)
struct aw_wdog_interval {
uint64_t milliseconds;
@@ -109,14 +116,18 @@ struct aw_wdog_softc {
uint32_t wdog_config_value;
};
-#define A10_WATCHDOG 1
-#define A31_WATCHDOG 2
-#define D1_WATCHDOG 3
+enum wdog_type {
+ A10_WATCHDOG = 1,
+ A31_WATCHDOG,
+ D1_WATCHDOG,
+ H616_WATCHDOG,
+};
static struct ofw_compat_data compat_data[] = {
{"allwinner,sun4i-a10-wdt", A10_WATCHDOG},
{"allwinner,sun6i-a31-wdt", A31_WATCHDOG},
{"allwinner,sun20i-d1-wdt", D1_WATCHDOG},
+ {"allwinner,sun50i-h616-wdt", H616_WATCHDOG},
{NULL, 0}
};
@@ -139,6 +150,9 @@ aw_wdog_probe(device_t dev)
case D1_WATCHDOG:
device_set_desc(dev, "Allwinner D1 Watchdog");
return (BUS_PROBE_DEFAULT);
+ case H616_WATCHDOG:
+ device_set_desc(dev, "Allwinner H616 Watchdog");
+ return (BUS_PROBE_DEFAULT);
}
return (ENXIO);
}
@@ -192,6 +206,16 @@ aw_wdog_attach(device_t dev)
sc->wdog_config = D1_WDOG_CONFIG;
sc->wdog_config_value = D1_WDOG_CONFIG_KEY | D1_WDOG_CONFIG_RST_EN_SYSTEM;
break;
+ case H616_WATCHDOG:
+ sc->wdog_ctrl = H616_WDOG_CTRL;
+ sc->wdog_ctrl_key = H616_WDOG_CTRL_KEY;
+ sc->wdog_mode = H616_WDOG_MODE;
+ sc->wdog_mode_key = 0;
+ sc->wdog_mode_intvl_shift = H616_WDOG_MODE_INTVL_SHIFT;
+ sc->wdog_mode_en = WDOG_MODE_EN;
+ sc->wdog_config = H616_WDOG_CONFIG;
+ sc->wdog_config_value = H616_WDOG_CONFIG_RST_EN_SYSTEM;
+ break;
default:
bus_release_resource(dev, SYS_RES_MEMORY, rid, sc->res);
return (ENXIO);