regulator: max8997: Use simple equation to get selector
PATCH RESEND 1/3 regulator: max8997: Use simple equation to get selector
It's more efficient to get the best selector by simple equation.
--- drivers/regulator/max8997.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-)
drivers/regulator/max8997.c +5 -4
@@ -416,7 +416,7 @@ static inline int max8997_get_voltage_proper_val(const struct voltage_map_desc *desc, int min_vol, int max_vol) { - int i = 0; + int i;if (desc ==NULL )return -EINVAL ;
@@ -424,9 +424,10 @@ static inline int max8997_get_voltage_proper_val(if (max_vol < desc->min || min_vol > desc->max)return -EINVAL ; -while (desc->min + desc->step * i < min_vol && - desc->min + desc->step * i < desc->max) - i++; +if (min_vol < desc->min) + min_vol = desc->min; + + i =DIV_ROUND_UP (min_vol - desc->min, desc->step);if (desc->min + desc->step * i > max_vol)return -EINVAL ;
Signature · 1 line
1.7.5.4
PATCH RESEND 2/3 regulator: max8998: Use simple equation to get selector
It's more efficient to get the best selector by simple equation.
--- drivers/regulator/max8998.c | 19 ++++++++++--------- 1 files changed, 10 insertions(+), 9 deletions(-)
drivers/regulator/max8998.c +10 -9
@@ -306,8 +306,7 @@ static int max8998_set_voltage_ldo(struct regulator_dev *rdev,int min_vol = min_uV /1000 , max_vol = max_uV /1000 ;const struct voltage_map_desc *desc;int ldo =rdev_get_id (rdev); -int reg, shift =0 , mask, ret; -int i =0 ; +int reg, shift =0 , mask, ret, i;if (ldo >=ARRAY_SIZE (ldo_voltage_map))return -EINVAL ;
@@ -319,9 +318,10 @@ static int max8998_set_voltage_ldo(struct regulator_dev *rdev,if (max_vol < desc->min || min_vol > desc->max)return -EINVAL ; -while (desc->min + desc->step*i < min_vol && - desc->min + desc->step*i < desc->max) - i++; +if (min_vol < desc->min) + min_vol = desc->min; + + i =DIV_ROUND_UP (min_vol - desc->min, desc->step);if (desc->min + desc->step*i > max_vol)return -EINVAL ;
@@ -359,7 +359,7 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,const struct voltage_map_desc *desc;int buck =rdev_get_id (rdev);int reg, shift =0 , mask, ret; -int difference =0 , i =0 , j =0 , previous_vol =0 ; +int difference =0 , i, j =0 , previous_vol =0 ;u8 val =0 ;static u8 buck1_last_val;
@@ -374,9 +374,10 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,if (max_vol < desc->min || min_vol > desc->max)return -EINVAL ; -while (desc->min + desc->step*i < min_vol && - desc->min + desc->step*i < desc->max) - i++; +if (min_vol < desc->min) + min_vol = desc->min; + + i =DIV_ROUND_UP (min_vol - desc->min, desc->step);if (desc->min + desc->step*i > max_vol)return -EINVAL ;
Signature · 1 line
1.7.5.4
PATCH 3/3 regulator: max8997: Remove n_bits from struct voltage_map_desc
In reply to Axel LinThe n_bits is only used in max8997_get_voltage_proper_val to check the valid range for variable i.
Current code already ensures min_vol never greater than desc->max, which means the variable i always in the valid range:
0 .. (desc->max - desc->min)/desc->step.
Thus we can remove the checking (i >= (1 << desc->n_bits) and then remove n_bits from struct voltage_map_desc.
--- drivers/regulator/max8997.c | 14 +++++--------- 1 files changed, 5 insertions(+), 9 deletions(-)
drivers/regulator/max8997.c +5 -9
@@ -68,29 +68,28 @@ struct voltage_map_desc {int min;int max;int step; -unsigned int n_bits; };/* Voltage maps in mV */ static const struct voltage_map_desc ldo_voltage_map_desc = { - .min =800 , .max =3950 , .step =50 , .n_bits =6 , + .min =800 , .max =3950 , .step =50 , };/* LDO1 ~ 18, 21 all */ static const struct voltage_map_desc buck1245_voltage_map_desc = { - .min =650 , .max =2225 , .step =25 , .n_bits =6 , + .min =650 , .max =2225 , .step =25 , };/* Buck1, 2, 4, 5 */ static const struct voltage_map_desc buck37_voltage_map_desc = { - .min =750 , .max =3900 , .step =50 , .n_bits =6 , + .min =750 , .max =3900 , .step =50 , };/* Buck3, 7 */ /* current map in mA */ static const struct voltage_map_desc charger_current_map_desc = { - .min =200 , .max =950 , .step =50 , .n_bits =4 , + .min =200 , .max =950 , .step =50 , };static const struct voltage_map_desc topoff_current_map_desc = { - .min =50 , .max =200 , .step =10 , .n_bits =4 , + .min =50 , .max =200 , .step =10 , };static const struct voltage_map_desc *reg_voltage_map[] = {
@@ -432,9 +431,6 @@ static inline int max8997_get_voltage_proper_val(if (desc->min + desc->step * i > max_vol)return -EINVAL ; -if (i >= (1 << desc->n_bits)) -return -EINVAL ; -return i; }
Signature · 1 line
1.7.5.4
Mark Brown
AppliedQuoted 1 line · Axel Lin
It's more efficient to get the best selector by simple equation.
Applied all, thanks.