Index: sys/dev/extres/regulator/regulator.c =================================================================== --- sys/dev/extres/regulator/regulator.c +++ sys/dev/extres/regulator/regulator.c @@ -71,6 +71,7 @@ static int regnode_method_set_voltage(struct regnode *regnode, int min_uvolt, int max_uvolt, int *udelay); static int regnode_method_get_voltage(struct regnode *regnode, int *uvolt); +static void regulator_shutdown(void *dummy); /* * Regulator controller methods. @@ -151,6 +152,29 @@ #define REGNODE_XLOCK(_sc) sx_xlock(&((_sc)->lock)) #define REGNODE_UNLOCK(_sc) sx_unlock(&((_sc)->lock)) +SYSINIT(regulator_shutdown, SI_SUB_LAST, SI_ORDER_ANY, regulator_shutdown, + NULL); + +static void +regulator_shutdown(void *dummy) +{ + struct regnode *entry; + int disable = 1; + + REG_TOPO_SLOCK(); + TUNABLE_INT_FETCH("hw.regulator.disable_unused", &disable); + TAILQ_FOREACH(entry, ®node_list, reglist_link) { + if (entry->enable_cnt == 0 && + entry->std_param.always_on == 0 && disable) { + if (bootverbose) + printf("regulator: shuting down %s\n", + entry->name); + regnode_stop(entry, 0); + } + } + REG_TOPO_UNLOCK(); +} + /* * sysctl handler */