aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@gmail.com>2012-03-15 08:00:07 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-04-01 06:59:35 -0400
commit0ec446ea9a1cc86bfeb0c724a490701271d02fa5 (patch)
tree47d64671ae6c217e460fb8fc0f0ef5b07f24c488
parent9210f05b4eb0e9d08b527417fa6ebc043a232bd6 (diff)
regulator: Refactor to use one da9052_ldo_ops/da9052_dcdc_ops for all LDOs/DCDCs
In current implementation, da9052_ldo_ops and da9052_ldo5_6_ops are very similar, only the set_voltage is slightly different. da9052_buckperi_ops and da9052_dcdc_ops are also similar. This patch adds da9052_regulator_set_voltage for the set_voltage callback used by all LDOs and DCDCs. Rework da9052_get_regulator_voltage_sel and da9052_set_dcdc_voltage to make it possible to be shared by all DCDCs. Rework da9052_list_voltage to make it to be shared by all DCDCs and LDOs. Then we can remove da9052_ldo5_6_ops and da9052_buckperi_ops. We can also remove DA9052_LDO5_6 and DA9052_BUCKPERI macros which is not used now. Signed-off-by: Axel Lin <axel.lin@gmail.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--drivers/regulator/da9052-regulator.c230
1 files changed, 44 insertions, 186 deletions
diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c
index ddcba361bad6..7eb7293bcd12 100644
--- a/drivers/regulator/da9052-regulator.c
+++ b/drivers/regulator/da9052-regulator.c
@@ -189,36 +189,23 @@ static int da9052_dcdc_set_current_limit(struct regulator_dev *rdev, int min_uA,
189 reg_val << 6); 189 reg_val << 6);
190} 190}
191 191
192static int da9052_list_buckperi_voltage(struct regulator_dev *rdev,
193 unsigned int selector)
194{
195 struct da9052_regulator *regulator = rdev_get_drvdata(rdev);
196 struct da9052_regulator_info *info = regulator->info;
197 int volt_uV;
198
199 if ((regulator->da9052->chip_id == DA9052) &&
200 (selector >= DA9052_BUCK_PERI_REG_MAP_UPTO_3uV)) {
201 volt_uV = ((DA9052_BUCK_PERI_REG_MAP_UPTO_3uV * info->step_uV)
202 + info->min_uV);
203 volt_uV += (selector - DA9052_BUCK_PERI_REG_MAP_UPTO_3uV)
204 * (DA9052_BUCK_PERI_3uV_STEP);
205 } else
206 volt_uV = (selector * info->step_uV) + info->min_uV;
207
208 if (volt_uV > info->max_uV)
209 return -EINVAL;
210
211 return volt_uV;
212}
213
214static int da9052_list_voltage(struct regulator_dev *rdev, 192static int da9052_list_voltage(struct regulator_dev *rdev,
215 unsigned int selector) 193 unsigned int selector)
216{ 194{
217 struct da9052_regulator *regulator = rdev_get_drvdata(rdev); 195 struct da9052_regulator *regulator = rdev_get_drvdata(rdev);
218 struct da9052_regulator_info *info = regulator->info; 196 struct da9052_regulator_info *info = regulator->info;
197 int id = rdev_get_id(rdev);
219 int volt_uV; 198 int volt_uV;
220 199
221 volt_uV = info->min_uV + info->step_uV * selector; 200 if ((id == DA9052_ID_BUCK4) && (regulator->da9052->chip_id == DA9052)
201 && (selector >= DA9052_BUCK_PERI_REG_MAP_UPTO_3uV)) {
202 volt_uV = ((DA9052_BUCK_PERI_REG_MAP_UPTO_3uV * info->step_uV)
203 + info->min_uV);
204 volt_uV += (selector - DA9052_BUCK_PERI_REG_MAP_UPTO_3uV)
205 * (DA9052_BUCK_PERI_3uV_STEP);
206 } else {
207 volt_uV = (selector * info->step_uV) + info->min_uV;
208 }
222 209
223 if (volt_uV > info->max_uV) 210 if (volt_uV > info->max_uV)
224 return -EINVAL; 211 return -EINVAL;
@@ -226,13 +213,13 @@ static int da9052_list_voltage(struct regulator_dev *rdev,
226 return volt_uV; 213 return volt_uV;
227} 214}
228 215
229static int da9052_regulator_set_voltage_int(struct regulator_dev *rdev, 216static int da9052_regulator_set_voltage(struct regulator_dev *rdev,
230 int min_uV, int max_uV, 217 int min_uV, int max_uV,
231 unsigned int *selector) 218 unsigned int *selector)
232{ 219{
233 struct da9052_regulator *regulator = rdev_get_drvdata(rdev); 220 struct da9052_regulator *regulator = rdev_get_drvdata(rdev);
234 struct da9052_regulator_info *info = regulator->info; 221 struct da9052_regulator_info *info = regulator->info;
235 int offset = rdev_get_id(rdev); 222 int id = rdev_get_id(rdev);
236 int ret; 223 int ret;
237 224
238 ret = verify_range(info, min_uV, max_uV); 225 ret = verify_range(info, min_uV, max_uV);
@@ -242,113 +229,43 @@ static int da9052_regulator_set_voltage_int(struct regulator_dev *rdev,
242 if (min_uV < info->min_uV) 229 if (min_uV < info->min_uV)
243 min_uV = info->min_uV; 230 min_uV = info->min_uV;
244 231
245 *selector = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV); 232 if ((id == DA9052_ID_BUCK4) && (regulator->da9052->chip_id == DA9052)
233 && (min_uV >= DA9052_CONST_3uV)) {
234 *selector = DA9052_BUCK_PERI_REG_MAP_UPTO_3uV +
235 DIV_ROUND_UP(min_uV - DA9052_CONST_3uV,
236 DA9052_BUCK_PERI_3uV_STEP);
237 } else {
238 *selector = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV);
239 }
246 240
247 ret = da9052_list_voltage(rdev, *selector); 241 ret = da9052_list_voltage(rdev, *selector);
248 if (ret < 0) 242 if (ret < 0)
249 return ret; 243 return ret;
250 244
251 return da9052_reg_update(regulator->da9052, 245 ret = da9052_reg_update(regulator->da9052,
252 DA9052_BUCKCORE_REG + offset, 246 DA9052_BUCKCORE_REG + id,
253 (1 << info->volt_shift) - 1, *selector); 247 (1 << info->volt_shift) - 1, *selector);
254}
255
256static int da9052_set_ldo_voltage(struct regulator_dev *rdev,
257 int min_uV, int max_uV,
258 unsigned int *selector)
259{
260 return da9052_regulator_set_voltage_int(rdev, min_uV, max_uV, selector);
261}
262
263static int da9052_set_ldo5_6_voltage(struct regulator_dev *rdev,
264 int min_uV, int max_uV,
265 unsigned int *selector)
266{
267 struct da9052_regulator *regulator = rdev_get_drvdata(rdev);
268 struct da9052_regulator_info *info = regulator->info;
269 int ret;
270
271 ret = da9052_regulator_set_voltage_int(rdev, min_uV, max_uV, selector);
272 if (ret < 0) 248 if (ret < 0)
273 return ret; 249 return ret;
274 250
275 /* Some LDOs are DVC controlled which requires enabling of 251 /* Some LDOs and DCDCs are DVC controlled which requires enabling of
276 * the LDO activate bit to implment the changes on the 252 * the activate bit to implment the changes on the output.
277 * LDO output. 253 */
278 */ 254 switch (id) {
279 return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, 255 case DA9052_ID_BUCK1:
280 info->activate_bit, info->activate_bit); 256 case DA9052_ID_BUCK2:
281} 257 case DA9052_ID_BUCK3:
282 258 case DA9052_ID_LDO2:
283static int da9052_set_dcdc_voltage(struct regulator_dev *rdev, 259 case DA9052_ID_LDO3:
284 int min_uV, int max_uV, 260 ret = da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG,
285 unsigned int *selector) 261 info->activate_bit, info->activate_bit);
286{ 262 break;
287 struct da9052_regulator *regulator = rdev_get_drvdata(rdev); 263 }
288 struct da9052_regulator_info *info = regulator->info;
289 int ret;
290
291 ret = da9052_regulator_set_voltage_int(rdev, min_uV, max_uV, selector);
292 if (ret < 0)
293 return ret;
294
295 /* Some DCDCs are DVC controlled which requires enabling of
296 * the DCDC activate bit to implment the changes on the
297 * DCDC output.
298 */
299 return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG,
300 info->activate_bit, info->activate_bit);
301}
302
303static int da9052_get_regulator_voltage_sel(struct regulator_dev *rdev)
304{
305 struct da9052_regulator *regulator = rdev_get_drvdata(rdev);
306 struct da9052_regulator_info *info = regulator->info;
307 int offset = rdev_get_id(rdev);
308 int ret;
309
310 ret = da9052_reg_read(regulator->da9052, DA9052_BUCKCORE_REG + offset);
311 if (ret < 0)
312 return ret;
313
314 ret &= ((1 << info->volt_shift) - 1);
315 264
316 return ret; 265 return ret;
317} 266}
318 267
319static int da9052_set_buckperi_voltage(struct regulator_dev *rdev, int min_uV, 268static int da9052_get_regulator_voltage_sel(struct regulator_dev *rdev)
320 int max_uV, unsigned int *selector)
321{