Index: sys/arm64/rockchip/rk805.c =================================================================== --- sys/arm64/rockchip/rk805.c +++ sys/arm64/rockchip/rk805.c @@ -31,8 +31,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -850,6 +852,28 @@ return (error); } +static void +rk805_shutdown(void *pdev, int howto) +{ + device_t dev; + int error; + uint8_t val; + + if ((howto & RB_POWEROFF) == 0) + return; + + dev = (device_t)pdev; + if (bootverbose) + device_printf(dev, "shutdown...\n"); + error = rk805_read(dev, RK805_DEV_CTRL, &val, 1); + if (error == 0) { + val |= RK805_DEV_CTRL_OFF; + error = rk805_write(dev, RK805_DEV_CTRL, &val, 1); + } + if (error != 0) + device_printf(dev, "... failed\n"); +} + static int rk805_attach(device_t dev) { @@ -913,6 +937,13 @@ } } + if (OF_hasprop(ofw_bus_get_node(dev), + "rockchip,system-power-controller")) { + /* The priority is chosen to override PSCI and EFI shutdown. */ + EVENTHANDLER_REGISTER(shutdown_final, rk805_shutdown, dev, + SHUTDOWN_PRI_LAST - 2); + } + return (0); } Index: sys/arm64/rockchip/rk805reg.h =================================================================== --- sys/arm64/rockchip/rk805reg.h +++ sys/arm64/rockchip/rk805reg.h @@ -93,6 +93,10 @@ #define RK808_LDO8_ON_VSEL 0x49 #define RK808_LDO8_SLEEP_VSEL 0x4A +#define RK805_DEV_CTRL 0x4B +#define RK805_DEV_CTRL_OFF (1 << 0) +#define RK805_DEV_CTRL_SLP (1 << 1) + enum rk805_regulator { RK805_DCDC1 = 0, RK805_DCDC2,