linux/drivers/regulator
Axel Lin 022dcdf083 regulator: pcf50633: Don't write to reserved bits of AUTO output voltage select register
The datasheet says 00000000 to 00101110 are reserved, and the min value of the
voltage setting is 1.8 V.
Thus don't write 0 to AUTO output voltage select register (address 1Ah).

Table 50. AUTOOUT - AUTO output voltage select register (address 1Ah) bit description[1]
Bit Symbol Access Description
7:0 auto_out R/W VO(prog) = 0.625 + auto_out × 0.025 V
eg. 00000000 to 00101110: reserved
00101111: 1.8 V (min)
01010011: 2.7 V
01101010: 3.275 V
01101011: 3.300 V
01101100: 3.325 V
01111111 : 3.800 V (max)
..... .....
11111110 : 3.800 V
11111111 : 3.800 V

This patch also fixes a bug in pcf50633_regulator_list_voltage:
In regulator core _regulator_do_set_voltage function:

        if (rdev->desc->ops->set_voltage) {
                ret = rdev->desc->ops->set_voltage(rdev, min_uV, max_uV,
                                                   &selector);

                if (rdev->desc->ops->list_voltage)
                        selector = rdev->desc->ops->list_voltage(rdev,
                                                                 selector);
                else
                        selector = -1;

The list_voltage call here takes the selector got from set_voltage callback.
Thus adding 0x2f to the index in pcf50633_regulator_list_voltage looks wrong to me.

e.g.
If min_uV < 1.8V, pcf50633_regulator_set_voltage sets 0 to selector.
For this case, adding 0x2f to the index in pcf50633_regulator_list_voltage is correct.
However, if min_uV == 1.8V, pcf50633_regulator_set_voltage sets 0x2f to selector.
Adding 0x2f to the index in pcf50633_regulator_list_voltage in this case is wrong.

What this patch does is:
The minimal voltage setting for AUTOOUT is 0x2f.
Thus for the case min_uV < 1.8, set the voltage setting to 1.8V by writting
0x2f to AUTOOUT register and set selector = 0x2f.
So we don't write the rserved range to AUTOOUT register.
Which means the possible range of AUTOOUT register value is 0x2f ~ 0xff.

We have no problem in regulator_get_voltage.
Since we won't write 0~0x2e to AUTOOUT register, we have no problem converting
the bits we read to voltage. The equation in auto_voltage_value works fine.

For list_voltage, we need to take into account the case selector is 0 ~ 0x2e
because the regulator core assumes the selector is starting from 0.
This patch returns 0 for the cases selector is 0 ~ 0x2e, which means
"this selector code can't be used on this system".

The regulator core iterates from 0 to n_voltages to find the small voltage
in the specific range. The n_voltages settings for AUTOOUT should be 128 now,
including the reserved range of AUTOOUT.

Signed-off-by: Axel Lin <axel.lin@gmail.com>
Acked-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2012-04-01 11:59:22 +01:00
..
88pm8607.c regulator: fix the ldo configure according to 88pm860x spec 2012-02-24 14:56:32 +00:00
aat2870-regulator.c regulator: Add a pointer to aat2870_data in struct aat2870_regulator 2012-03-11 20:48:48 +00:00
ab3100.c regulator: pass additional of_node to regulator_register() 2011-11-23 18:47:04 +00:00
ab8500.c regulator: Convert ab8499 to use get_voltage_sel() 2012-03-11 20:48:43 +00:00
ad5398.c regulator: ad5398: Use DIV_ROUND_UP macro to calculate selector 2012-03-11 20:48:49 +00:00
anatop-regulator.c regulator: Add Anatop regulator driver 2012-03-14 12:37:35 +00:00
core.c regulator: Updates for 3.4 2012-03-21 10:34:56 -07:00
da903x.c regulator: da903x: Use DIV_ROUND_UP macro to calculate selector 2012-03-11 20:48:52 +00:00
da9052-regulator.c regulator: da9052: Ensure the selected voltage falls within the specified range 2012-03-11 20:39:10 +00:00
db8500-prcmu.c regulators/db8500: split off shared dbx500 code 2012-01-20 12:01:29 +00:00
dbx500-prcmu.c regulators/db8500: split off shared dbx500 code 2012-01-20 12:01:29 +00:00
dbx500-prcmu.h regulators/db8500: split off shared dbx500 code 2012-01-20 12:01:29 +00:00
dummy.c regulator: pass additional of_node to regulator_register() 2011-11-23 18:47:04 +00:00
dummy.h regulator: fix build when CONFIG_REGULATOR_DUMMY=n 2010-10-28 22:40:32 +01:00
fixed-helper.c regulator: provide a helper for registering a fixed regulator 2012-03-03 16:32:47 +00:00
fixed.c regulator fixed: Do not report enumaratable voltages if there are none 2012-03-11 20:48:51 +00:00
gpio-regulator.c regulator: Fix compile break due to missing arguments to regulator_register 2011-11-24 10:47:56 +00:00
isl6271a-regulator.c regulator: Simplify the code to get selector in isl6271a_set_voltage 2012-03-11 20:48:47 +00:00
Kconfig Merge tag 'regulator-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator into next/drivers 2012-03-24 11:29:58 +00:00
lp3971.c regulator: pass additional of_node to regulator_register() 2011-11-23 18:47:04 +00:00
lp3972.c regulator: pass additional of_node to regulator_register() 2011-11-23 18:47:04 +00:00
Makefile Merge tag 'regulator-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator into next/drivers 2012-03-24 11:29:58 +00:00
max1586.c regulator: max1586: Use DIV_ROUND_UP macro to calculate selector 2012-03-11 20:48:49 +00:00
max8649.c Merge remote-tracking branch 'regulator/topic/stub' into regulator-next 2012-03-18 21:38:20 +00:00
max8660.c regulator: max8660: Use DIV_ROUND_UP macro to calculate selector 2012-03-11 20:48:50 +00:00
max8925-regulator.c regulator: max8925: Use DIV_ROUND_UP macro 2012-03-13 23:19:40 +00:00
max8952.c regulator: pass additional of_node to regulator_register() 2011-11-23 18:47:04 +00:00
max8997.c regulator: Kill max8997_get_rid function 2012-03-11 20:48:46 +00:00
max8998.c regulator: Silence error message in max8998_pmic_probe 2012-03-11 20:48:54 +00:00
mc13xxx-regulator-core.c regulator: Fix mc13xxx regulator modular build (again) 2012-02-09 22:57:46 +00:00
mc13xxx.h regulator: mc13892: add device tree probe support 2011-12-22 11:10:45 +00:00
mc13783-regulator.c regulator: mc13783: bail out without platform data 2012-03-11 20:48:44 +00:00
mc13892-regulator.c regulator: mc13892: Convert to devm_kzalloc() 2011-12-30 02:06:29 +00:00
of_regulator.c regulator: Set apply_uV only when min and max voltages are defined 2012-01-26 11:01:21 +00:00
pcap-regulator.c regulator: pass additional of_node to regulator_register() 2011-11-23 18:47:04 +00:00
pcf50633-regulator.c regulator: pcf50633: Don't write to reserved bits of AUTO output voltage select register 2012-04-01 11:59:22 +01:00
s5m8767.c regulator: Add support s5m8767 opmode operation 2012-04-01 11:59:22 +01:00
tps6105x-regulator.c regulator: pass additional of_node to regulator_register() 2011-11-23 18:47:04 +00:00
tps6507x-regulator.c regulator: Convert tps6507x to set_voltage_sel 2012-03-14 14:13:17 +00:00
tps6524x-regulator.c regulator: Updates for 3.4 2012-03-21 10:34:56 -07:00
tps6586x-regulator.c regulator: tps6586x: fix typo in debug message 2012-03-11 20:49:29 +00:00
tps62360-regulator.c regulator: tps62360: Remove pointless test for unsigned less than zero 2012-03-11 20:48:40 +00:00
tps65023-regulator.c regulator: Remove redundant regmap_update_bits call for TPS65023_REG_CON_CTRL2 2012-02-06 16:38:18 +00:00
tps65217-regulator.c regulator: Merge tps65217_pmic_ldo234_ops and tps65217_pmic_dcdc_ops to tps65217_pmic_ops 2012-03-12 10:50:46 +00:00
tps65910-regulator.c Merge tag 'regulator-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator into next/drivers 2012-03-24 11:29:58 +00:00
tps65912-regulator.c regulator: Simplify implementation of tps65912_get_voltage_dcdc 2012-03-14 12:37:23 +00:00
twl-regulator.c regulator: twl-regulator: Add fixed LDO for V1V8, V2V1 supply 2012-03-11 20:09:18 +00:00
userspace-consumer.c regulator: Convert virtual and userspace regulator consumer drivers to use module_platform_driver() 2011-11-28 11:49:13 +00:00
virtual.c regulator: Convert virtual and userspace regulator consumer drivers to use module_platform_driver() 2011-11-28 11:49:13 +00:00
wm831x-dcdc.c regulator: Convert wm831x regulator drivers to devm_kzalloc() 2011-12-20 11:29:05 +00:00
wm831x-isink.c regulator: Convert wm831x regulator drivers to devm_kzalloc() 2011-12-20 11:29:05 +00:00
wm831x-ldo.c regulator: Convert wm831x regulator drivers to devm_kzalloc() 2011-12-20 11:29:05 +00:00
wm8350-regulator.c regulator: Use DIV_ROUND_CLOSEST in wm8350_isink_get_current 2012-03-12 10:48:18 +00:00
wm8400-regulator.c regulator: wm8400: Use DIV_ROUND_UP macro to calculate selector 2012-03-11 20:48:51 +00:00
wm8994-regulator.c regulator: wm8994: Convert to devm_kzalloc() 2012-03-11 20:48:41 +00:00