regulator: pfuze100: Fix n_voltages setting for SW2~SW4 with high bit set
PATCH 1/1 regulator: pfuze100: Fix n_voltages setting for SW2~SW4 with high bit set
Current code adjust min_uV and uV_step but missed adjusting the n_voltages setting.
When BIT6 is clear:
n_voltages = (1975000 - 400000) / 25000 + 1 = 64
When BIT6 is set:
n_voltages = (3300000 - 800000) / 50000 + 1 = 51The n_voltages needs update because when BIT6 is set 0x73 ~ 0x7f are reserved. When using regulator_list_voltage_linear, the n_voltages does matter here because wrong n_voltages setting make the equation return wrong result. e.g. if selector is 63, regulator_list_voltage_linear returns
800000 + (50000 * 63) = 4000000
It should return -EINVAL if the selector is in the range of 51 ~ 63.
--- drivers/regulator/pfuze100-regulator.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/regulator/pfuze100-regulator.c +8 -8
@@ -387,8 +387,11 @@ static int pfuze100_regulator_probe(struct i2c_client *client,for (i =0 ; i <PFUZE100_MAX_REGULATOR ; i++) {struct regulator_init_data *init_data; +struct regulator_desc *desc;int val; + desc = &pfuze_chip->regulator_descs[i].desc; +if (pdata) init_data = pdata->init_data[i];else
@@ -396,13 +399,11 @@ static int pfuze100_regulator_probe(struct i2c_client *client,/* SW2~SW4 high bit check and modify the voltage value table */ if (i >PFUZE100_SW1C && i <PFUZE100_SWBST ) { -regmap_read (pfuze_chip->regmap,PFUZE100_SW2VOL + - (i -PFUZE100_SW2 ) *7 , &val); +regmap_read (pfuze_chip->regmap, desc->vsel_reg, &val);if (val &0x40 ) { - pfuze_chip->regulator_descs[i].desc.min_uV - =800000 ; - pfuze_chip->regulator_descs[i].desc.uV_step - =50000 ; + desc->min_uV =800000 ; + desc->uV_step =50000 ; + desc->n_voltages =51 ; } }
@@ -411,8 +412,7 @@ static int pfuze100_regulator_probe(struct i2c_client *client, config.driver_data = pfuze_chip; config.of_node =match_of_node (i); - pfuze_chip->regulators[i] =regulator_register (&pfuze_chip - ->regulator_descs[i].desc, &config); + pfuze_chip->regulators[i] =regulator_register (desc, &config);if (IS_ERR (pfuze_chip->regulators[i])) {dev_err (&client->dev,"register regulator%s failed\n" , pfuze100_regulators[i].desc.name);
Signature · 1 line
1.8.1.2
Ok for me.
Quoted 70 lines · Axel Lin
Current code adjust
min_uVanduV_stepbut missed adjusting then_voltagessetting.When BIT6 is clear:
n_voltages = (1975000 - 400000) / 25000 + 1 = 64 When BIT6 is set: n_voltages = (3300000 - 800000) / 50000 + 1 = 51The
n_voltagesneeds update because when BIT6 is set0x73~0x7fare reserved. When usingregulator_list_voltage_linear, then_voltagesdoes matter here because wrongn_voltagessetting make the equation return wrong result. e.g. if selector is 63,regulator_list_voltage_linearreturns
800000 + (50000 * 63) = 4000000
It should return-EINVALif the selector is in the range of 51 ~ 63.Signed-off-by Axel Lin <[email protected]>--- drivers/regulator/pfuze100-regulator.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)drivers/regulator/pfuze100-regulator.c +8
-8@@ -387,8 +387,11 @@ static int pfuze100_regulator_probe(struct i2c_client *client,for (i =0 ; i <PFUZE100_MAX_REGULATOR ; i++) {struct regulator_init_data *init_data; +struct regulator_desc *desc;int val; + desc = &pfuze_chip->regulator_descs[i].desc; +if (pdata) init_data = pdata->init_data[i];else @@ -396,13 +399,11 @@ static int pfuze100_regulator_probe(struct i2c_client *client,/* SW2~SW4 high bit check and modify the voltage value table */ if (i >PFUZE100_SW1C && i <PFUZE100_SWBST ) { -regmap_read (pfuze_chip->regmap,PFUZE100_SW2VOL + - (i -PFUZE100_SW2 ) *7 , &val); +regmap_read (pfuze_chip->regmap, desc->vsel_reg, &val);if (val &0x40 ) { - pfuze_chip->regulator_descs[i].desc.min_uV - =800000 ; - pfuze_chip->regulator_descs[i].desc.uV_step - =50000 ; + desc->min_uV =800000 ; + desc->uV_step =50000 ; + desc->n_voltages =51 ; } }@@ -411,8 +412,7 @@ static int pfuze100_regulator_probe(struct i2c_client *client, config.driver_data = pfuze_chip; config.of_node =match_of_node (i); - pfuze_chip->regulators[i] =regulator_register (&pfuze_chip - ->regulator_descs[i].desc, &config); + pfuze_chip->regulators[i] =regulator_register (desc, &config);if (IS_ERR (pfuze_chip->regulators[i])) {dev_err (&client->dev,"register regulator%s failed\n" , pfuze100_regulators[i].desc.name);Signature · 1 line
1.8.1.2
Quoted 1 line · Robin Gong
Ok for me.
For Linux kernel process you should say
or
to say if you are OK - the first means you didn't really review but it looks OK, the second means you did a proper review.
Hi Mark,
Thanks for your kindly remind.
Quoted 13 lines · Mark Brown
Quoted 1 line · Robin Gong
Ok for me.
For Linux kernel process you should say
Acked-by: Robin Gong <[email protected]>or
Reviewed-by Robin Gong <[email protected]>to say if you are OK - the first means you didn't really review but it looks OK, the second means you did a proper review.
Quoted 2 lines · Axel Lin
Current code adjust
min_uVanduV_stepbut missed adjusting then_voltagessetting.
Applied, thanks.