Message ID | 20231003062126.42026-2-clamor95@gmail.com |
---|---|
State | Changes Requested |
Delegated to: | Jaehoon Chung |
Headers | show |
Series | General regulator and pmic uclass improvements | expand |
On 2023-10-03 08:21, Svyatoslav Ryhel wrote: > Commit is based on 4fcba5d ("regulator: implement basic reference > counter") but expands the idea to all regulators instead of just > fixed/gpio regulators. > > Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com> > Reviewed-by: Simon Glass <sjg@chromium.org> > --- > drivers/power/regulator/regulator-uclass.c | 41 ++++++++++++++++++++++ > drivers/power/regulator/regulator_common.c | 22 ------------ > drivers/power/regulator/regulator_common.h | 21 ----------- > include/power/regulator.h | 2 ++ > 4 files changed, 43 insertions(+), 43 deletions(-) > > diff --git a/drivers/power/regulator/regulator-uclass.c b/drivers/power/regulator/regulator-uclass.c > index d5a79d861c..4b2c6c2964 100644 > --- a/drivers/power/regulator/regulator-uclass.c > +++ b/drivers/power/regulator/regulator-uclass.c > @@ -159,6 +159,25 @@ int regulator_get_enable(struct udevice *dev) > return ops->get_enable(dev); > } > > +/* > + * Enable or Disable a regulator > + * > + * This is a reentrant function and subsequent calls that enable will > + * increase an internal counter, and disable calls will decrease the counter. > + * The actual resource will be enabled when the counter gets to 1 coming from 0, > + * and disabled when it reaches 0 coming from 1. > + * > + * @dev: regulator device > + * @enable: bool indicating whether to enable or disable the regulator > + * @return: > + * 0 on Success > + * -EBUSY if the regulator cannot be disabled because it's requested by > + * another device > + * -EALREADY if the regulator has already been enabled or has already been > + * disabled > + * -EACCES if there is no possibility to enable/disable the regulator > + * -ve on different error situation > + */ Maybe better to replace the existing comment for this function in include/power/regulator.h ? Regards, Jonas > int regulator_set_enable(struct udevice *dev, bool enable) > { > const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); > @@ -172,6 +191,23 @@ int regulator_set_enable(struct udevice *dev, bool enable) > if (!enable && uc_pdata->always_on) > return -EACCES; > > + /* If previously enabled, increase count */ > + if (enable && uc_pdata->enable_count > 0) { > + uc_pdata->enable_count++; > + return -EALREADY; > + } > + > + if (!enable) { > + if (uc_pdata->enable_count > 1) { > + /* If enabled multiple times, decrease count */ > + uc_pdata->enable_count--; > + return -EBUSY; > + } else if (!uc_pdata->enable_count) { > + /* If already disabled, do nothing */ > + return -EALREADY; > + } > + } > + > if (uc_pdata->ramp_delay) > old_enable = regulator_get_enable(dev); > > @@ -187,6 +223,11 @@ int regulator_set_enable(struct udevice *dev, bool enable) > } > } > > + if (enable) > + uc_pdata->enable_count++; > + else > + uc_pdata->enable_count--; > + > return ret; > } > > diff --git a/drivers/power/regulator/regulator_common.c b/drivers/power/regulator/regulator_common.c > index 0116fa01bb..62d06bf616 100644 > --- a/drivers/power/regulator/regulator_common.c > +++ b/drivers/power/regulator/regulator_common.c > @@ -74,23 +74,6 @@ int regulator_common_set_enable(const struct udevice *dev, > return 0; > } > > - /* If previously enabled, increase count */ > - if (enable && plat->enable_count > 0) { > - plat->enable_count++; > - return -EALREADY; > - } > - > - if (!enable) { > - if (plat->enable_count > 1) { > - /* If enabled multiple times, decrease count */ > - plat->enable_count--; > - return -EBUSY; > - } else if (!plat->enable_count) { > - /* If already disabled, do nothing */ > - return -EALREADY; > - } > - } > - > ret = dm_gpio_set_value(&plat->gpio, enable); > if (ret) { > pr_err("Can't set regulator : %s gpio to: %d\n", dev->name, > @@ -105,10 +88,5 @@ int regulator_common_set_enable(const struct udevice *dev, > if (!enable && plat->off_on_delay_us) > udelay(plat->off_on_delay_us); > > - if (enable) > - plat->enable_count++; > - else > - plat->enable_count--; > - > return 0; > } > diff --git a/drivers/power/regulator/regulator_common.h b/drivers/power/regulator/regulator_common.h > index d4962899d8..15f1fa4c93 100644 > --- a/drivers/power/regulator/regulator_common.h > +++ b/drivers/power/regulator/regulator_common.h > @@ -13,7 +13,6 @@ struct regulator_common_plat { > struct gpio_desc gpio; /* GPIO for regulator enable control */ > unsigned int startup_delay_us; > unsigned int off_on_delay_us; > - unsigned int enable_count; > }; > > int regulator_common_of_to_plat(struct udevice *dev, > @@ -21,26 +20,6 @@ int regulator_common_of_to_plat(struct udevice *dev, > char *enable_gpio_name); > int regulator_common_get_enable(const struct udevice *dev, > struct regulator_common_plat *plat); > -/* > - * Enable or Disable a regulator > - * > - * This is a reentrant function and subsequent calls that enable will > - * increase an internal counter, and disable calls will decrease the counter. > - * The actual resource will be enabled when the counter gets to 1 coming from 0, > - * and disabled when it reaches 0 coming from 1. > - * > - * @dev: regulator device > - * @plat: Platform data > - * @enable: bool indicating whether to enable or disable the regulator > - * @return: > - * 0 on Success > - * -EBUSY if the regulator cannot be disabled because it's requested by > - * another device > - * -EALREADY if the regulator has already been enabled or has already been > - * disabled > - * -EACCES if there is no possibility to enable/disable the regulator > - * -ve on different error situation > - */ > int regulator_common_set_enable(const struct udevice *dev, > struct regulator_common_plat *plat, bool enable); > > diff --git a/include/power/regulator.h b/include/power/regulator.h > index 200652cb3d..1c7995bd5d 100644 > --- a/include/power/regulator.h > +++ b/include/power/regulator.h > @@ -159,6 +159,7 @@ enum regulator_flag { > * @name** - fdt regulator name - should be taken from the device tree > * ctrl_reg: - Control register offset used to enable/disable regulator > * volt_reg: - register offset for writing voltage vsel values > + * enable_count - counter of enable calls for this regulator > * > * Note: > * * - set automatically on device probe by the uclass's '.pre_probe' method. > @@ -185,6 +186,7 @@ struct dm_regulator_uclass_plat { > u8 volt_reg; > bool suspend_on; > u32 suspend_uV; > + u32 enable_count; > }; > > /* Regulator device operations */
diff --git a/drivers/power/regulator/regulator-uclass.c b/drivers/power/regulator/regulator-uclass.c index d5a79d861c..4b2c6c2964 100644 --- a/drivers/power/regulator/regulator-uclass.c +++ b/drivers/power/regulator/regulator-uclass.c @@ -159,6 +159,25 @@ int regulator_get_enable(struct udevice *dev) return ops->get_enable(dev); } +/* + * Enable or Disable a regulator + * + * This is a reentrant function and subsequent calls that enable will + * increase an internal counter, and disable calls will decrease the counter. + * The actual resource will be enabled when the counter gets to 1 coming from 0, + * and disabled when it reaches 0 coming from 1. + * + * @dev: regulator device + * @enable: bool indicating whether to enable or disable the regulator + * @return: + * 0 on Success + * -EBUSY if the regulator cannot be disabled because it's requested by + * another device + * -EALREADY if the regulator has already been enabled or has already been + * disabled + * -EACCES if there is no possibility to enable/disable the regulator + * -ve on different error situation + */ int regulator_set_enable(struct udevice *dev, bool enable) { const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); @@ -172,6 +191,23 @@ int regulator_set_enable(struct udevice *dev, bool enable) if (!enable && uc_pdata->always_on) return -EACCES; + /* If previously enabled, increase count */ + if (enable && uc_pdata->enable_count > 0) { + uc_pdata->enable_count++; + return -EALREADY; + } + + if (!enable) { + if (uc_pdata->enable_count > 1) { + /* If enabled multiple times, decrease count */ + uc_pdata->enable_count--; + return -EBUSY; + } else if (!uc_pdata->enable_count) { + /* If already disabled, do nothing */ + return -EALREADY; + } + } + if (uc_pdata->ramp_delay) old_enable = regulator_get_enable(dev); @@ -187,6 +223,11 @@ int regulator_set_enable(struct udevice *dev, bool enable) } } + if (enable) + uc_pdata->enable_count++; + else + uc_pdata->enable_count--; + return ret; } diff --git a/drivers/power/regulator/regulator_common.c b/drivers/power/regulator/regulator_common.c index 0116fa01bb..62d06bf616 100644 --- a/drivers/power/regulator/regulator_common.c +++ b/drivers/power/regulator/regulator_common.c @@ -74,23 +74,6 @@ int regulator_common_set_enable(const struct udevice *dev, return 0; } - /* If previously enabled, increase count */ - if (enable && plat->enable_count > 0) { - plat->enable_count++; - return -EALREADY; - } - - if (!enable) { - if (plat->enable_count > 1) { - /* If enabled multiple times, decrease count */ - plat->enable_count--; - return -EBUSY; - } else if (!plat->enable_count) { - /* If already disabled, do nothing */ - return -EALREADY; - } - } - ret = dm_gpio_set_value(&plat->gpio, enable); if (ret) { pr_err("Can't set regulator : %s gpio to: %d\n", dev->name, @@ -105,10 +88,5 @@ int regulator_common_set_enable(const struct udevice *dev, if (!enable && plat->off_on_delay_us) udelay(plat->off_on_delay_us); - if (enable) - plat->enable_count++; - else - plat->enable_count--; - return 0; } diff --git a/drivers/power/regulator/regulator_common.h b/drivers/power/regulator/regulator_common.h index d4962899d8..15f1fa4c93 100644 --- a/drivers/power/regulator/regulator_common.h +++ b/drivers/power/regulator/regulator_common.h @@ -13,7 +13,6 @@ struct regulator_common_plat { struct gpio_desc gpio; /* GPIO for regulator enable control */ unsigned int startup_delay_us; unsigned int off_on_delay_us; - unsigned int enable_count; }; int regulator_common_of_to_plat(struct udevice *dev, @@ -21,26 +20,6 @@ int regulator_common_of_to_plat(struct udevice *dev, char *enable_gpio_name); int regulator_common_get_enable(const struct udevice *dev, struct regulator_common_plat *plat); -/* - * Enable or Disable a regulator - * - * This is a reentrant function and subsequent calls that enable will - * increase an internal counter, and disable calls will decrease the counter. - * The actual resource will be enabled when the counter gets to 1 coming from 0, - * and disabled when it reaches 0 coming from 1. - * - * @dev: regulator device - * @plat: Platform data - * @enable: bool indicating whether to enable or disable the regulator - * @return: - * 0 on Success - * -EBUSY if the regulator cannot be disabled because it's requested by - * another device - * -EALREADY if the regulator has already been enabled or has already been - * disabled - * -EACCES if there is no possibility to enable/disable the regulator - * -ve on different error situation - */ int regulator_common_set_enable(const struct udevice *dev, struct regulator_common_plat *plat, bool enable); diff --git a/include/power/regulator.h b/include/power/regulator.h index 200652cb3d..1c7995bd5d 100644 --- a/include/power/regulator.h +++ b/include/power/regulator.h @@ -159,6 +159,7 @@ enum regulator_flag { * @name** - fdt regulator name - should be taken from the device tree * ctrl_reg: - Control register offset used to enable/disable regulator * volt_reg: - register offset for writing voltage vsel values + * enable_count - counter of enable calls for this regulator * * Note: * * - set automatically on device probe by the uclass's '.pre_probe' method. @@ -185,6 +186,7 @@ struct dm_regulator_uclass_plat { u8 volt_reg; bool suspend_on; u32 suspend_uV; + u32 enable_count; }; /* Regulator device operations */