aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/power/regulator/consumer.txt2
-rw-r--r--drivers/gpu/drm/msm/edp/edp_ctrl.c6
-rw-r--r--drivers/phy/phy-qcom-ufs.c4
-rw-r--r--drivers/regulator/core.c8
-rw-r--r--drivers/regulator/devres.c85
-rw-r--r--drivers/regulator/palmas-regulator.c11
-rw-r--r--drivers/regulator/qcom_rpm-regulator.c290
-rw-r--r--drivers/regulator/stw481x-vmmc.c8
-rw-r--r--drivers/scsi/ufs/ufshcd.c27
-rw-r--r--drivers/usb/phy/phy-ab8500-usb.c4
-rw-r--r--drivers/usb/phy/phy-msm-usb.c15
-rw-r--r--include/linux/mfd/palmas.h1
-rw-r--r--include/linux/mfd/stw481x.h4
-rw-r--r--include/linux/regulator/consumer.h21
14 files changed, 334 insertions, 152 deletions
diff --git a/Documentation/power/regulator/consumer.txt b/Documentation/power/regulator/consumer.txt
index 8afb236ca765..e51564c1a140 100644
--- a/Documentation/power/regulator/consumer.txt
+++ b/Documentation/power/regulator/consumer.txt
@@ -137,7 +137,7 @@ Indirect operating mode control.
137Consumer drivers can request a change in their supply regulator operating mode 137Consumer drivers can request a change in their supply regulator operating mode
138by calling :- 138by calling :-
139 139
140int regulator_set_optimum_mode(struct regulator *regulator, int load_uA); 140int regulator_set_load(struct regulator *regulator, int load_uA);
141 141
142This will cause the core to recalculate the total load on the regulator (based 142This will cause the core to recalculate the total load on the regulator (based
143on all its consumers) and change operating mode (if necessary and permitted) 143on all its consumers) and change operating mode (if necessary and permitted)
diff --git a/drivers/gpu/drm/msm/edp/edp_ctrl.c b/drivers/gpu/drm/msm/edp/edp_ctrl.c
index 3e246210c46f..0ec5abdba5c4 100644
--- a/drivers/gpu/drm/msm/edp/edp_ctrl.c
+++ b/drivers/gpu/drm/msm/edp/edp_ctrl.c
@@ -332,7 +332,7 @@ static int edp_regulator_enable(struct edp_ctrl *ctrl)
332 goto vdda_set_fail; 332 goto vdda_set_fail;
333 } 333 }
334 334
335 ret = regulator_set_optimum_mode(ctrl->vdda_vreg, VDDA_UA_ON_LOAD); 335 ret = regulator_set_load(ctrl->vdda_vreg, VDDA_UA_ON_LOAD);
336 if (ret < 0) { 336 if (ret < 0) {
337 pr_err("%s: vdda_vreg set regulator mode failed.\n", __func__); 337 pr_err("%s: vdda_vreg set regulator mode failed.\n", __func__);
338 goto vdda_set_fail; 338 goto vdda_set_fail;
@@ -356,7 +356,7 @@ static int edp_regulator_enable(struct edp_ctrl *ctrl)
356lvl_enable_fail: 356lvl_enable_fail:
357 regulator_disable(ctrl->vdda_vreg); 357 regulator_disable(ctrl->vdda_vreg);
358vdda_enable_fail: 358vdda_enable_fail:
359 regulator_set_optimum_mode(ctrl->vdda_vreg, VDDA_UA_OFF_LOAD); 359 regulator_set_load(ctrl->vdda_vreg, VDDA_UA_OFF_LOAD);
360vdda_set_fail: 360vdda_set_fail:
361 return ret; 361 return ret;
362} 362}
@@ -365,7 +365,7 @@ static void edp_regulator_disable(struct edp_ctrl *ctrl)
365{ 365{
366 regulator_disable(ctrl->lvl_vreg); 366 regulator_disable(ctrl->lvl_vreg);
367 regulator_disable(ctrl->vdda_vreg); 367 regulator_disable(ctrl->vdda_vreg);
368 regulator_set_optimum_mode(ctrl->vdda_vreg, VDDA_UA_OFF_LOAD); 368 regulator_set_load(ctrl->vdda_vreg, VDDA_UA_OFF_LOAD);
369} 369}
370 370
371static int edp_gpio_config(struct edp_ctrl *ctrl) 371static int edp_gpio_config(struct edp_ctrl *ctrl)
diff --git a/drivers/phy/phy-qcom-ufs.c b/drivers/phy/phy-qcom-ufs.c
index 44ee983d57fe..86665e9dc399 100644
--- a/drivers/phy/phy-qcom-ufs.c
+++ b/drivers/phy/phy-qcom-ufs.c
@@ -346,10 +346,10 @@ int ufs_qcom_phy_cfg_vreg(struct phy *phy,
346 goto out; 346 goto out;
347 } 347 }
348 uA_load = on ? vreg->max_uA : 0; 348 uA_load = on ? vreg->max_uA : 0;
349 ret = regulator_set_optimum_mode(reg, uA_load); 349 ret = regulator_set_load(reg, uA_load);
350 if (ret >= 0) { 350 if (ret >= 0) {
351 /* 351 /*
352 * regulator_set_optimum_mode() returns new regulator 352 * regulator_set_load() returns new regulator
353 * mode upon success. 353 * mode upon success.
354 */ 354 */
355 ret = 0; 355 ret = 0;
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index e23fd00ec5e2..443eaab933fc 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -3061,7 +3061,7 @@ unsigned int regulator_get_mode(struct regulator *regulator)
3061EXPORT_SYMBOL_GPL(regulator_get_mode); 3061EXPORT_SYMBOL_GPL(regulator_get_mode);
3062 3062
3063/** 3063/**
3064 * regulator_set_optimum_mode - set regulator optimum operating mode 3064 * regulator_set_load - set regulator load
3065 * @regulator: regulator source 3065 * @regulator: regulator source
3066 * @uA_load: load current 3066 * @uA_load: load current
3067 * 3067 *
@@ -3084,9 +3084,9 @@ EXPORT_SYMBOL_GPL(regulator_get_mode);
3084 * DRMS will sum the total requested load on the regulator and change 3084 * DRMS will sum the total requested load on the regulator and change
3085 * to the most efficient operating mode if platform constraints allow. 3085 * to the most efficient operating mode if platform constraints allow.
3086 * 3086 *
3087 * Returns the new regulator mode or error. 3087 * On error a negative errno is returned.
3088 */ 3088 */
3089int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) 3089int regulator_set_load(struct regulator *regulator, int uA_load)
3090{ 3090{
3091 struct regulator_dev *rdev = regulator->rdev; 3091 struct regulator_dev *rdev = regulator->rdev;
3092 int ret; 3092 int ret;
@@ -3098,7 +3098,7 @@ int regulator_set_optimum_mode(struct regulator *regulator, int uA_load)
3098 3098
3099 return ret; 3099 return ret;
3100} 3100}
3101EXPORT_SYMBOL_GPL(regulator_set_optimum_mode); 3101EXPORT_SYMBOL_GPL(regulator_set_load);
3102 3102
3103/** 3103/**
3104 * regulator_allow_bypass - allow the regulator to go into bypass mode 3104 * regulator_allow_bypass - allow the regulator to go into bypass mode
diff --git a/drivers/regulator/devres.c b/drivers/regulator/devres.c
index 8f785bc9e510..6ec1d400adae 100644
--- a/drivers/regulator/devres.c
+++ b/drivers/regulator/devres.c
@@ -413,3 +413,88 @@ void devm_regulator_bulk_unregister_supply_alias(struct device *dev,
413 devm_regulator_unregister_supply_alias(dev, id[i]); 413 devm_regulator_unregister_supply_alias(dev, id[i]);
414} 414}
415EXPORT_SYMBOL_GPL(devm_regulator_bulk_unregister_supply_alias); 415EXPORT_SYMBOL_GPL(devm_regulator_bulk_unregister_supply_alias);
416
417struct regulator_notifier_match {
418 struct regulator *regulator;
419 struct notifier_block *nb;
420};
421
422static int devm_regulator_match_notifier(struct device *dev, void *res,
423 void *data)
424{
425 struct regulator_notifier_match *match = res;
426 struct regulator_notifier_match *target = data;
427
428 return match->regulator == target->regulator && match->nb == target->nb;
429}
430
431static void devm_regulator_destroy_notifier(struct device *dev, void *res)
432{
433 struct regulator_notifier_match *match = res;
434
435 regulator_unregister_notifier(match->regulator, match->nb);
436}
437
438/**
439 * devm_regulator_register_notifier - Resource managed
440 * regulator_register_notifier
441 *
442 * @regulator: regulator source
443 * @nb: notifier block
444 *
445 * The notifier will be registers under the consumer device and be
446 * automatically be unregistered when the source device is unbound.
447 */
448int devm_regulator_register_notifier(struct regulator *regulator,
449 struct notifier_block *nb)
450{
451 struct regulator_notifier_match *match;
452 int ret;
453
454 match = devres_alloc(devm_regulator_destroy_notifier,
455 sizeof(struct regulator_notifier_match),
456 GFP_KERNEL);
457 if (!match)
458 return -ENOMEM;
459
460 match->regulator = regulator;
461 match->nb = nb;
462
463 ret = regulator_register_notifier(regulator, nb);
464 if (ret < 0) {
465 devres_free(match);
466 return ret;
467 }
468
469 devres_add(regulator->dev, match);
470
471 return 0;
472}
473EXPORT_SYMBOL_GPL(devm_regulator_register_notifier);
474
475/**
476 * devm_regulator_unregister_notifier - Resource managed
477 * regulator_unregister_notifier()
478 *
479 * @regulator: regulator source
480 * @nb: notifier block
481 *
482 * Unregister a notifier registered with devm_regulator_register_notifier().
483 * Normally this function will not need to be called and the resource
484 * management code will ensure that the resource is freed.
485 */
486void devm_regulator_unregister_notifier(struct regulator *regulator,
487 struct notifier_block *nb)
488{
489 struct regulator_notifier_match match;
490 int rc;
491
492 match.regulator = regulator;
493 match.nb = nb;
494
495 rc = devres_release(regulator->dev, devm_regulator_destroy_notifier,
496 devm_regulator_match_notifier, &match);
497 if (rc != 0)
498 WARN_ON(rc);
499}
500EXPORT_SYMBOL_GPL(devm_regulator_unregister_notifier);
diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c
index 18198316b6cf..8217613807d3 100644
--- a/drivers/regulator/palmas-regulator.c
+++ b/drivers/regulator/palmas-regulator.c
@@ -916,6 +916,9 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic,
916 (id == PALMAS_REG_LDO6)) 916 (id == PALMAS_REG_LDO6))
917 desc->enable_time = 2000; 917 desc->enable_time = 2000;
918 } else { 918 } else {
919 if (!ddata->has_regen3 && id == PALMAS_REG_REGEN3)
920 continue;
921
919 desc->n_voltages = 1; 922 desc->n_voltages = 1;
920 if (reg_init && reg_init->roof_floor) 923 if (reg_init && reg_init->roof_floor)
921 desc->ops = &palmas_ops_ext_control_extreg; 924 desc->ops = &palmas_ops_ext_control_extreg;
@@ -1398,6 +1401,7 @@ static struct palmas_pmic_driver_data palmas_ddata = {
1398 .ldo_begin = PALMAS_REG_LDO1, 1401 .ldo_begin = PALMAS_REG_LDO1,
1399 .ldo_end = PALMAS_REG_LDOUSB, 1402 .ldo_end = PALMAS_REG_LDOUSB,
1400 .max_reg = PALMAS_NUM_REGS, 1403 .max_reg = PALMAS_NUM_REGS,
1404 .has_regen3 = true,
1401 .palmas_regs_info = palmas_generic_regs_info, 1405 .palmas_regs_info = palmas_generic_regs_info,
1402 .palmas_matches = palmas_matches, 1406 .palmas_matches = palmas_matches,
1403 .sleep_req_info = palma_sleep_req_info, 1407 .sleep_req_info = palma_sleep_req_info,
@@ -1411,6 +1415,7 @@ static struct palmas_pmic_driver_data tps65917_ddata = {
1411 .ldo_begin = TPS65917_REG_LDO1, 1415 .ldo_begin = TPS65917_REG_LDO1,
1412 .ldo_end = TPS65917_REG_LDO5, 1416 .ldo_end = TPS65917_REG_LDO5,
1413 .max_reg = TPS65917_NUM_REGS, 1417 .max_reg = TPS65917_NUM_REGS,
1418 .has_regen3 = true,
1414 .palmas_regs_info = tps65917_regs_info, 1419 .palmas_regs_info = tps65917_regs_info,
1415 .palmas_matches = tps65917_matches, 1420 .palmas_matches = tps65917_matches,
1416 .sleep_req_info = tps65917_sleep_req_info, 1421 .sleep_req_info = tps65917_sleep_req_info,
@@ -1505,7 +1510,7 @@ static void palmas_dt_to_pdata(struct device *dev,
1505 pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator"); 1510 pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator");
1506} 1511}
1507 1512
1508static struct of_device_id of_palmas_match_tbl[] = { 1513static const struct of_device_id of_palmas_match_tbl[] = {
1509 { 1514 {
1510 .compatible = "ti,palmas-pmic", 1515 .compatible = "ti,palmas-pmic",
1511 .data = &palmas_ddata, 1516 .data = &palmas_ddata,
@@ -1572,9 +1577,11 @@ static int palmas_regulators_probe(struct platform_device *pdev)
1572 if (!pmic) 1577 if (!pmic)
1573 return -ENOMEM; 1578 return -ENOMEM;
1574 1579
1575 if (of_device_is_compatible(node, "ti,tps659038-pmic")) 1580 if (of_device_is_compatible(node, "ti,tps659038-pmic")) {
1576 palmas_generic_regs_info[PALMAS_REG_REGEN2].ctrl_addr = 1581 palmas_generic_regs_info[PALMAS_REG_REGEN2].ctrl_addr =
1577 TPS659038_REGEN2_CTRL; 1582 TPS659038_REGEN2_CTRL;
1583 palmas_ddata.has_regen3 = false;
1584 }
1578 1585
1579 pmic->dev = &pdev->dev; 1586 pmic->dev = &pdev->dev;
1580 pmic->palmas = palmas; 1587 pmic->palmas = palmas;
diff --git a/drivers/regulator/qcom_rpm-regulator.c b/drivers/regulator/qcom_rpm-regulator.c
index 15e07c233c1e..e254272585b2 100644
--- a/drivers/regulator/qcom_rpm-regulator.c
+++ b/drivers/regulator/qcom_rpm-regulator.c
@@ -607,31 +607,6 @@ static const struct qcom_rpm_reg smb208_smps = {
607 .supports_force_mode_bypass = false, 607 .supports_force_mode_bypass = false,
608}; 608};
609 609
610static const struct of_device_id rpm_of_match[] = {
611 { .compatible = "qcom,rpm-pm8058-pldo", .data = &pm8058_pldo },
612 { .compatible = "qcom,rpm-pm8058-nldo", .data = &pm8058_nldo },
613 { .compatible = "qcom,rpm-pm8058-smps", .data = &pm8058_smps },
614 { .compatible = "qcom,rpm-pm8058-ncp", .data = &pm8058_ncp },
615 { .compatible = "qcom,rpm-pm8058-switch", .data = &pm8058_switch },
616
617 { .compatible = "qcom,rpm-pm8901-pldo", .data = &pm8901_pldo },
618 { .compatible = "qcom,rpm-pm8901-nldo", .data = &pm8901_nldo },
619 { .compatible = "qcom,rpm-pm8901-ftsmps", .data = &pm8901_ftsmps },
620 { .compatible = "qcom,rpm-pm8901-switch", .data = &pm8901_switch },
621
622 { .compatible = "qcom,rpm-pm8921-pldo", .data = &pm8921_pldo },
623 { .compatible = "qcom,rpm-pm8921-nldo", .data = &pm8921_nldo },
624 { .compatible = "qcom,rpm-pm8921-nldo1200", .data = &pm8921_nldo1200 },
625 { .compatible = "qcom,rpm-pm8921-smps", .data = &pm8921_smps },
626 { .compatible = "qcom,rpm-pm8921-ftsmps", .data = &pm8921_ftsmps },
627 { .compatible = "qcom,rpm-pm8921-ncp", .data = &pm8921_ncp },
628 { .compatible = "qcom,rpm-pm8921-switch", .data = &pm8921_switch },
629
630 { .compatible = "qcom,rpm-smb208", .data = &smb208_smps },
631 { }
632};
633MODULE_DEVICE_TABLE(of, rpm_of_match);
634
635static int rpm_reg_set(struct qcom_rpm_reg *vreg, 610static int rpm_reg_set(struct qcom_rpm_reg *vreg,
636 const struct request_member *req, 611 const struct request_member *req,
637 const int value) 612 const int value)
@@ -645,7 +620,9 @@ static int rpm_reg_set(struct qcom_rpm_reg *vreg,
645 return 0; 620 return 0;
646} 621}
647 622
648static int rpm_reg_of_parse_freq(struct device *dev, struct qcom_rpm_reg *vreg) 623static int rpm_reg_of_parse_freq(struct device *dev,
624 struct device_node *node,
625 struct qcom_rpm_reg *vreg)
649{ 626{
650 static const int freq_table[] = { 627 static const int freq_table[] = {
651 19200000, 9600000, 6400000, 4800000, 3840000, 3200000, 2740000, 628 19200000, 9600000, 6400000, 4800000, 3840000, 3200000, 2740000,
@@ -659,7 +636,7 @@ static int rpm_reg_of_parse_freq(struct device *dev, struct qcom_rpm_reg *vreg)
659 int i; 636 int i;
660 637
661 key = "qcom,switch-mode-frequency"; 638 key = "qcom,switch-mode-frequency";
662 ret = of_property_read_u32(dev->of_node, key, &freq); 639 ret = of_property_read_u32(node, key, &freq);
663 if (ret) { 640 if (ret) {
664 dev_err(dev, "regulator requires %s property\n", key); 641 dev_err(dev, "regulator requires %s property\n", key);
665 return -EINVAL; 642 return -EINVAL;
@@ -676,88 +653,40 @@ static int rpm_reg_of_parse_freq(struct device *dev, struct qcom_rpm_reg *vreg)
676 return -EINVAL; 653 return -EINVAL;
677} 654}
678 655
679static int rpm_reg_probe(struct platform_device *pdev) 656static int rpm_reg_of_parse(struct device_node *node,
657 const struct regulator_desc *desc,
658 struct regulator_config *config)
680{ 659{
681 struct regulator_init_data *initdata; 660 struct qcom_rpm_reg *vreg = config->driver_data;
682 const struct qcom_rpm_reg *template; 661 struct device *dev = config->dev;
683 const struct of_device_id *match;
684 struct regulator_config config = { };
685 struct regulator_dev *rdev;
686 struct qcom_rpm_reg *vreg;
687 const char *key; 662 const char *key;
688 u32 force_mode; 663 u32 force_mode;
689 bool pwm; 664 bool pwm;
690 u32 val; 665 u32 val;
691 int ret; 666 int ret;
692 667
693 match = of_match_device(rpm_of_match, &pdev->dev);
694 template = match->data;
695
696 vreg = devm_kmalloc(&pdev->dev, sizeof(*vreg), GFP_KERNEL);
697 if (!vreg) {
698 dev_err(&pdev->dev, "failed to allocate vreg\n");
699 return -ENOMEM;
700 }
701 memcpy(vreg, template, sizeof(*vreg));
702 mutex_init(&vreg->lock);
703 vreg->dev = &pdev->dev;
704 vreg->desc.id = -1;
705 vreg->desc.owner = THIS_MODULE;
706 vreg->desc.type = REGULATOR_VOLTAGE;
707 vreg->desc.name = pdev->dev.of_node->name;
708 vreg->desc.supply_name = "vin";
709
710 vreg->rpm = dev_get_drvdata(pdev->dev.parent);
711 if (!vreg->rpm) {
712 dev_err(&pdev->dev, "unable to retrieve handle to rpm\n");
713 return -ENODEV;
714 }
715
716 initdata = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node,
717 &vreg->desc);
718 if (!initdata)
719 return -EINVAL;
720
721 key = "reg";
722 ret = of_property_read_u32(pdev->dev.of_node, key, &val);
723 if (ret) {
724 dev_err(&pdev->dev, "failed to read %s\n", key);
725 return ret;
726 }
727 vreg->resource = val;
728
729 if ((vreg->parts->uV.mask || vreg->parts->mV.mask) &&
730 (!initdata->constraints.min_uV || !initdata->constraints.max_uV)) {
731 dev_err(&pdev->dev, "no voltage specified for regulator\n");
732 return -EINVAL;
733 }
734
735 /* Regulators with ia property suppports drms */
736 if (vreg->parts->ia.mask)
737 initdata->constraints.valid_ops_mask |= REGULATOR_CHANGE_DRMS;
738
739 key = "bias-pull-down"; 668 key = "bias-pull-down";
740 if (of_property_read_bool(pdev->dev.of_node, key)) { 669 if (of_property_read_bool(node, key)) {
741 ret = rpm_reg_set(vreg, &vreg->parts->pd, 1); 670 ret = rpm_reg_set(vreg, &vreg->parts->pd, 1);
742 if (ret) { 671 if (ret) {
743 dev_err(&pdev->dev, "%s is invalid", key); 672 dev_err(dev, "%s is invalid", key);
744 return ret; 673 return ret;
745 } 674 }
746 } 675 }
747 676
748 if (vreg->parts->freq.mask) { 677 if (vreg->parts->freq.mask) {
749 ret = rpm_reg_of_parse_freq(&pdev->dev, vreg); 678 ret = rpm_reg_of_parse_freq(dev, node, vreg);
750 if (ret < 0) 679 if (ret < 0)
751 return ret; 680 return ret;
752 } 681 }
753 682
754 if (vreg->parts->pm.mask) { 683 if (vreg->parts->pm.mask) {
755 key = "qcom,power-mode-hysteretic"; 684 key = "qcom,power-mode-hysteretic";
756 pwm = !of_property_read_bool(pdev->dev.of_node, key); 685 pwm = !of_property_read_bool(node, key);
757 686
758 ret = rpm_reg_set(vreg, &vreg->parts->pm, pwm); 687 ret = rpm_reg_set(vreg, &vreg->parts->pm, pwm);
759 if (ret) { 688 if (ret) {
760 dev_err(&pdev->dev, "failed to set power mode\n"); 689 dev_err(dev, "failed to set power mode\n");
761 return ret; 690 return ret;
762 } 691 }
763 } 692 }
@@ -766,11 +695,11 @@ static int rpm_reg_probe(struct platform_device *pdev)
766 force_mode = -1; 695 force_mode = -1;
767 696
768 key = "qcom,force-mode"; 697 key = "qcom,force-mode";
769 ret = of_property_read_u32(pdev->dev.of_node, key, &val); 698 ret = of_property_read_u32(node, key, &val);
770 if (ret == -EINVAL) { 699 if (ret == -EINVAL) {
771 val = QCOM_RPM_FORCE_MODE_NONE; 700 val = QCOM_RPM_FORCE_MODE_NONE;
772 } else if (ret < 0) { 701 } else if (ret < 0) {
773 dev_err(&pdev->dev, "failed to read %s\n", key); 702 dev_err(dev, "failed to read %s\n", key);
774 return ret; 703 return ret;
775 } 704 }
776 705
@@ -805,25 +734,192 @@ static int rpm_reg_probe(struct platform_device *pdev)
805 } 734 }
806 735
807 if (force_mode == -1) { 736 if (force_mode == -1) {
808 dev_err(&pdev->dev, "invalid force mode\n"); 737 dev_err(dev, "invalid force mode\n");
809 return -EINVAL; 738 return -EINVAL;
810 } 739 }
811 740
812 ret = rpm_reg_set(vreg, &vreg->parts->fm, force_mode); 741 ret = rpm_reg_set(vreg, &vreg->parts->fm, force_mode);
813 if (ret) { 742 if (ret) {
814 dev_err(&pdev->dev, "failed to set force mode\n"); 743 dev_err(dev, "failed to set force mode\n");
815 return ret; 744 return ret;
816 } 745 }
817 } 746 }
818 747
819 config.dev = &pdev->dev; 748 return 0;
820 config.init_data = initdata; 749}
821 config.driver_data = vreg; 750
822 config.of_node = pdev->dev.of_node; 751struct rpm_regulator_data {
823 rdev = devm_regulator_register(&pdev->dev, &vreg->desc, &config); 752 const char *name;
824 if (IS_ERR(rdev)) { 753 int resource;
825 dev_err(&pdev->dev, "can't register regulator\n"); 754 const struct qcom_rpm_reg *template;
826 return PTR_ERR(rdev); 755 const char *supply;
756};
757
758static const struct rpm_regulator_data rpm_pm8058_regulators[] = {
759 { "l0", QCOM_RPM_PM8058_LDO0, &pm8058_nldo, "vdd_l0_l1_lvs" },
760 { "l1", QCOM_RPM_PM8058_LDO1, &pm8058_nldo, "vdd_l0_l1_lvs" },
761 { "l2", QCOM_RPM_PM8058_LDO2, &pm8058_pldo, "vdd_l2_l11_l12" },
762 { "l3", QCOM_RPM_PM8058_LDO3, &pm8058_pldo, "vdd_l3_l4_l5" },
763 { "l4", QCOM_RPM_PM8058_LDO4, &pm8058_pldo, "vdd_l3_l4_l5" },
764 { "l5", QCOM_RPM_PM8058_LDO5, &pm8058_pldo, "vdd_l3_l4_l5" },
765 { "l6", QCOM_RPM_PM8058_LDO6, &pm8058_pldo, "vdd_l6_l7" },
766 { "l7", QCOM_RPM_PM8058_LDO7, &pm8058_pldo, "vdd_l6_l7" },
767 { "l8", QCOM_RPM_PM8058_LDO8, &pm8058_pldo, "vdd_l8" },
768 { "l9", QCOM_RPM_PM8058_LDO9, &pm8058_pldo, "vdd_l9" },
769 { "l10", QCOM_RPM_PM8058_LDO10, &pm8058_pldo, "vdd_l10" },
770 { "l11", QCOM_RPM_PM8058_LDO11, &pm8058_pldo, "vdd_l2_l11_l12" },
771 { "l12", QCOM_RPM_PM8058_LDO12, &pm8058_pldo, "vdd_l2_l11_l12" },
772 { "l13", QCOM_RPM_PM8058_LDO13, &pm8058_pldo, "vdd_l13_l16" },
773 { "l14", QCOM_RPM_PM8058_LDO14, &pm8058_pldo, "vdd_l14_l15" },
774 { "l15", QCOM_RPM_PM8058_LDO15, &pm8058_pldo, "vdd_l14_l15" },
775 { "l16", QCOM_RPM_PM8058_LDO16, &pm8058_pldo, "vdd_l13_l16" },
776 { "l17", QCOM_RPM_PM8058_LDO17, &pm8058_pldo, "vdd_l17_l18" },
777 { "l18", QCOM_RPM_PM8058_LDO18, &pm8058_pldo, "vdd_l17_l18" },
778 { "l19", QCOM_RPM_PM8058_LDO19, &pm8058_pldo, "vdd_l19_l20" },
779 { "l20", QCOM_RPM_PM8058_LDO20, &pm8058_pldo, "vdd_l19_l20" },
780 { "l21", QCOM_RPM_PM8058_LDO21, &pm8058_nldo, "vdd_l21" },
781 { "l22", QCOM_RPM_PM8058_LDO22, &pm8058_nldo, "vdd_l22" },
782 { "l23", QCOM_RPM_PM8058_LDO23, &pm8058_nldo, "vdd_l23_l24_l25" },
783 { "l24", QCOM_RPM_PM8058_LDO24, &pm8058_nldo, "vdd_l23_l24_l25" },
784 { "l25", QCOM_RPM_PM8058_LDO25, &pm8058_nldo, "vdd_l23_l24_l25" },
785
786 { "s0", QCOM_RPM_PM8058_SMPS0, &pm8058_smps, "vdd_s0" },
787 { "s1", QCOM_RPM_PM8058_SMPS1, &pm8058_smps, "vdd_s1" },
788 { "s2", QCOM_RPM_PM8058_SMPS2, &pm8058_smps, "vdd_s2" },
789 { "s3", QCOM_RPM_PM8058_SMPS3, &pm8058_smps, "vdd_s3" },
790 { "s4", QCOM_RPM_PM8058_SMPS4, &pm8058_smps, "vdd_s4" },
791
792 { "lvs0", QCOM_RPM_PM8058_LVS0, &pm8058_switch, "vdd_l0_l1_lvs" },
793 { "lvs1", QCOM_RPM_PM8058_LVS1, &pm8058_switch, "vdd_l0_l1_lvs" },
794
795 { "ncp", QCOM_RPM_PM8058_NCP, &pm8058_ncp, "vdd_ncp" },
796 { }
797};
798
799static const struct rpm_regulator_data rpm_pm8901_regulators[] = {
800 { "l0", QCOM_RPM_PM8901_LDO0, &pm8901_nldo, "vdd_l0" },
801 { "l1", QCOM_RPM_PM8901_LDO1, &pm8901_pldo, "vdd_l1" },
802 { "l2", QCOM_RPM_PM8901_LDO2, &pm8901_pldo, "vdd_l2" },
803 { "l3", QCOM_RPM_PM8901_LDO3, &pm8901_pldo, "vdd_l3" },
804 { "l4", QCOM_RPM_PM8901_LDO4, &pm8901_pldo, "vdd_l4" },
805 { "l5", QCOM_RPM_PM8901_LDO5, &pm8901_pldo, "vdd_l5" },
806 { "l6", QCOM_RPM_PM8901_LDO6, &pm8901_pldo, "vdd_l6" },
807
808 { "s0", QCOM_RPM_PM8901_SMPS0, &pm8901_ftsmps, "vdd_s0" },
809 { "s1", QCOM_RPM_PM8901_SMPS1, &pm8901_ftsmps, "vdd_s1" },
810 { "s2", QCOM_RPM_PM8901_SMPS2, &pm8901_ftsmps, "vdd_s2" },
811 { "s3", QCOM_RPM_PM8901_SMPS3, &pm8901_ftsmps, "vdd_s3" },
812 { "s4", QCOM_RPM_PM8901_SMPS4, &pm8901_ftsmps, "vdd_s4" },
813
814 { "lvs0", QCOM_RPM_PM8901_LVS0, &pm8901_switch, "lvs0_in" },
815 { "lvs1", QCOM_RPM_PM8901_LVS1, &pm8901_switch, "lvs1_in" },
816 { "lvs2", QCOM_RPM_PM8901_LVS2, &pm8901_switch, "lvs2_in" },
817 { "lvs3", QCOM_RPM_PM8901_LVS3, &pm8901_switch, "lvs3_in" },
818
819 { "mvs", QCOM_RPM_PM8901_MVS, &pm8901_switch, "mvs_in" },
820 { }
821};
822
823static const struct rpm_regulator_data rpm_pm8921_regulators[] = {
824 { "s1", QCOM_RPM_PM8921_SMPS1, &pm8921_smps, "vdd_s1" },
825 { "s2", QCOM_RPM_PM8921_SMPS2, &pm8921_smps, "vdd_s2" },
826 { "s3", QCOM_RPM_PM8921_SMPS3, &pm8921_smps },
827 { "s4", QCOM_RPM_PM8921_SMPS4, &pm8921_smps, "vdd_s4" },
828 { "s7", QCOM_RPM_PM8921_SMPS7, &pm8921_smps, "vdd_s7" },
829 { "s8", QCOM_RPM_PM8921_SMPS8, &pm8921_smps, "vdd_s8" },
830
831 { "l1", QCOM_RPM_PM8921_LDO1, &pm8921_nldo, "vdd_l1_l2_l12_l18" },
832 { "l2", QCOM_RPM_PM8921_LDO2, &pm8921_nldo, "vdd_l1_l2_l12_l18" },
833 { "l3", QCOM_RPM_PM8921_LDO3, &pm8921_pldo, "vdd_l3_l15_l17" },
834 { "l4", QCOM_RPM_PM8921_LDO4, &pm8921_pldo, "vdd_l4_l14" },
835 { "l5", QCOM_RPM_PM8921_LDO5, &pm8921_pldo, "vdd_l5_l8_l16" },
836 { "l6", QCOM_RPM_PM8921_LDO6, &pm8921_pldo, "vdd_l6_l7" },
837 { "l7", QCOM_RPM_PM8921_LDO7, &pm8921_pldo, "vdd_l6_l7" },
838 { "l8", QCOM_RPM_PM8921_LDO8, &pm8921_pldo, "vdd_l5_l8_l16" },
839 { "l9", QCOM_RPM_PM8921_LDO9, &pm8921_pldo, "vdd_l9_l11" },
840 { "l10", QCOM_RPM_PM8921_LDO10, &pm8921_pldo, "vdd_l10_l22" },
841 { "l11", QCOM_RPM_PM8921_LDO11, &pm8921_pldo, "vdd_l9_l11" },
842 { "l12", QCOM_RPM_PM8921_LDO12, &pm8921_nldo, "vdd_l1_l2_l12_l18" },
843 { "l14", QCOM_RPM_PM8921_LDO14, &pm8921_pldo, "vdd_l4_l14" },
844 { "l15", QCOM_RPM_PM8921_LDO15, &pm8921_pldo, "vdd_l3_l15_l17" },
845 { "l16", QCOM_RPM_PM8921_LDO16, &pm8921_pldo, "vdd_l5_l8_l16" },
846 { "l17", QCOM_RPM_PM8921_LDO17, &pm8921_pldo, "vdd_l3_l15_l17" },
847 { "l18", QCOM_RPM_PM8921_LDO18, &pm8921_nldo, "vdd_l1_l2_l12_l18" },
848 { "l21", QCOM_RPM_PM8921_LDO21, &pm8921_pldo, "vdd_l21_l23_l29" },
849 { "l22", QCOM_RPM_PM8921_LDO22, &pm8921_pldo, "vdd_l10_l22" },
850 { "l23", QCOM_RPM_PM8921_LDO23, &pm8921_pldo, "vdd_l21_l23_l29" },
851 { "l24", QCOM_RPM_PM8921_LDO24, &pm8921_nldo1200, "vdd_l24" },
852 { "l25", QCOM_RPM_PM8921_LDO25, &pm8921_nldo1200, "vdd_l25" },
853 { "l26", QCOM_RPM_PM8921_LDO26, &pm8921_nldo1200, "vdd_l26" },
854 { "l27", QCOM_RPM_PM8921_LDO27, &pm8921_nldo1200, "vdd_l27" },
855 { "l28", QCOM_RPM_PM8921_LDO28, &pm8921_nldo1200, "vdd_l28" },
856 { "l29", QCOM_RPM_PM8921_LDO29, &pm8921_pldo, "vdd_l21_l23_l29" },
857
858 { "lvs1", QCOM_RPM_PM8921_LVS1, &pm8921_switch, "vin_lvs1_3_6" },
859 { "lvs2", QCOM_RPM_PM8921_LVS2, &pm8921_switch, "vin_lvs2" },
860 { "lvs3", QCOM_RPM_PM8921_LVS3, &pm8921_switch, "vin_lvs1_3_6" },
861 { "lvs4", QCOM_RPM_PM8921_LVS4, &pm8921_switch, "vin_lvs4_5_7" },
862 { "lvs5", QCOM_RPM_PM8921_LVS5, &pm8921_switch, "vin_lvs4_5_7" },
863 { "lvs6", QCOM_RPM_PM8921_LVS6, &pm8921_switch, "vin_lvs1_3_6" },
864 { "lvs7", QCOM_RPM_PM8921_LVS7, &pm8921_switch, "vin_lvs4_5_7" },
865
866 { "usb-switch", QCOM_RPM_USB_OTG_SWITCH, &pm8921_switch, "vin_5vs" },
867 { "hdmi-switch", QCOM_RPM_HDMI_SWITCH, &pm8921_switch, "vin_5vs" },
868 { "ncp", QCOM_RPM_PM8921_NCP, &pm8921_ncp, "vdd_ncp" },
869 { }
870};
871
872static const struct of_device_id rpm_of_match[] = {
873 { .compatible = "qcom,rpm-pm8058-regulators", .data = &rpm_pm8058_regulators },
874 { .compatible = "qcom,rpm-pm8901-regulators", .data = &rpm_pm8901_regulators },
875 { .compatible = "qcom,rpm-pm8921-regulators", .data = &rpm_pm8921_regulators },
876 { }
877};
878MODULE_DEVICE_TABLE(of, rpm_of_match);
879
880static int rpm_reg_probe(struct platform_device *pdev)
881{
882 const struct rpm_regulator_data *reg;
883 const struct of_device_id *match;
884 struct regulator_config config = { };
885 struct regulator_dev *rdev;
886 struct qcom_rpm_reg *vreg;
887 struct qcom_rpm *rpm;
888
889 rpm = dev_get_drvdata(pdev->dev.parent);
890 if (!rpm) {
891 dev_err(&pdev->dev, "unable to retrieve handle to rpm\n");
892 return -ENODEV;
893 }
894
895 match = of_match_device(rpm_of_match, &pdev->dev);
896 for (reg = match->data; reg->name; reg++) {
897 vreg = devm_kmalloc(&pdev->dev, sizeof(*vreg), GFP_KERNEL);
898 if (!vreg)
899 return -ENOMEM;
900
901 memcpy(vreg, reg->template, sizeof(*vreg));
902 mutex_init(&vreg->lock);
903
904 vreg->dev = &pdev->dev;
905 vreg->resource = reg->resource;
906 vreg->rpm = rpm;
907
908 vreg->desc.id = -1;
909 vreg->desc.owner = THIS_MODULE;
910 vreg->desc.type = REGULATOR_VOLTAGE;
911 vreg->desc.name = reg->name;
912 vreg->desc.supply_name = reg->supply;
913 vreg->desc.of_match = reg->name;
914 vreg->desc.of_parse_cb = rpm_reg_of_parse;
915
916 config.dev = &pdev->dev;
917 config.driver_data = vreg;
918 rdev = devm_regulator_register(&pdev->dev, &vreg->desc, &config);
919 if (IS_ERR(rdev)) {
920 dev_err(&pdev->dev, "failed to register %s\n", reg->name);
921 return PTR_ERR(rdev);
922 }
827 } 923 }
828 924
829 return 0; 925 return 0;
diff --git a/drivers/regulator/stw481x-vmmc.c b/drivers/regulator/stw481x-vmmc.c
index 89025f560259..7d2ae3e9e942 100644
--- a/drivers/regulator/stw481x-vmmc.c
+++ b/drivers/regulator/stw481x-vmmc.c
@@ -56,6 +56,7 @@ static int stw481x_vmmc_regulator_probe(struct platform_device *pdev)
56{ 56{
57 struct stw481x *stw481x = dev_get_platdata(&pdev->dev); 57 struct stw481x *stw481x = dev_get_platdata(&pdev->dev);
58 struct regulator_config config = { }; 58 struct regulator_config config = { };
59 struct regulator_dev *rdev;
59 int ret; 60 int ret;
60 61
61 /* First disable the external VMMC if it's active */ 62 /* First disable the external VMMC if it's active */
@@ -75,12 +76,11 @@ static int stw481x_vmmc_regulator_probe(struct platform_device *pdev)
75 pdev->dev.of_node, 76 pdev->dev.of_node,
76 &vmmc_regulator); 77 &vmmc_regulator);
77 78
78 stw481x->vmmc_regulator = devm_regulator_register(&pdev->dev, 79 rdev = devm_regulator_register(&pdev->dev, &vmmc_regulator, &config);
79 &vmmc_regulator, &config); 80 if (IS_ERR(rdev)) {
80 if (IS_ERR(stw481x->vmmc_regulator)) {
81 dev_err(&pdev->dev, 81 dev_err(&pdev->dev,
82 "error initializing STw481x VMMC regulator\n"); 82 "error initializing STw481x VMMC regulator\n");
83 return PTR_ERR(stw481x->vmmc_regulator); 83 return PTR_ERR(rdev);
84 } 84 }
85 85
86 dev_info(&pdev->dev, "initialized STw481x VMMC regulator\n"); 86 dev_info(&pdev->dev, "initialized STw481x VMMC regulator\n");
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 5d60a868830d..2aa85e398f76 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -4225,22 +4225,15 @@ static struct scsi_host_template ufshcd_driver_template = {
4225static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg, 4225static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg,
4226 int ua) 4226 int ua)
4227{ 4227{
4228 int ret = 0; 4228 int ret;
4229 struct regulator *reg = vreg->reg;
4230 const char *name = vreg->name;
4231 4229
4232 BUG_ON(!vreg); 4230 if (!vreg)
4231 return 0;
4233 4232
4234 ret = regulator_set_optimum_mode(reg, ua); 4233 ret = regulator_set_load(vreg->reg, ua);
4235 if (ret >= 0) { 4234 if (ret < 0) {
4236 /* 4235 dev_err(dev, "%s: %s set load (ua=%d) failed, err=%d\n",
4237 * regulator_set_optimum_mode() returns new regulator 4236 __func__, vreg->name, ua, ret);
4238 * mode upon success.
4239 */
4240 ret = 0;
4241 } else {
4242 dev_err(dev, "%s: %s set optimum mode(ua=%d) failed, err=%d\n",
4243 __func__, name, ua, ret);
4244 } 4237 }
4245 4238
4246 return ret; 4239 return ret;
@@ -4249,18 +4242,12 @@ static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg,
4249static inline int ufshcd_config_vreg_lpm(struct ufs_hba *hba, 4242static inline int ufshcd_config_vreg_lpm(struct ufs_hba *hba,
4250 struct ufs_vreg *vreg) 4243 struct ufs_vreg *vreg)
4251{ 4244{
4252 if (!vreg)
4253 return 0;
4254
4255 return ufshcd_config_vreg_load(hba->dev, vreg, UFS_VREG_LPM_LOAD_UA); 4245 return ufshcd_config_vreg_load(hba->dev, vreg, UFS_VREG_LPM_LOAD_UA);
4256} 4246}
4257 4247
4258static inline int ufshcd_config_vreg_hpm(struct ufs_hba *hba, 4248static inline int ufshcd_config_vreg_hpm(struct ufs_hba *hba,
4259 struct ufs_vreg *vreg) 4249 struct ufs_vreg *vreg)
4260{ 4250{
4261 if (!vreg)
4262 return 0;
4263
4264 return ufshcd_config_vreg_load(hba->dev, vreg, vreg->max_uA); 4251 return ufshcd_config_vreg_load(hba->dev, vreg, vreg->max_uA);
4265} 4252}
4266 4253
diff --git a/drivers/usb/phy/phy-ab8500-usb.c b/drivers/usb/phy/phy-ab8500-usb.c
index 0b1bd2369293..f5b3b928941b 100644
--- a/drivers/usb/phy/phy-ab8500-usb.c
+++ b/drivers/usb/phy/phy-ab8500-usb.c
@@ -277,7 +277,7 @@ static void ab8500_usb_regulator_enable(struct ab8500_usb *ab)
277 dev_err(ab->dev, "Failed to set the Vintcore to 1.3V, ret=%d\n", 277 dev_err(ab->dev, "Failed to set the Vintcore to 1.3V, ret=%d\n",
278 ret); 278 ret);
279 279
280 ret = regulator_set_optimum_mode(ab->v_ulpi, 28000); 280 ret = regulator_set_load(ab->v_ulpi, 28000);
281 if (ret < 0) 281 if (ret < 0)
282 dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n", 282 dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n",
283 ret); 283 ret);
@@ -317,7 +317,7 @@ static void ab8500_usb_regulator_disable(struct ab8500_usb *ab)
317 ab->saved_v_ulpi, ret); 317 ab->saved_v_ulpi, ret);
318 } 318 }
319 319
320 ret = regulator_set_optimum_mode(ab->v_ulpi, 0); 320 ret = regulator_set_load(ab->v_ulpi, 0);
321 if (ret < 0) 321 if (ret < 0)
322 dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n", 322 dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n",
323 ret); 323 ret);
diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c
index 000fd892455f..6ed67ea4ef7e 100644
--- a/drivers/usb/phy/phy-msm-usb.c
+++ b/drivers/usb/phy/phy-msm-usb.c
@@ -142,27 +142,22 @@ static int msm_hsusb_ldo_set_mode(struct msm_otg *motg, int on)
142 int ret = 0; 142 int ret = 0;
143 143
144 if (on) { 144 if (on) {
145 ret = regulator_set_optimum_mode(motg->v1p8, 145 ret = regulator_set_load(motg->v1p8, USB_PHY_1P8_HPM_LOAD);
146 USB_PHY_1P8_HPM_LOAD);
147 if (ret < 0) { 146 if (ret < 0) {
148 pr_err("Could not set HPM for v1p8\n"); 147 pr_err("Could not set HPM for v1p8\n");
149 return ret; 148 return ret;
150 } 149 }
151 ret = regulator_set_optimum_mode(motg->v3p3, 150 ret = regulator_set_load(motg->v3p3, USB_PHY_3P3_HPM_LOAD);
152 USB_PHY_3P3_HPM_LOAD);
153 if (ret < 0) { 151 if (ret < 0) {
154 pr_err("Could not set HPM for v3p3\n"); 152 pr_err("Could not set HPM for v3p3\n");
155 regulator_set_optimum_mode(motg->v1p8, 153 regulator_set_load(motg->v1p8, USB_PHY_1P8_LPM_LOAD);
156 USB_PHY_1P8_LPM_LOAD);
157 return ret; 154 return ret;
158 } 155 }
159 } else { 156 } else {
160 ret = regulator_set_optimum_mode(motg->v1p8, 157 ret = regulator_set_load(motg->v1p8, USB_PHY_1P8_LPM_LOAD);
161 USB_PHY_1P8_LPM_LOAD);
162 if (ret < 0) 158 if (ret < 0)
163 pr_err("Could not set LPM for v1p8\n"); 159 pr_err("Could not set LPM for v1p8\n");
164 ret = regulator_set_optimum_mode(motg->v3p3, 160 ret = regulator_set_load(motg->v3p3, USB_PHY_3P3_LPM_LOAD);
165 USB_PHY_3P3_LPM_LOAD);
166 if (ret < 0) 161 if (ret < 0)
167 pr_err("Could not set LPM for v3p3\n"); 162 pr_err("Could not set LPM for v3p3\n");
168 } 163 }
diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h
index ee7b1ce7a6f8..bb270bd03eed 100644
--- a/include/linux/mfd/palmas.h
+++ b/include/linux/mfd/palmas.h
@@ -117,6 +117,7 @@ struct palmas_pmic_driver_data {
117 int ldo_begin; 117 int ldo_begin;
118 int ldo_end; 118 int ldo_end;
119 int max_reg; 119 int max_reg;
120 bool has_regen3;
120 struct palmas_regs_info *palmas_regs_info; 121 struct palmas_regs_info *palmas_regs_info;
121 struct of_regulator_match *palmas_matches; 122 struct of_regulator_match *palmas_matches;
122 struct palmas_sleep_requestor_info *sleep_req_info; 123 struct palmas_sleep_requestor_info *sleep_req_info;
diff --git a/include/linux/mfd/stw481x.h b/include/linux/mfd/stw481x.h
index eda121556e5d..833074b766bd 100644
--- a/include/linux/mfd/stw481x.h
+++ b/include/linux/mfd/stw481x.h
@@ -41,15 +41,11 @@
41 41
42/** 42/**
43 * struct stw481x - state holder for the Stw481x drivers 43 * struct stw481x - state holder for the Stw481x drivers
44 * @mutex: mutex to serialize I2C accesses
45 * @i2c_client: corresponding I2C client 44 * @i2c_client: corresponding I2C client
46 * @regulator: regulator device for regulator children
47 * @map: regmap handle to access device registers 45 * @map: regmap handle to access device registers
48 */ 46 */
49struct stw481x { 47struct stw481x {
50 struct mutex lock;
51 struct i2c_client *client; 48 struct i2c_client *client;
52 struct regulator_dev *vmmc_regulator;
53 struct regmap *map; 49 struct regmap *map;
54}; 50};
55 51
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
index aeacd624a794..f8a689ed62a5 100644
--- a/include/linux/regulator/consumer.h
+++ b/include/linux/regulator/consumer.h
@@ -238,7 +238,7 @@ int regulator_get_current_limit(struct regulator *regulator);
238 238
239int regulator_set_mode(struct regulator *regulator, unsigned int mode); 239int regulator_set_mode(struct regulator *regulator, unsigned int mode);
240unsigned int regulator_get_mode(struct regulator *regulator); 240unsigned int regulator_get_mode(struct regulator *regulator);
241int regulator_set_optimum_mode(struct regulator *regulator, int load_uA); 241int regulator_set_load(struct regulator *regulator, int load_uA);
242 242
243int regulator_allow_bypass(struct regulator *regulator, bool allow); 243int regulator_allow_bypass(struct regulator *regulator, bool allow);
244 244
@@ -252,8 +252,12 @@ int regulator_list_hardware_vsel(struct regulator *regulator,
252/* regulator notifier block */ 252/* regulator notifier block */
253int regulator_register_notifier(struct regulator *regulator, 253int regulator_register_notifier(struct regulator *regulator,
254 struct notifier_block *nb); 254 struct notifier_block *nb);
255int devm_regulator_register_notifier(struct regulator *regulator,
256 struct notifier_block *nb);
255int regulator_unregister_notifier(struct regulator *regulator, 257int regulator_unregister_notifier(struct regulator *regulator,
256 struct notifier_block *nb); 258 struct notifier_block *nb);
259void devm_regulator_unregister_notifier(struct regulator *regulator,
260 struct notifier_block *nb);
257 261
258/* driver data - core doesn't touch */ 262/* driver data - core doesn't touch */
259void *regulator_get_drvdata(struct regulator *regulator); 263void *regulator_get_drvdata(struct regulator *regulator);
@@ -479,8 +483,7 @@ static inline unsigned int regulator_get_mode(struct regulator *regulator)
479 return REGULATOR_MODE_NORMAL; 483 return REGULATOR_MODE_NORMAL;
480} 484}
481 485
482static inline int regulator_set_optimum_mode(struct regulator *regulator, 486static inline int regulator_set_load(struct regulator *regulator, int load_uA)
483 int load_uA)
484{ 487{
485 return REGULATOR_MODE_NORMAL; 488 return REGULATOR_MODE_NORMAL;
486} 489}
@@ -515,12 +518,24 @@ static inline int regulator_register_notifier(struct regulator *regulator,
515 return 0; 518 return 0;
516} 519}
517 520
521static inline int devm_regulator_register_notifier(struct regulator *regulator,
522 struct notifier_block *nb)
523{
524 return 0;
525}
526
518static inline int regulator_unregister_notifier(struct regulator *regulator, 527static inline int regulator_unregister_notifier(struct regulator *regulator,
519 struct notifier_block *nb) 528 struct notifier_block *nb)
520{ 529{
521 return 0; 530 return 0;
522} 531}
523 532
533static inline int devm_regulator_unregister_notifier(struct regulator *regulator,
534 struct notifier_block *nb)
535{
536 return 0;
537}
538
524static inline void *regulator_get_drvdata(struct regulator *regulator) 539static inline void *regulator_get_drvdata(struct regulator *regulator)
525{ 540{
526 return NULL; 541 return NULL;