From bfeb2bd7cab178be6d098455e5c4b24dd3c00ee3 Mon Sep 17 00:00:00 2001 From: Emmanuel Vadot Date: Fri, 20 Apr 2018 20:30:33 +0000 Subject: [PATCH] regulator: Check status before disabling When disabling regulator when they are unused, check before is they are enabled. While here don't check the enable_cnt on the regulator entry as it is checked by regnode_stop. This solve the panic on any board using a fixed regulator that is driven by a gpio when the regulator is unused. Tested On: OrangePi One Pointy Hat to: myself Reported by: kevans, Milan Obuch (freebsd-arm@dino.sk) --- sys/dev/extres/regulator/regulator.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sys/dev/extres/regulator/regulator.c b/sys/dev/extres/regulator/regulator.c index 535665fcd1e..7cebf27aee6 100644 --- a/sys/dev/extres/regulator/regulator.c +++ b/sys/dev/extres/regulator/regulator.c @@ -166,17 +166,19 @@ static void regulator_shutdown(void *dummy) { struct regnode *entry; + int status, ret; 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 (entry->std_param.always_on == 0 && disable) { if (bootverbose) printf("regulator: shuting down %s\n", entry->name); - regnode_stop(entry, 0); + ret = regnode_status(entry, &status); + if (ret == 0 && status == REGULATOR_STATUS_ENABLED) + regnode_stop(entry, 0); } } REG_TOPO_UNLOCK();