aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator/pcf50633-regulator.c
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@gmail.com>2012-02-28 23:45:35 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-03-11 16:48:45 -0400
commitba51c6c022b64b7f3f68d7e2936a37f6ffbc7c4d (patch)
tree5fd7888545a192a3cbbba99cc1eab4f5cf73ac4c /drivers/regulator/pcf50633-regulator.c
parent89e0f0e40002e0d95b7be079fa2c2133304ce09f (diff)
regulator: Fix n_voltage settings for pcf50633 regulator
Current code has off-by-one n_voltage settings for AUTO/DOWN*/LDO* regulators. Take ldo1 as example: n_voltage should be (3.6 - 0.9) / 0.1 + 1 = 28 Table 76. LDO1OUT - LDO1 output voltage select register (address 2Dh) bit description[1] Bit Symbol Access Description 4:0 ldo1_out R/W VO(prog) = 0.9 + ldo1_out × 0.1 V (max 3.6V); e.g. 00000 : 0.9 V 00001 : 1.0 V 11000 : 3.3 V 11011 : 3.6 V 11111 : 3.6 V The n_voltage settings for HCLDO and MEMLDO are also wrong. n_voltage for HCLDO and MEMLDO should be (3.6 - 0.9) / 0.1 + 1 = 28 Table 88. HCLDOOUT - HCLDO output voltage select register (addr. 39h) bit description[1] Bit Symbol Access Description 4:0 hcldo_out R/W VO(prog) = 0.9 + hcldo_out × 0.1 V (max 3.6 V); e.g. 00000 : 0.9 V 00001 : 1.0 V 11011 : 3.6 V 11111 : 3.6 V Table 62. MEMLDOOUT - MEMLDO o/p voltage select reg. (address 26h) bit description[1] Bit Symbol Access Description 4:0 memldo_out R/W VO(prog) = 0.9 + memldo_out × 0.1 V; e.g. 00000: 0.9 V 00001: 1.0 V 11000 : 3.3 V 11011 : 3.6 V 11111 : 3.6 V Signed-off-by: Axel Lin <axel.lin@gmail.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/regulator/pcf50633-regulator.c')
-rw-r--r--drivers/regulator/pcf50633-regulator.c27
1 files changed, 13 insertions, 14 deletions
diff --git a/drivers/regulator/pcf50633-regulator.c b/drivers/regulator/pcf50633-regulator.c
index 1d1c3105629..6db46c632f1 100644
--- a/drivers/regulator/pcf50633-regulator.c
+++ b/drivers/regulator/pcf50633-regulator.c
@@ -142,6 +142,7 @@ static int pcf50633_regulator_set_voltage(struct regulator_dev *rdev,
142 case PCF50633_REGULATOR_LDO5: 142 case PCF50633_REGULATOR_LDO5:
143 case PCF50633_REGULATOR_LDO6: 143 case PCF50633_REGULATOR_LDO6:
144 case PCF50633_REGULATOR_HCLDO: 144 case PCF50633_REGULATOR_HCLDO:
145 case PCF50633_REGULATOR_MEMLDO:
145 volt_bits = ldo_voltage_bits(millivolts); 146 volt_bits = ldo_voltage_bits(millivolts);
146 break; 147 break;
147 default: 148 default:
@@ -175,6 +176,7 @@ static int pcf50633_regulator_voltage_value(enum pcf50633_regulator_id id,
175 case PCF50633_REGULATOR_LDO5: 176 case PCF50633_REGULATOR_LDO5:
176 case PCF50633_REGULATOR_LDO6: 177 case PCF50633_REGULATOR_LDO6:
177 case PCF50633_REGULATOR_HCLDO: 178 case PCF50633_REGULATOR_HCLDO:
179 case PCF50633_REGULATOR_MEMLDO:
178 millivolts = ldo_voltage_value(bits); 180 millivolts = ldo_voltage_value(bits);
179 break; 181 break;
180 default: 182 default:
@@ -217,9 +219,6 @@ static int pcf50633_regulator_list_voltage(struct regulator_dev *rdev,
217 case PCF50633_REGULATOR_AUTO: 219 case PCF50633_REGULATOR_AUTO:
218 index += 0x2f; 220 index += 0x2f;
219 break; 221 break;
220 case PCF50633_REGULATOR_HCLDO:
221 index += 0x01;
222 break;
223 default: 222 default:
224 break; 223 break;
225 } 224 }
@@ -288,27 +287,27 @@ static struct regulator_ops pcf50633_regulator_ops = {
288 287
289static struct regulator_desc regulators[] = { 288static struct regulator_desc regulators[] = {
290 [PCF50633_REGULATOR_AUTO] = 289 [PCF50633_REGULATOR_AUTO] =
291 PCF50633_REGULATOR("auto", PCF50633_REGULATOR_AUTO, 80), 290 PCF50633_REGULATOR("auto", PCF50633_REGULATOR_AUTO, 81),
292 [PCF50633_REGULATOR_DOWN1] = 291 [PCF50633_REGULATOR_DOWN1] =
293 PCF50633_REGULATOR("down1", PCF50633_REGULATOR_DOWN1, 95), 292 PCF50633_REGULATOR("down1", PCF50633_REGULATOR_DOWN1, 96),
294 [PCF50633_REGULATOR_DOWN2] = 293 [PCF50633_REGULATOR_DOWN2] =
295 PCF50633_REGULATOR("down2", PCF50633_REGULATOR_DOWN2, 95), 294 PCF50633_REGULATOR("down2", PCF50633_REGULATOR_DOWN2, 96),
296 [PCF50633_REGULATOR_LDO1] = 295 [PCF50633_REGULATOR_LDO1] =
297 PCF50633_REGULATOR("ldo1", PCF50633_REGULATOR_LDO1, 27), 296 PCF50633_REGULATOR("ldo1", PCF50633_REGULATOR_LDO1, 28),
298 [PCF50633_REGULATOR_LDO2] = 297 [PCF50633_REGULATOR_LDO2] =
299 PCF50633_REGULATOR("ldo2", PCF50633_REGULATOR_LDO2, 27), 298 PCF50633_REGULATOR("ldo2", PCF50633_REGULATOR_LDO2, 28),
300 [PCF50633_REGULATOR_LDO3] = 299 [PCF50633_REGULATOR_LDO3] =
301 PCF50633_REGULATOR("ldo3", PCF50633_REGULATOR_LDO3, 27), 300 PCF50633_REGULATOR("ldo3", PCF50633_REGULATOR_LDO3, 28),
302 [PCF50633_REGULATOR_LDO4] = 301 [PCF50633_REGULATOR_LDO4] =
303 PCF50633_REGULATOR("ldo4", PCF50633_REGULATOR_LDO4, 27), 302 PCF50633_REGULATOR("ldo4", PCF50633_REGULATOR_LDO4, 28),
304 [PCF50633_REGULATOR_LDO5] = 303 [PCF50633_REGULATOR_LDO5] =
305 PCF50633_REGULATOR("ldo5", PCF50633_REGULATOR_LDO5, 27), 304 PCF50633_REGULATOR("ldo5", PCF50633_REGULATOR_LDO5, 28),
306 [PCF50633_REGULATOR_LDO6] = 305 [PCF50633_REGULATOR_LDO6] =
307 PCF50633_REGULATOR("ldo6", PCF50633_REGULATOR_LDO6, 27), 306 PCF50633_REGULATOR("ldo6", PCF50633_REGULATOR_LDO6, 28),
308 [PCF50633_REGULATOR_HCLDO] = 307 [PCF50633_REGULATOR_HCLDO] =
309 PCF50633_REGULATOR("hcldo", PCF50633_REGULATOR_HCLDO, 26), 308 PCF50633_REGULATOR("hcldo", PCF50633_REGULATOR_HCLDO, 28),
310 [PCF50633_REGULATOR_MEMLDO] = 309 [PCF50633_REGULATOR_MEMLDO] =
311 PCF50633_REGULATOR("memldo", PCF50633_REGULATOR_MEMLDO, 0), 310 PCF50633_REGULATOR("memldo", PCF50633_REGULATOR_MEMLDO, 28),
312}; 311};
313 312
314static int __devinit pcf50633_regulator_probe(struct platform_device *pdev) 313static int __devinit pcf50633_regulator_probe(struct platform_device *pdev)