diff --git a/sys/dev/extres/regulator/regulator.c b/sys/dev/extres/regulator/regulator.c index fa294867b57..37817235348 100644 --- a/sys/dev/extres/regulator/regulator.c +++ b/sys/dev/extres/regulator/regulator.c @@ -507,6 +507,20 @@ struct regnode_std_param *regnode_get_stdparam(struct regnode *regnode) return (®node->std_param); } +void +regnode_enable_cnt_inc(struct regnode *regnode) +{ + + regnode->enable_cnt++; +} + +void +regnode_enable_cnt_dec(struct regnode *regnode) +{ + + regnode->enable_cnt--; +} + void regnode_topo_unlock(void) { diff --git a/sys/dev/extres/regulator/regulator.h b/sys/dev/extres/regulator/regulator.h index 7ef6524df35..2f35edca455 100644 --- a/sys/dev/extres/regulator/regulator.h +++ b/sys/dev/extres/regulator/regulator.h @@ -106,6 +106,8 @@ int regnode_get_flags(struct regnode *regnode); void *regnode_get_softc(struct regnode *regnode); device_t regnode_get_device(struct regnode *regnode); struct regnode_std_param *regnode_get_stdparam(struct regnode *regnode); +void regnode_enable_cnt_inc(struct regnode *regnode); +void regnode_enable_cnt_dec(struct regnode *regnode); void regnode_topo_unlock(void); void regnode_topo_xlock(void); void regnode_topo_slock(void); diff --git a/sys/dev/extres/regulator/regulator_fixed.c b/sys/dev/extres/regulator/regulator_fixed.c index 1438181eafe..bb98bb6a463 100644 --- a/sys/dev/extres/regulator/regulator_fixed.c +++ b/sys/dev/extres/regulator/regulator_fixed.c @@ -156,6 +156,8 @@ regnode_fixed_init(struct regnode *regnode) if (sc->gpio_open_drain) flags |= GPIO_PIN_OPENDRAIN; enable = sc->param->boot_on || sc->param->always_on; + if (enable) + regnode_enable_cnt_inc(regnode); if (!sc->param->enable_active_high) enable = !enable; rv = GPIO_PIN_SET(pin->dev, pin->pin, enable); @@ -194,12 +196,14 @@ regnode_fixed_enable(struct regnode *regnode, bool enable, int *udelay) return (0); pin = &sc->gpio_entry->gpio_pin; if (enable) { + regnode_enable_cnt_inc(regnode); sc->gpio_entry->enable_cnt++; if (sc->gpio_entry->enable_cnt > 1) return (0); } else { KASSERT(sc->gpio_entry->enable_cnt > 0, ("Invalid enable count")); + regnode_enable_cnt_dec(regnode); sc->gpio_entry->enable_cnt--; if (sc->gpio_entry->enable_cnt >= 1) return (0);