aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2012-08-20 12:41:35 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-08-28 14:00:30 -0400
commita0a7014cd40b1d1d13e121e5083bd3b2bbffe348 (patch)
tree85da9412862c604416e5acd5ccb85d1478d8daf8 /drivers/regulator
parentdb55168265699c72e6ebf7a4228029da590a3eab (diff)
regulator: ab8500: provide per-regulator shift
This encodes the voltage shifts (the number of bits to shift the register to get to the selector) into the regulator info. We have several new variants of the AB8500 so this varies a lot. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/regulator')
-rw-r--r--drivers/regulator/ab8500.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/regulator/ab8500.c b/drivers/regulator/ab8500.c
index c884a5c4b473..e3d1d063025a 100644
--- a/drivers/regulator/ab8500.c
+++ b/drivers/regulator/ab8500.c
@@ -37,6 +37,7 @@
37 * @voltage_bank: bank to control regulator voltage 37 * @voltage_bank: bank to control regulator voltage
38 * @voltage_reg: register to control regulator voltage 38 * @voltage_reg: register to control regulator voltage
39 * @voltage_mask: mask to control regulator voltage 39 * @voltage_mask: mask to control regulator voltage
40 * @voltage_shift: shift to control regulator voltage
40 * @delay: startup/set voltage delay in us 41 * @delay: startup/set voltage delay in us
41 */ 42 */
42struct ab8500_regulator_info { 43struct ab8500_regulator_info {
@@ -50,6 +51,7 @@ struct ab8500_regulator_info {
50 u8 voltage_bank; 51 u8 voltage_bank;
51 u8 voltage_reg; 52 u8 voltage_reg;
52 u8 voltage_mask; 53 u8 voltage_mask;
54 u8 voltage_shift;
53 unsigned int delay; 55 unsigned int delay;
54}; 56};
55 57
@@ -195,17 +197,14 @@ static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
195 } 197 }
196 198
197 dev_vdbg(rdev_get_dev(rdev), 199 dev_vdbg(rdev_get_dev(rdev),
198 "%s-get_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x," 200 "%s-get_voltage (bank, reg, mask, shift, value): "
199 " 0x%x\n", 201 "0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",
200 info->desc.name, info->voltage_bank, info->voltage_reg, 202 info->desc.name, info->voltage_bank,
201 info->voltage_mask, regval); 203 info->voltage_reg, info->voltage_mask,
204 info->voltage_shift, regval);
202 205
203 /* vintcore has a different layout */
204 val = regval & info->voltage_mask; 206 val = regval & info->voltage_mask;
205 if (info->desc.id == AB8500_LDO_INTCORE) 207 return val >> info->voltage_shift;
206 return val >> 0x3;
207 else
208 return val;
209} 208}
210 209
211static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev, 210static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
@@ -221,7 +220,7 @@ static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
221 } 220 }
222 221
223 /* set the registers for the request */ 222 /* set the registers for the request */
224 regval = (u8)selector; 223 regval = (u8)selector << info->voltage_shift;
225 ret = abx500_mask_and_set_register_interruptible(info->dev, 224 ret = abx500_mask_and_set_register_interruptible(info->dev,
226 info->voltage_bank, info->voltage_reg, 225 info->voltage_bank, info->voltage_reg,
227 info->voltage_mask, regval); 226 info->voltage_mask, regval);
@@ -343,6 +342,7 @@ static struct ab8500_regulator_info
343 .voltage_bank = 0x03, 342 .voltage_bank = 0x03,
344 .voltage_reg = 0x80, 343 .voltage_reg = 0x80,
345 .voltage_mask = 0x38, 344 .voltage_mask = 0x38,
345 .voltage_shift = 3,
346 }, 346 },
347 347
348 /* 348 /*