diff options
| author | Axel Lin <axel.lin@gmail.com> | 2012-03-15 08:00:07 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-04-01 06:59:35 -0400 |
| commit | 0ec446ea9a1cc86bfeb0c724a490701271d02fa5 (patch) | |
| tree | 47d64671ae6c217e460fb8fc0f0ef5b07f24c488 | |
| parent | 9210f05b4eb0e9d08b527417fa6ebc043a232bd6 (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.c | 230 |
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 | ||
| 192 | static 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 | |||
| 214 | static int da9052_list_voltage(struct regulator_dev *rdev, | 192 | static 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 | ||
| 229 | static int da9052_regulator_set_voltage_int(struct regulator_dev *rdev, | 216 | static 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 | |||
| 256 | static 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 | |||
| 263 | static 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: | |
| 283 | static 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 | |||
| 303 | static 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 | ||
| 319 | static int da9052_set_buckperi_voltage(struct regulator_dev *rdev, int min_uV, | 268 | static int da9052_get_regulator_voltage_sel(struct regulator_dev *rdev) |
| 320 | int max_uV, unsigned int *selector) | ||
| 321 | { | ||
