diff options
| -rw-r--r-- | drivers/regulator/qcom_rpm-regulator.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/regulator/qcom_rpm-regulator.c b/drivers/regulator/qcom_rpm-regulator.c index 00c5cc3d9546..15e07c233c1e 100644 --- a/drivers/regulator/qcom_rpm-regulator.c +++ b/drivers/regulator/qcom_rpm-regulator.c | |||
| @@ -393,6 +393,28 @@ static int rpm_reg_is_enabled(struct regulator_dev *rdev) | |||
| 393 | return vreg->is_enabled; | 393 | return vreg->is_enabled; |
| 394 | } | 394 | } |
| 395 | 395 | ||
| 396 | static int rpm_reg_set_load(struct regulator_dev *rdev, int load_uA) | ||
| 397 | { | ||
| 398 | struct qcom_rpm_reg *vreg = rdev_get_drvdata(rdev); | ||
| 399 | const struct rpm_reg_parts *parts = vreg->parts; | ||
| 400 | const struct request_member *req = &parts->ia; | ||
| 401 | int load_mA = load_uA / 1000; | ||
| 402 | int max_mA = req->mask >> req->shift; | ||
| 403 | int ret; | ||
| 404 | |||
| 405 | if (req->mask == 0) | ||
| 406 | return -EINVAL; | ||
| 407 | |||
| 408 | if (load_mA > max_mA) | ||
| 409 | load_mA = max_mA; | ||
| 410 | |||
| 411 | mutex_lock(&vreg->lock); | ||
| 412 | ret = rpm_reg_write(vreg, req, load_mA); | ||
| 413 | mutex_unlock(&vreg->lock); | ||
| 414 | |||
| 415 | return ret; | ||
| 416 | } | ||
| 417 | |||
| 396 | static struct regulator_ops uV_ops = { | 418 | static struct regulator_ops uV_ops = { |
| 397 | .list_voltage = regulator_list_voltage_linear_range, | 419 | .list_voltage = regulator_list_voltage_linear_range, |
| 398 | 420 | ||
| @@ -402,6 +424,8 @@ static struct regulator_ops uV_ops = { | |||
| 402 | .enable = rpm_reg_uV_enable, | 424 | .enable = rpm_reg_uV_enable, |
| 403 | .disable = rpm_reg_uV_disable, | 425 | .disable = rpm_reg_uV_disable, |
| 404 | .is_enabled = rpm_reg_is_enabled, | 426 | .is_enabled = rpm_reg_is_enabled, |
| 427 | |||
| 428 | .set_load = rpm_reg_set_load, | ||
| 405 | }; | 429 | }; |
| 406 | 430 | ||
| 407 | static struct regulator_ops mV_ops = { | 431 | static struct regulator_ops mV_ops = { |
| @@ -413,6 +437,8 @@ static struct regulator_ops mV_ops = { | |||
| 413 | .enable = rpm_reg_mV_enable, | 437 | .enable = rpm_reg_mV_enable, |
| 414 | .disable = rpm_reg_mV_disable, | 438 | .disable = rpm_reg_mV_disable, |
| 415 | .is_enabled = rpm_reg_is_enabled, | 439 | .is_enabled = rpm_reg_is_enabled, |
| 440 | |||
| 441 | .set_load = rpm_reg_set_load, | ||
| 416 | }; | 442 | }; |
| 417 | 443 | ||
| 418 | static struct regulator_ops switch_ops = { | 444 | static struct regulator_ops switch_ops = { |
| @@ -706,6 +732,10 @@ static int rpm_reg_probe(struct platform_device *pdev) | |||
| 706 | return -EINVAL; | 732 | return -EINVAL; |
| 707 | } | 733 | } |
| 708 | 734 | ||
| 735 | /* Regulators with ia property suppports drms */ | ||
| 736 | if (vreg->parts->ia.mask) | ||
| 737 | initdata->constraints.valid_ops_mask |= REGULATOR_CHANGE_DRMS; | ||
| 738 | |||
| 709 | key = "bias-pull-down"; | 739 | key = "bias-pull-down"; |
| 710 | if (of_property_read_bool(pdev->dev.of_node, key)) { | 740 | if (of_property_read_bool(pdev->dev.of_node, key)) { |
| 711 | ret = rpm_reg_set(vreg, &vreg->parts->pd, 1); | 741 | ret = rpm_reg_set(vreg, &vreg->parts->pd, 1); |
