diff options
| -rw-r--r-- | drivers/regulator/da9052-regulator.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c index 1e4d483f6163..e4bbe64ca867 100644 --- a/drivers/regulator/da9052-regulator.c +++ b/drivers/regulator/da9052-regulator.c | |||
| @@ -70,6 +70,7 @@ struct da9052_regulator_info { | |||
| 70 | int step_uV; | 70 | int step_uV; |
| 71 | int min_uV; | 71 | int min_uV; |
| 72 | int max_uV; | 72 | int max_uV; |
| 73 | unsigned char activate_bit; | ||
| 73 | }; | 74 | }; |
| 74 | 75 | ||
| 75 | struct da9052_regulator { | 76 | struct da9052_regulator { |
| @@ -209,6 +210,36 @@ static int da9052_map_voltage(struct regulator_dev *rdev, | |||
| 209 | return sel; | 210 | return sel; |
| 210 | } | 211 | } |
| 211 | 212 | ||
| 213 | static int da9052_regulator_set_voltage_sel(struct regulator_dev *rdev, | ||
| 214 | unsigned int selector) | ||
| 215 | { | ||
| 216 | struct da9052_regulator *regulator = rdev_get_drvdata(rdev); | ||
| 217 | struct da9052_regulator_info *info = regulator->info; | ||
| 218 | int id = rdev_get_id(rdev); | ||
| 219 | int ret; | ||
| 220 | |||
| 221 | ret = da9052_reg_update(regulator->da9052, rdev->desc->vsel_reg, | ||
| 222 | rdev->desc->vsel_mask, selector); | ||
| 223 | if (ret < 0) | ||
| 224 | return ret; | ||
| 225 | |||
| 226 | /* Some LDOs and DCDCs are DVC controlled which requires enabling of | ||
| 227 | * the activate bit to implment the changes on the output. | ||
| 228 | */ | ||
| 229 | switch (id) { | ||
| 230 | case DA9052_ID_BUCK1: | ||
| 231 | case DA9052_ID_BUCK2: | ||
| 232 | case DA9052_ID_BUCK3: | ||
| 233 | case DA9052_ID_LDO2: | ||
| 234 | case DA9052_ID_LDO3: | ||
| 235 | ret = da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, | ||
| 236 | info->activate_bit, info->activate_bit); | ||
| 237 | break; | ||
| 238 | } | ||
| 239 | |||
| 240 | return ret; | ||
| 241 | } | ||
| 242 | |||
| 212 | static struct regulator_ops da9052_dcdc_ops = { | 243 | static struct regulator_ops da9052_dcdc_ops = { |
| 213 | .get_current_limit = da9052_dcdc_get_current_limit, | 244 | .get_current_limit = da9052_dcdc_get_current_limit, |
| 214 | .set_current_limit = da9052_dcdc_set_current_limit, | 245 | .set_current_limit = da9052_dcdc_set_current_limit, |
| @@ -216,7 +247,7 @@ static struct regulator_ops da9052_dcdc_ops = { | |||
| 216 | .list_voltage = da9052_list_voltage, | 247 | .list_voltage = da9052_list_voltage, |
| 217 | .map_voltage = da9052_map_voltage, | 248 | .map_voltage = da9052_map_voltage, |
| 218 | .get_voltage_sel = regulator_get_voltage_sel_regmap, | 249 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
| 219 | .set_voltage_sel = regulator_set_voltage_sel_regmap, | 250 | .set_voltage_sel = da9052_regulator_set_voltage_sel, |
| 220 | .is_enabled = regulator_is_enabled_regmap, | 251 | .is_enabled = regulator_is_enabled_regmap, |
| 221 | .enable = regulator_enable_regmap, | 252 | .enable = regulator_enable_regmap, |
| 222 | .disable = regulator_disable_regmap, | 253 | .disable = regulator_disable_regmap, |
| @@ -226,7 +257,7 @@ static struct regulator_ops da9052_ldo_ops = { | |||
| 226 | .list_voltage = da9052_list_voltage, | 257 | .list_voltage = da9052_list_voltage, |
| 227 | .map_voltage = da9052_map_voltage, | 258 | .map_voltage = da9052_map_voltage, |
| 228 | .get_voltage_sel = regulator_get_voltage_sel_regmap, | 259 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
| 229 | .set_voltage_sel = regulator_set_voltage_sel_regmap, | 260 | .set_voltage_sel = da9052_regulator_set_voltage_sel, |
| 230 | .is_enabled = regulator_is_enabled_regmap, | 261 | .is_enabled = regulator_is_enabled_regmap, |
| 231 | .enable = regulator_enable_regmap, | 262 | .enable = regulator_enable_regmap, |
| 232 | .disable = regulator_disable_regmap, | 263 | .disable = regulator_disable_regmap, |
| @@ -243,14 +274,13 @@ static struct regulator_ops da9052_ldo_ops = { | |||
| 243 | .owner = THIS_MODULE,\ | 274 | .owner = THIS_MODULE,\ |
| 244 | .vsel_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ | 275 | .vsel_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ |
| 245 | .vsel_mask = (1 << (sbits)) - 1,\ | 276 | .vsel_mask = (1 << (sbits)) - 1,\ |
| 246 | .apply_reg = DA9052_SUPPLY_REG, \ | ||
| 247 | .apply_bit = (abits), \ | ||
| 248 | .enable_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ | 277 | .enable_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ |
| 249 | .enable_mask = 1 << (ebits),\ | 278 | .enable_mask = 1 << (ebits),\ |
| 250 | },\ | 279 | },\ |
| 251 | .min_uV = (min) * 1000,\ | 280 | .min_uV = (min) * 1000,\ |
| 252 | .max_uV = (max) * 1000,\ | 281 | .max_uV = (max) * 1000,\ |
| 253 | .step_uV = (step) * 1000,\ | 282 | .step_uV = (step) * 1000,\ |
| 283 | .activate_bit = (abits),\ | ||
| 254 | } | 284 | } |
| 255 | 285 | ||
| 256 | #define DA9052_DCDC(_id, step, min, max, sbits, ebits, abits) \ | 286 | #define DA9052_DCDC(_id, step, min, max, sbits, ebits, abits) \ |
| @@ -264,14 +294,13 @@ static struct regulator_ops da9052_ldo_ops = { | |||
| 264 | .owner = THIS_MODULE,\ | 294 | .owner = THIS_MODULE,\ |
| 265 | .vsel_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ | 295 | .vsel_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ |
| 266 | .vsel_mask = (1 << (sbits)) - 1,\ | 296 | .vsel_mask = (1 << (sbits)) - 1,\ |
| 267 | .apply_reg = DA9052_SUPPLY_REG, \ | ||
| 268 | .apply_bit = (abits), \ | ||
| 269 | .enable_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ | 297 | .enable_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ |
| 270 | .enable_mask = 1 << (ebits),\ | 298 | .enable_mask = 1 << (ebits),\ |
| 271 | },\ | 299 | },\ |
| 272 | .min_uV = (min) * 1000,\ | 300 | .min_uV = (min) * 1000,\ |
| 273 | .max_uV = (max) * 1000,\ | 301 | .max_uV = (max) * 1000,\ |
| 274 | .step_uV = (step) * 1000,\ | 302 | .step_uV = (step) * 1000,\ |
| 303 | .activate_bit = (abits),\ | ||
| 275 | } | 304 | } |
| 276 | 305 | ||
| 277 | static struct da9052_regulator_info da9052_regulator_info[] = { | 306 | static struct da9052_regulator_info da9052_regulator_info[] = { |
