The branch main has been updated by thj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=ccb0e6e15f3dd00288d1823ffaf6920916ae457c

commit ccb0e6e15f3dd00288d1823ffaf6920916ae457c
Author:     Tom Jones <[email protected]>
AuthorDate: 2026-02-09 10:05:46 +0000
Commit:     Tom Jones <[email protected]>
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);

Reply via email to