diff mbox series

pmic: pca9450: permit config on all bucks and LDOs

Message ID 20220620034948.646319-1-heiko.thiery@gmail.com
State Accepted
Commit 67b5663d771121b3d606fc3346dc83024618448b
Delegated to: Jaehoon Chung
Headers show
Series pmic: pca9450: permit config on all bucks and LDOs | expand

Commit Message

Heiko Thiery June 20, 2022, 3:49 a.m. UTC
In order to have the possibility to configure the regulators at system
startup through DM support, all LDOs and bucks must be able to be
changeable. Currently there is a limitation to change the values when
the output is enabled. Since the driver is based on the ROHM BD71837 and a
comment that describes a limitation about switching while the output is
enabled can also be found there, the limitation probably comes from this type.

Signed-off-by: Heiko Thiery <heiko.thiery@gmail.com>
---
 drivers/power/regulator/pca9450.c | 42 ++++++++++---------------------
 1 file changed, 13 insertions(+), 29 deletions(-)

Comments

Fabio Estevam June 20, 2022, 2:49 p.m. UTC | #1
On 20/06/2022 00:49, Heiko Thiery wrote:
> In order to have the possibility to configure the regulators at system
> startup through DM support, all LDOs and bucks must be able to be
> changeable. Currently there is a limitation to change the values when
> the output is enabled. Since the driver is based on the ROHM BD71837 
> and a
> comment that describes a limitation about switching while the output is
> enabled can also be found there, the limitation probably comes from 
> this type.
> 
> Signed-off-by: Heiko Thiery <heiko.thiery@gmail.com>

Reviewed-by: Fabio Estevam <festevam@denx.de>
Jaehoon Chung July 26, 2022, 8:20 a.m. UTC | #2
On 6/20/22 12:49, Heiko Thiery wrote:
> In order to have the possibility to configure the regulators at system
> startup through DM support, all LDOs and bucks must be able to be
> changeable. Currently there is a limitation to change the values when
> the output is enabled. Since the driver is based on the ROHM BD71837 and a
> comment that describes a limitation about switching while the output is
> enabled can also be found there, the limitation probably comes from this type.
> 
> Signed-off-by: Heiko Thiery <heiko.thiery@gmail.com>
> Reviewed-by: Fabio Estevam <festevam@denx.de>

Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>

Best Regards,
Jaehoon Chung

> ---
>  drivers/power/regulator/pca9450.c | 42 ++++++++++---------------------
>  1 file changed, 13 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/power/regulator/pca9450.c b/drivers/power/regulator/pca9450.c
> index 23badaa332..fe1869397c 100644
> --- a/drivers/power/regulator/pca9450.c
> +++ b/drivers/power/regulator/pca9450.c
> @@ -44,7 +44,6 @@ struct pca9450_vrange {
>   * @ranges:	pointer to ranges of regulator voltages and matching register
>   *		values
>   * @numranges:	number of voltage ranges pointed by ranges
> - * @dvs:	whether the voltage can be changed when regulator is enabled
>   */
>  struct pca9450_plat {
>  	const char		*name;
> @@ -54,7 +53,6 @@ struct pca9450_plat {
>  	u8			volt_mask;
>  	struct pca9450_vrange	*ranges;
>  	unsigned int		numranges;
> -	bool			dvs;
>  };
>  
>  #define PCA_RANGE(_min, _vstep, _sel_low, _sel_hi) \
> @@ -63,11 +61,11 @@ struct pca9450_plat {
>  	.min_sel = (_sel_low), .max_sel = (_sel_hi), \
>  }
>  
> -#define PCA_DATA(_name, enreg, enmask, vreg, vmask, _range, _dvs) \
> +#define PCA_DATA(_name, enreg, enmask, vreg, vmask, _range) \
>  { \
>  	.name = (_name), .enable_reg = (enreg), .enablemask = (enmask), \
>  	.volt_reg = (vreg), .volt_mask = (vmask), .ranges = (_range), \
> -	.numranges = ARRAY_SIZE(_range), .dvs = (_dvs), \
> +	.numranges = ARRAY_SIZE(_range) \
>  }
>  
>  static struct pca9450_vrange pca9450_buck123_vranges[] = {
> @@ -107,39 +105,39 @@ static struct pca9450_plat pca9450_reg_data[] = {
>  	/* Bucks 1-3 which support dynamic voltage scaling */
>  	PCA_DATA("BUCK1", PCA9450_BUCK1CTRL, HW_STATE_CONTROL,
>  		 PCA9450_BUCK1OUT_DVS0, PCA9450_DVS_BUCK_RUN_MASK,
> -		 pca9450_buck123_vranges, true),
> +		 pca9450_buck123_vranges),
>  	PCA_DATA("BUCK2", PCA9450_BUCK2CTRL, HW_STATE_CONTROL,
>  		 PCA9450_BUCK2OUT_DVS0, PCA9450_DVS_BUCK_RUN_MASK,
> -		 pca9450_buck123_vranges, true),
> +		 pca9450_buck123_vranges),
>  	PCA_DATA("BUCK3", PCA9450_BUCK3CTRL, HW_STATE_CONTROL,
>  		 PCA9450_BUCK3OUT_DVS0, PCA9450_DVS_BUCK_RUN_MASK,
> -		 pca9450_buck123_vranges, true),
> +		 pca9450_buck123_vranges),
>  	/* Bucks 4-6 which do not support dynamic voltage scaling */
>  	PCA_DATA("BUCK4", PCA9450_BUCK4CTRL, HW_STATE_CONTROL,
>  		 PCA9450_BUCK4OUT, PCA9450_DVS_BUCK_RUN_MASK,
> -		 pca9450_buck456_vranges, false),
> +		 pca9450_buck456_vranges),
>  	PCA_DATA("BUCK5", PCA9450_BUCK5CTRL, HW_STATE_CONTROL,
>  		 PCA9450_BUCK5OUT, PCA9450_DVS_BUCK_RUN_MASK,
> -		 pca9450_buck456_vranges, false),
> +		 pca9450_buck456_vranges),
>  	PCA_DATA("BUCK6", PCA9450_BUCK6CTRL, HW_STATE_CONTROL,
>  		 PCA9450_BUCK6OUT, PCA9450_DVS_BUCK_RUN_MASK,
> -		 pca9450_buck456_vranges, false),
> +		 pca9450_buck456_vranges),
>  	/* LDOs */
>  	PCA_DATA("LDO1", PCA9450_LDO1CTRL, HW_STATE_CONTROL,
>  		 PCA9450_LDO1CTRL, PCA9450_LDO12_MASK,
> -		 pca9450_ldo1_vranges, false),
> +		 pca9450_ldo1_vranges),
>  	PCA_DATA("LDO2", PCA9450_LDO2CTRL, HW_STATE_CONTROL,
>  		 PCA9450_LDO2CTRL, PCA9450_LDO12_MASK,
> -		 pca9450_ldo2_vranges, false),
> +		 pca9450_ldo2_vranges),
>  	PCA_DATA("LDO3", PCA9450_LDO3CTRL, HW_STATE_CONTROL,
>  		 PCA9450_LDO3CTRL, PCA9450_LDO34_MASK,
> -		 pca9450_ldo34_vranges, false),
> +		 pca9450_ldo34_vranges),
>  	PCA_DATA("LDO4", PCA9450_LDO4CTRL, HW_STATE_CONTROL,
>  		 PCA9450_LDO4CTRL, PCA9450_LDO34_MASK,
> -		 pca9450_ldo34_vranges, false),
> +		 pca9450_ldo34_vranges),
>  	PCA_DATA("LDO5", PCA9450_LDO5CTRL_H, HW_STATE_CONTROL,
>  		 PCA9450_LDO5CTRL_H, PCA9450_LDO5_MASK,
> -		 pca9450_ldo5_vranges, false),
> +		 pca9450_ldo5_vranges),
>  };
>  
>  static int vrange_find_value(struct pca9450_vrange *r, unsigned int sel,
> @@ -246,20 +244,6 @@ static int pca9450_set_value(struct udevice *dev, int uvolt)
>  	unsigned int sel;
>  	int i, found = 0;
>  
> -	/*
> -	 * An under/overshooting may occur if voltage is changed for other
> -	 * regulators but buck 1,2,3 or 4 when regulator is enabled. Prevent
> -	 * change to protect the HW
> -	 */
> -	if (!plat->dvs)
> -		if (pca9450_get_enable(dev)) {
> -			/* If the value is already set, skip the warning. */
> -			if (pca9450_get_value(dev) == uvolt)
> -				return 0;
> -			pr_err("Only DVS bucks can be changed when enabled\n");
> -			return -EINVAL;
> -		}
> -
>  	for (i = 0; i < plat->numranges; i++) {
>  		struct pca9450_vrange *r = &plat->ranges[i];
>
Michael Nazzareno Trimarchi Aug. 22, 2022, 10:19 a.m. UTC | #3
Hi Heiko

On Tue, Jul 26, 2022 at 10:20 AM Jaehoon Chung <jh80.chung@samsung.com> wrote:
>
> On 6/20/22 12:49, Heiko Thiery wrote:
> > In order to have the possibility to configure the regulators at system
> > startup through DM support, all LDOs and bucks must be able to be
> > changeable. Currently there is a limitation to change the values when
> > the output is enabled. Since the driver is based on the ROHM BD71837 and a
> > comment that describes a limitation about switching while the output is
> > enabled can also be found there, the limitation probably comes from this type.
> >
> > Signed-off-by: Heiko Thiery <heiko.thiery@gmail.com>
> > Reviewed-by: Fabio Estevam <festevam@denx.de>
>
> Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>
>

I think that this can be valid even for bd71837. Are you agree?

Michael

> Best Regards,
> Jaehoon Chung
>
> > ---
> >  drivers/power/regulator/pca9450.c | 42 ++++++++++---------------------
> >  1 file changed, 13 insertions(+), 29 deletions(-)
> >
> > diff --git a/drivers/power/regulator/pca9450.c b/drivers/power/regulator/pca9450.c
> > index 23badaa332..fe1869397c 100644
> > --- a/drivers/power/regulator/pca9450.c
> > +++ b/drivers/power/regulator/pca9450.c
> > @@ -44,7 +44,6 @@ struct pca9450_vrange {
> >   * @ranges:  pointer to ranges of regulator voltages and matching register
> >   *           values
> >   * @numranges:       number of voltage ranges pointed by ranges
> > - * @dvs:     whether the voltage can be changed when regulator is enabled
> >   */
> >  struct pca9450_plat {
> >       const char              *name;
> > @@ -54,7 +53,6 @@ struct pca9450_plat {
> >       u8                      volt_mask;
> >       struct pca9450_vrange   *ranges;
> >       unsigned int            numranges;
> > -     bool                    dvs;
> >  };
> >
> >  #define PCA_RANGE(_min, _vstep, _sel_low, _sel_hi) \
> > @@ -63,11 +61,11 @@ struct pca9450_plat {
> >       .min_sel = (_sel_low), .max_sel = (_sel_hi), \
> >  }
> >
> > -#define PCA_DATA(_name, enreg, enmask, vreg, vmask, _range, _dvs) \
> > +#define PCA_DATA(_name, enreg, enmask, vreg, vmask, _range) \
> >  { \
> >       .name = (_name), .enable_reg = (enreg), .enablemask = (enmask), \
> >       .volt_reg = (vreg), .volt_mask = (vmask), .ranges = (_range), \
> > -     .numranges = ARRAY_SIZE(_range), .dvs = (_dvs), \
> > +     .numranges = ARRAY_SIZE(_range) \
> >  }
> >
> >  static struct pca9450_vrange pca9450_buck123_vranges[] = {
> > @@ -107,39 +105,39 @@ static struct pca9450_plat pca9450_reg_data[] = {
> >       /* Bucks 1-3 which support dynamic voltage scaling */
> >       PCA_DATA("BUCK1", PCA9450_BUCK1CTRL, HW_STATE_CONTROL,
> >                PCA9450_BUCK1OUT_DVS0, PCA9450_DVS_BUCK_RUN_MASK,
> > -              pca9450_buck123_vranges, true),
> > +              pca9450_buck123_vranges),
> >       PCA_DATA("BUCK2", PCA9450_BUCK2CTRL, HW_STATE_CONTROL,
> >                PCA9450_BUCK2OUT_DVS0, PCA9450_DVS_BUCK_RUN_MASK,
> > -              pca9450_buck123_vranges, true),
> > +              pca9450_buck123_vranges),
> >       PCA_DATA("BUCK3", PCA9450_BUCK3CTRL, HW_STATE_CONTROL,
> >                PCA9450_BUCK3OUT_DVS0, PCA9450_DVS_BUCK_RUN_MASK,
> > -              pca9450_buck123_vranges, true),
> > +              pca9450_buck123_vranges),
> >       /* Bucks 4-6 which do not support dynamic voltage scaling */
> >       PCA_DATA("BUCK4", PCA9450_BUCK4CTRL, HW_STATE_CONTROL,
> >                PCA9450_BUCK4OUT, PCA9450_DVS_BUCK_RUN_MASK,
> > -              pca9450_buck456_vranges, false),
> > +              pca9450_buck456_vranges),
> >       PCA_DATA("BUCK5", PCA9450_BUCK5CTRL, HW_STATE_CONTROL,
> >                PCA9450_BUCK5OUT, PCA9450_DVS_BUCK_RUN_MASK,
> > -              pca9450_buck456_vranges, false),
> > +              pca9450_buck456_vranges),
> >       PCA_DATA("BUCK6", PCA9450_BUCK6CTRL, HW_STATE_CONTROL,
> >                PCA9450_BUCK6OUT, PCA9450_DVS_BUCK_RUN_MASK,
> > -              pca9450_buck456_vranges, false),
> > +              pca9450_buck456_vranges),
> >       /* LDOs */
> >       PCA_DATA("LDO1", PCA9450_LDO1CTRL, HW_STATE_CONTROL,
> >                PCA9450_LDO1CTRL, PCA9450_LDO12_MASK,
> > -              pca9450_ldo1_vranges, false),
> > +              pca9450_ldo1_vranges),
> >       PCA_DATA("LDO2", PCA9450_LDO2CTRL, HW_STATE_CONTROL,
> >                PCA9450_LDO2CTRL, PCA9450_LDO12_MASK,
> > -              pca9450_ldo2_vranges, false),
> > +              pca9450_ldo2_vranges),
> >       PCA_DATA("LDO3", PCA9450_LDO3CTRL, HW_STATE_CONTROL,
> >                PCA9450_LDO3CTRL, PCA9450_LDO34_MASK,
> > -              pca9450_ldo34_vranges, false),
> > +              pca9450_ldo34_vranges),
> >       PCA_DATA("LDO4", PCA9450_LDO4CTRL, HW_STATE_CONTROL,
> >                PCA9450_LDO4CTRL, PCA9450_LDO34_MASK,
> > -              pca9450_ldo34_vranges, false),
> > +              pca9450_ldo34_vranges),
> >       PCA_DATA("LDO5", PCA9450_LDO5CTRL_H, HW_STATE_CONTROL,
> >                PCA9450_LDO5CTRL_H, PCA9450_LDO5_MASK,
> > -              pca9450_ldo5_vranges, false),
> > +              pca9450_ldo5_vranges),
> >  };
> >
> >  static int vrange_find_value(struct pca9450_vrange *r, unsigned int sel,
> > @@ -246,20 +244,6 @@ static int pca9450_set_value(struct udevice *dev, int uvolt)
> >       unsigned int sel;
> >       int i, found = 0;
> >
> > -     /*
> > -      * An under/overshooting may occur if voltage is changed for other
> > -      * regulators but buck 1,2,3 or 4 when regulator is enabled. Prevent
> > -      * change to protect the HW
> > -      */
> > -     if (!plat->dvs)
> > -             if (pca9450_get_enable(dev)) {
> > -                     /* If the value is already set, skip the warning. */
> > -                     if (pca9450_get_value(dev) == uvolt)
> > -                             return 0;
> > -                     pr_err("Only DVS bucks can be changed when enabled\n");
> > -                     return -EINVAL;
> > -             }
> > -
> >       for (i = 0; i < plat->numranges; i++) {
> >               struct pca9450_vrange *r = &plat->ranges[i];
> >
>
diff mbox series

Patch

diff --git a/drivers/power/regulator/pca9450.c b/drivers/power/regulator/pca9450.c
index 23badaa332..fe1869397c 100644
--- a/drivers/power/regulator/pca9450.c
+++ b/drivers/power/regulator/pca9450.c
@@ -44,7 +44,6 @@  struct pca9450_vrange {
  * @ranges:	pointer to ranges of regulator voltages and matching register
  *		values
  * @numranges:	number of voltage ranges pointed by ranges
- * @dvs:	whether the voltage can be changed when regulator is enabled
  */
 struct pca9450_plat {
 	const char		*name;
@@ -54,7 +53,6 @@  struct pca9450_plat {
 	u8			volt_mask;
 	struct pca9450_vrange	*ranges;
 	unsigned int		numranges;
-	bool			dvs;
 };
 
 #define PCA_RANGE(_min, _vstep, _sel_low, _sel_hi) \
@@ -63,11 +61,11 @@  struct pca9450_plat {
 	.min_sel = (_sel_low), .max_sel = (_sel_hi), \
 }
 
-#define PCA_DATA(_name, enreg, enmask, vreg, vmask, _range, _dvs) \
+#define PCA_DATA(_name, enreg, enmask, vreg, vmask, _range) \
 { \
 	.name = (_name), .enable_reg = (enreg), .enablemask = (enmask), \
 	.volt_reg = (vreg), .volt_mask = (vmask), .ranges = (_range), \
-	.numranges = ARRAY_SIZE(_range), .dvs = (_dvs), \
+	.numranges = ARRAY_SIZE(_range) \
 }
 
 static struct pca9450_vrange pca9450_buck123_vranges[] = {
@@ -107,39 +105,39 @@  static struct pca9450_plat pca9450_reg_data[] = {
 	/* Bucks 1-3 which support dynamic voltage scaling */
 	PCA_DATA("BUCK1", PCA9450_BUCK1CTRL, HW_STATE_CONTROL,
 		 PCA9450_BUCK1OUT_DVS0, PCA9450_DVS_BUCK_RUN_MASK,
-		 pca9450_buck123_vranges, true),
+		 pca9450_buck123_vranges),
 	PCA_DATA("BUCK2", PCA9450_BUCK2CTRL, HW_STATE_CONTROL,
 		 PCA9450_BUCK2OUT_DVS0, PCA9450_DVS_BUCK_RUN_MASK,
-		 pca9450_buck123_vranges, true),
+		 pca9450_buck123_vranges),
 	PCA_DATA("BUCK3", PCA9450_BUCK3CTRL, HW_STATE_CONTROL,
 		 PCA9450_BUCK3OUT_DVS0, PCA9450_DVS_BUCK_RUN_MASK,
-		 pca9450_buck123_vranges, true),
+		 pca9450_buck123_vranges),
 	/* Bucks 4-6 which do not support dynamic voltage scaling */
 	PCA_DATA("BUCK4", PCA9450_BUCK4CTRL, HW_STATE_CONTROL,
 		 PCA9450_BUCK4OUT, PCA9450_DVS_BUCK_RUN_MASK,
-		 pca9450_buck456_vranges, false),
+		 pca9450_buck456_vranges),
 	PCA_DATA("BUCK5", PCA9450_BUCK5CTRL, HW_STATE_CONTROL,
 		 PCA9450_BUCK5OUT, PCA9450_DVS_BUCK_RUN_MASK,
-		 pca9450_buck456_vranges, false),
+		 pca9450_buck456_vranges),
 	PCA_DATA("BUCK6", PCA9450_BUCK6CTRL, HW_STATE_CONTROL,
 		 PCA9450_BUCK6OUT, PCA9450_DVS_BUCK_RUN_MASK,
-		 pca9450_buck456_vranges, false),
+		 pca9450_buck456_vranges),
 	/* LDOs */
 	PCA_DATA("LDO1", PCA9450_LDO1CTRL, HW_STATE_CONTROL,
 		 PCA9450_LDO1CTRL, PCA9450_LDO12_MASK,
-		 pca9450_ldo1_vranges, false),
+		 pca9450_ldo1_vranges),
 	PCA_DATA("LDO2", PCA9450_LDO2CTRL, HW_STATE_CONTROL,
 		 PCA9450_LDO2CTRL, PCA9450_LDO12_MASK,
-		 pca9450_ldo2_vranges, false),
+		 pca9450_ldo2_vranges),
 	PCA_DATA("LDO3", PCA9450_LDO3CTRL, HW_STATE_CONTROL,
 		 PCA9450_LDO3CTRL, PCA9450_LDO34_MASK,
-		 pca9450_ldo34_vranges, false),
+		 pca9450_ldo34_vranges),
 	PCA_DATA("LDO4", PCA9450_LDO4CTRL, HW_STATE_CONTROL,
 		 PCA9450_LDO4CTRL, PCA9450_LDO34_MASK,
-		 pca9450_ldo34_vranges, false),
+		 pca9450_ldo34_vranges),
 	PCA_DATA("LDO5", PCA9450_LDO5CTRL_H, HW_STATE_CONTROL,
 		 PCA9450_LDO5CTRL_H, PCA9450_LDO5_MASK,
-		 pca9450_ldo5_vranges, false),
+		 pca9450_ldo5_vranges),
 };
 
 static int vrange_find_value(struct pca9450_vrange *r, unsigned int sel,
@@ -246,20 +244,6 @@  static int pca9450_set_value(struct udevice *dev, int uvolt)
 	unsigned int sel;
 	int i, found = 0;
 
-	/*
-	 * An under/overshooting may occur if voltage is changed for other
-	 * regulators but buck 1,2,3 or 4 when regulator is enabled. Prevent
-	 * change to protect the HW
-	 */
-	if (!plat->dvs)
-		if (pca9450_get_enable(dev)) {
-			/* If the value is already set, skip the warning. */
-			if (pca9450_get_value(dev) == uvolt)
-				return 0;
-			pr_err("Only DVS bucks can be changed when enabled\n");
-			return -EINVAL;
-		}
-
 	for (i = 0; i < plat->numranges; i++) {
 		struct pca9450_vrange *r = &plat->ranges[i];