Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge remote-tracking branches 'regulator/topic/mode', 'regulator/topic/notifier', 'regulator/topic/palmas', 'regulator/topic/qcom' and 'regulator/topic/stw481x' into regulator-next

+334 -152
+1 -1
Documentation/power/regulator/consumer.txt
··· 137 137 Consumer drivers can request a change in their supply regulator operating mode 138 138 by calling :- 139 139 140 - int regulator_set_optimum_mode(struct regulator *regulator, int load_uA); 140 + int regulator_set_load(struct regulator *regulator, int load_uA); 141 141 142 142 This will cause the core to recalculate the total load on the regulator (based 143 143 on all its consumers) and change operating mode (if necessary and permitted)
+3 -3
drivers/gpu/drm/msm/edp/edp_ctrl.c
··· 332 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 336 if (ret < 0) { 337 337 pr_err("%s: vdda_vreg set regulator mode failed.\n", __func__); 338 338 goto vdda_set_fail; ··· 356 356 lvl_enable_fail: 357 357 regulator_disable(ctrl->vdda_vreg); 358 358 vdda_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); 360 360 vdda_set_fail: 361 361 return ret; 362 362 } ··· 365 365 { 366 366 regulator_disable(ctrl->lvl_vreg); 367 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 371 371 static int edp_gpio_config(struct edp_ctrl *ctrl)
+2 -2
drivers/phy/phy-qcom-ufs.c
··· 346 346 goto out; 347 347 } 348 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 350 if (ret >= 0) { 351 351 /* 352 - * regulator_set_optimum_mode() returns new regulator 352 + * regulator_set_load() returns new regulator 353 353 * mode upon success. 354 354 */ 355 355 ret = 0;
+4 -4
drivers/regulator/core.c
··· 3061 3061 EXPORT_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 3065 * @regulator: regulator source 3066 3066 * @uA_load: load current 3067 3067 * ··· 3084 3084 * DRMS will sum the total requested load on the regulator and change 3085 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 */ 3089 - int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) 3089 + int regulator_set_load(struct regulator *regulator, int uA_load) 3090 3090 { 3091 3091 struct regulator_dev *rdev = regulator->rdev; 3092 3092 int ret; ··· 3098 3098 3099 3099 return ret; 3100 3100 } 3101 - EXPORT_SYMBOL_GPL(regulator_set_optimum_mode); 3101 + EXPORT_SYMBOL_GPL(regulator_set_load); 3102 3102 3103 3103 /** 3104 3104 * regulator_allow_bypass - allow the regulator to go into bypass mode
+85
drivers/regulator/devres.c
··· 413 413 devm_regulator_unregister_supply_alias(dev, id[i]); 414 414 } 415 415 EXPORT_SYMBOL_GPL(devm_regulator_bulk_unregister_supply_alias); 416 + 417 + struct regulator_notifier_match { 418 + struct regulator *regulator; 419 + struct notifier_block *nb; 420 + }; 421 + 422 + static 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 + 431 + static 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 + */ 448 + int 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 + } 473 + EXPORT_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 + */ 486 + void 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 + } 500 + EXPORT_SYMBOL_GPL(devm_regulator_unregister_notifier);
+9 -2
drivers/regulator/palmas-regulator.c
··· 916 916 (id == PALMAS_REG_LDO6)) 917 917 desc->enable_time = 2000; 918 918 } else { 919 + if (!ddata->has_regen3 && id == PALMAS_REG_REGEN3) 920 + continue; 921 + 919 922 desc->n_voltages = 1; 920 923 if (reg_init && reg_init->roof_floor) 921 924 desc->ops = &palmas_ops_ext_control_extreg; ··· 1401 1398 .ldo_begin = PALMAS_REG_LDO1, 1402 1399 .ldo_end = PALMAS_REG_LDOUSB, 1403 1400 .max_reg = PALMAS_NUM_REGS, 1401 + .has_regen3 = true, 1404 1402 .palmas_regs_info = palmas_generic_regs_info, 1405 1403 .palmas_matches = palmas_matches, 1406 1404 .sleep_req_info = palma_sleep_req_info, ··· 1415 1411 .ldo_begin = TPS65917_REG_LDO1, 1416 1412 .ldo_end = TPS65917_REG_LDO5, 1417 1413 .max_reg = TPS65917_NUM_REGS, 1414 + .has_regen3 = true, 1418 1415 .palmas_regs_info = tps65917_regs_info, 1419 1416 .palmas_matches = tps65917_matches, 1420 1417 .sleep_req_info = tps65917_sleep_req_info, ··· 1510 1505 pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator"); 1511 1506 } 1512 1507 1513 - static struct of_device_id of_palmas_match_tbl[] = { 1508 + static const struct of_device_id of_palmas_match_tbl[] = { 1514 1509 { 1515 1510 .compatible = "ti,palmas-pmic", 1516 1511 .data = &palmas_ddata, ··· 1577 1572 if (!pmic) 1578 1573 return -ENOMEM; 1579 1574 1580 - if (of_device_is_compatible(node, "ti,tps659038-pmic")) 1575 + if (of_device_is_compatible(node, "ti,tps659038-pmic")) { 1581 1576 palmas_generic_regs_info[PALMAS_REG_REGEN2].ctrl_addr = 1582 1577 TPS659038_REGEN2_CTRL; 1578 + palmas_ddata.has_regen3 = false; 1579 + } 1583 1580 1584 1581 pmic->dev = &pdev->dev; 1585 1582 pmic->palmas = palmas;
+193 -97
drivers/regulator/qcom_rpm-regulator.c
··· 607 607 .supports_force_mode_bypass = false, 608 608 }; 609 609 610 - static 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 - }; 633 - MODULE_DEVICE_TABLE(of, rpm_of_match); 634 - 635 610 static int rpm_reg_set(struct qcom_rpm_reg *vreg, 636 611 const struct request_member *req, 637 612 const int value) ··· 620 645 return 0; 621 646 } 622 647 623 - static int rpm_reg_of_parse_freq(struct device *dev, struct qcom_rpm_reg *vreg) 648 + static int rpm_reg_of_parse_freq(struct device *dev, 649 + struct device_node *node, 650 + struct qcom_rpm_reg *vreg) 624 651 { 625 652 static const int freq_table[] = { 626 653 19200000, 9600000, 6400000, 4800000, 3840000, 3200000, 2740000, ··· 636 659 int i; 637 660 638 661 key = "qcom,switch-mode-frequency"; 639 - ret = of_property_read_u32(dev->of_node, key, &freq); 662 + ret = of_property_read_u32(node, key, &freq); 640 663 if (ret) { 641 664 dev_err(dev, "regulator requires %s property\n", key); 642 665 return -EINVAL; ··· 653 676 return -EINVAL; 654 677 } 655 678 656 - static int rpm_reg_probe(struct platform_device *pdev) 679 + static int rpm_reg_of_parse(struct device_node *node, 680 + const struct regulator_desc *desc, 681 + struct regulator_config *config) 657 682 { 658 - struct regulator_init_data *initdata; 659 - const struct qcom_rpm_reg *template; 660 - const struct of_device_id *match; 661 - struct regulator_config config = { }; 662 - struct regulator_dev *rdev; 663 - struct qcom_rpm_reg *vreg; 683 + struct qcom_rpm_reg *vreg = config->driver_data; 684 + struct device *dev = config->dev; 664 685 const char *key; 665 686 u32 force_mode; 666 687 bool pwm; 667 688 u32 val; 668 689 int ret; 669 690 670 - match = of_match_device(rpm_of_match, &pdev->dev); 671 - template = match->data; 672 - 673 - vreg = devm_kmalloc(&pdev->dev, sizeof(*vreg), GFP_KERNEL); 674 - if (!vreg) { 675 - dev_err(&pdev->dev, "failed to allocate vreg\n"); 676 - return -ENOMEM; 677 - } 678 - memcpy(vreg, template, sizeof(*vreg)); 679 - mutex_init(&vreg->lock); 680 - vreg->dev = &pdev->dev; 681 - vreg->desc.id = -1; 682 - vreg->desc.owner = THIS_MODULE; 683 - vreg->desc.type = REGULATOR_VOLTAGE; 684 - vreg->desc.name = pdev->dev.of_node->name; 685 - vreg->desc.supply_name = "vin"; 686 - 687 - vreg->rpm = dev_get_drvdata(pdev->dev.parent); 688 - if (!vreg->rpm) { 689 - dev_err(&pdev->dev, "unable to retrieve handle to rpm\n"); 690 - return -ENODEV; 691 - } 692 - 693 - initdata = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node, 694 - &vreg->desc); 695 - if (!initdata) 696 - return -EINVAL; 697 - 698 - key = "reg"; 699 - ret = of_property_read_u32(pdev->dev.of_node, key, &val); 700 - if (ret) { 701 - dev_err(&pdev->dev, "failed to read %s\n", key); 702 - return ret; 703 - } 704 - vreg->resource = val; 705 - 706 - if ((vreg->parts->uV.mask || vreg->parts->mV.mask) && 707 - (!initdata->constraints.min_uV || !initdata->constraints.max_uV)) { 708 - dev_err(&pdev->dev, "no voltage specified for regulator\n"); 709 - return -EINVAL; 710 - } 711 - 712 - /* Regulators with ia property suppports drms */ 713 - if (vreg->parts->ia.mask) 714 - initdata->constraints.valid_ops_mask |= REGULATOR_CHANGE_DRMS; 715 - 716 691 key = "bias-pull-down"; 717 - if (of_property_read_bool(pdev->dev.of_node, key)) { 692 + if (of_property_read_bool(node, key)) { 718 693 ret = rpm_reg_set(vreg, &vreg->parts->pd, 1); 719 694 if (ret) { 720 - dev_err(&pdev->dev, "%s is invalid", key); 695 + dev_err(dev, "%s is invalid", key); 721 696 return ret; 722 697 } 723 698 } 724 699 725 700 if (vreg->parts->freq.mask) { 726 - ret = rpm_reg_of_parse_freq(&pdev->dev, vreg); 701 + ret = rpm_reg_of_parse_freq(dev, node, vreg); 727 702 if (ret < 0) 728 703 return ret; 729 704 } 730 705 731 706 if (vreg->parts->pm.mask) { 732 707 key = "qcom,power-mode-hysteretic"; 733 - pwm = !of_property_read_bool(pdev->dev.of_node, key); 708 + pwm = !of_property_read_bool(node, key); 734 709 735 710 ret = rpm_reg_set(vreg, &vreg->parts->pm, pwm); 736 711 if (ret) { 737 - dev_err(&pdev->dev, "failed to set power mode\n"); 712 + dev_err(dev, "failed to set power mode\n"); 738 713 return ret; 739 714 } 740 715 } ··· 695 766 force_mode = -1; 696 767 697 768 key = "qcom,force-mode"; 698 - ret = of_property_read_u32(pdev->dev.of_node, key, &val); 769 + ret = of_property_read_u32(node, key, &val); 699 770 if (ret == -EINVAL) { 700 771 val = QCOM_RPM_FORCE_MODE_NONE; 701 772 } else if (ret < 0) { 702 - dev_err(&pdev->dev, "failed to read %s\n", key); 773 + dev_err(dev, "failed to read %s\n", key); 703 774 return ret; 704 775 } 705 776 ··· 734 805 } 735 806 736 807 if (force_mode == -1) { 737 - dev_err(&pdev->dev, "invalid force mode\n"); 808 + dev_err(dev, "invalid force mode\n"); 738 809 return -EINVAL; 739 810 } 740 811 741 812 ret = rpm_reg_set(vreg, &vreg->parts->fm, force_mode); 742 813 if (ret) { 743 - dev_err(&pdev->dev, "failed to set force mode\n"); 814 + dev_err(dev, "failed to set force mode\n"); 744 815 return ret; 745 816 } 746 817 } 747 818 748 - config.dev = &pdev->dev; 749 - config.init_data = initdata; 750 - config.driver_data = vreg; 751 - config.of_node = pdev->dev.of_node; 752 - rdev = devm_regulator_register(&pdev->dev, &vreg->desc, &config); 753 - if (IS_ERR(rdev)) { 754 - dev_err(&pdev->dev, "can't register regulator\n"); 755 - return PTR_ERR(rdev); 819 + return 0; 820 + } 821 + 822 + struct rpm_regulator_data { 823 + const char *name; 824 + int resource; 825 + const struct qcom_rpm_reg *template; 826 + const char *supply; 827 + }; 828 + 829 + static const struct rpm_regulator_data rpm_pm8058_regulators[] = { 830 + { "l0", QCOM_RPM_PM8058_LDO0, &pm8058_nldo, "vdd_l0_l1_lvs" }, 831 + { "l1", QCOM_RPM_PM8058_LDO1, &pm8058_nldo, "vdd_l0_l1_lvs" }, 832 + { "l2", QCOM_RPM_PM8058_LDO2, &pm8058_pldo, "vdd_l2_l11_l12" }, 833 + { "l3", QCOM_RPM_PM8058_LDO3, &pm8058_pldo, "vdd_l3_l4_l5" }, 834 + { "l4", QCOM_RPM_PM8058_LDO4, &pm8058_pldo, "vdd_l3_l4_l5" }, 835 + { "l5", QCOM_RPM_PM8058_LDO5, &pm8058_pldo, "vdd_l3_l4_l5" }, 836 + { "l6", QCOM_RPM_PM8058_LDO6, &pm8058_pldo, "vdd_l6_l7" }, 837 + { "l7", QCOM_RPM_PM8058_LDO7, &pm8058_pldo, "vdd_l6_l7" }, 838 + { "l8", QCOM_RPM_PM8058_LDO8, &pm8058_pldo, "vdd_l8" }, 839 + { "l9", QCOM_RPM_PM8058_LDO9, &pm8058_pldo, "vdd_l9" }, 840 + { "l10", QCOM_RPM_PM8058_LDO10, &pm8058_pldo, "vdd_l10" }, 841 + { "l11", QCOM_RPM_PM8058_LDO11, &pm8058_pldo, "vdd_l2_l11_l12" }, 842 + { "l12", QCOM_RPM_PM8058_LDO12, &pm8058_pldo, "vdd_l2_l11_l12" }, 843 + { "l13", QCOM_RPM_PM8058_LDO13, &pm8058_pldo, "vdd_l13_l16" }, 844 + { "l14", QCOM_RPM_PM8058_LDO14, &pm8058_pldo, "vdd_l14_l15" }, 845 + { "l15", QCOM_RPM_PM8058_LDO15, &pm8058_pldo, "vdd_l14_l15" }, 846 + { "l16", QCOM_RPM_PM8058_LDO16, &pm8058_pldo, "vdd_l13_l16" }, 847 + { "l17", QCOM_RPM_PM8058_LDO17, &pm8058_pldo, "vdd_l17_l18" }, 848 + { "l18", QCOM_RPM_PM8058_LDO18, &pm8058_pldo, "vdd_l17_l18" }, 849 + { "l19", QCOM_RPM_PM8058_LDO19, &pm8058_pldo, "vdd_l19_l20" }, 850 + { "l20", QCOM_RPM_PM8058_LDO20, &pm8058_pldo, "vdd_l19_l20" }, 851 + { "l21", QCOM_RPM_PM8058_LDO21, &pm8058_nldo, "vdd_l21" }, 852 + { "l22", QCOM_RPM_PM8058_LDO22, &pm8058_nldo, "vdd_l22" }, 853 + { "l23", QCOM_RPM_PM8058_LDO23, &pm8058_nldo, "vdd_l23_l24_l25" }, 854 + { "l24", QCOM_RPM_PM8058_LDO24, &pm8058_nldo, "vdd_l23_l24_l25" }, 855 + { "l25", QCOM_RPM_PM8058_LDO25, &pm8058_nldo, "vdd_l23_l24_l25" }, 856 + 857 + { "s0", QCOM_RPM_PM8058_SMPS0, &pm8058_smps, "vdd_s0" }, 858 + { "s1", QCOM_RPM_PM8058_SMPS1, &pm8058_smps, "vdd_s1" }, 859 + { "s2", QCOM_RPM_PM8058_SMPS2, &pm8058_smps, "vdd_s2" }, 860 + { "s3", QCOM_RPM_PM8058_SMPS3, &pm8058_smps, "vdd_s3" }, 861 + { "s4", QCOM_RPM_PM8058_SMPS4, &pm8058_smps, "vdd_s4" }, 862 + 863 + { "lvs0", QCOM_RPM_PM8058_LVS0, &pm8058_switch, "vdd_l0_l1_lvs" }, 864 + { "lvs1", QCOM_RPM_PM8058_LVS1, &pm8058_switch, "vdd_l0_l1_lvs" }, 865 + 866 + { "ncp", QCOM_RPM_PM8058_NCP, &pm8058_ncp, "vdd_ncp" }, 867 + { } 868 + }; 869 + 870 + static const struct rpm_regulator_data rpm_pm8901_regulators[] = { 871 + { "l0", QCOM_RPM_PM8901_LDO0, &pm8901_nldo, "vdd_l0" }, 872 + { "l1", QCOM_RPM_PM8901_LDO1, &pm8901_pldo, "vdd_l1" }, 873 + { "l2", QCOM_RPM_PM8901_LDO2, &pm8901_pldo, "vdd_l2" }, 874 + { "l3", QCOM_RPM_PM8901_LDO3, &pm8901_pldo, "vdd_l3" }, 875 + { "l4", QCOM_RPM_PM8901_LDO4, &pm8901_pldo, "vdd_l4" }, 876 + { "l5", QCOM_RPM_PM8901_LDO5, &pm8901_pldo, "vdd_l5" }, 877 + { "l6", QCOM_RPM_PM8901_LDO6, &pm8901_pldo, "vdd_l6" }, 878 + 879 + { "s0", QCOM_RPM_PM8901_SMPS0, &pm8901_ftsmps, "vdd_s0" }, 880 + { "s1", QCOM_RPM_PM8901_SMPS1, &pm8901_ftsmps, "vdd_s1" }, 881 + { "s2", QCOM_RPM_PM8901_SMPS2, &pm8901_ftsmps, "vdd_s2" }, 882 + { "s3", QCOM_RPM_PM8901_SMPS3, &pm8901_ftsmps, "vdd_s3" }, 883 + { "s4", QCOM_RPM_PM8901_SMPS4, &pm8901_ftsmps, "vdd_s4" }, 884 + 885 + { "lvs0", QCOM_RPM_PM8901_LVS0, &pm8901_switch, "lvs0_in" }, 886 + { "lvs1", QCOM_RPM_PM8901_LVS1, &pm8901_switch, "lvs1_in" }, 887 + { "lvs2", QCOM_RPM_PM8901_LVS2, &pm8901_switch, "lvs2_in" }, 888 + { "lvs3", QCOM_RPM_PM8901_LVS3, &pm8901_switch, "lvs3_in" }, 889 + 890 + { "mvs", QCOM_RPM_PM8901_MVS, &pm8901_switch, "mvs_in" }, 891 + { } 892 + }; 893 + 894 + static const struct rpm_regulator_data rpm_pm8921_regulators[] = { 895 + { "s1", QCOM_RPM_PM8921_SMPS1, &pm8921_smps, "vdd_s1" }, 896 + { "s2", QCOM_RPM_PM8921_SMPS2, &pm8921_smps, "vdd_s2" }, 897 + { "s3", QCOM_RPM_PM8921_SMPS3, &pm8921_smps }, 898 + { "s4", QCOM_RPM_PM8921_SMPS4, &pm8921_smps, "vdd_s4" }, 899 + { "s7", QCOM_RPM_PM8921_SMPS7, &pm8921_smps, "vdd_s7" }, 900 + { "s8", QCOM_RPM_PM8921_SMPS8, &pm8921_smps, "vdd_s8" }, 901 + 902 + { "l1", QCOM_RPM_PM8921_LDO1, &pm8921_nldo, "vdd_l1_l2_l12_l18" }, 903 + { "l2", QCOM_RPM_PM8921_LDO2, &pm8921_nldo, "vdd_l1_l2_l12_l18" }, 904 + { "l3", QCOM_RPM_PM8921_LDO3, &pm8921_pldo, "vdd_l3_l15_l17" }, 905 + { "l4", QCOM_RPM_PM8921_LDO4, &pm8921_pldo, "vdd_l4_l14" }, 906 + { "l5", QCOM_RPM_PM8921_LDO5, &pm8921_pldo, "vdd_l5_l8_l16" }, 907 + { "l6", QCOM_RPM_PM8921_LDO6, &pm8921_pldo, "vdd_l6_l7" }, 908 + { "l7", QCOM_RPM_PM8921_LDO7, &pm8921_pldo, "vdd_l6_l7" }, 909 + { "l8", QCOM_RPM_PM8921_LDO8, &pm8921_pldo, "vdd_l5_l8_l16" }, 910 + { "l9", QCOM_RPM_PM8921_LDO9, &pm8921_pldo, "vdd_l9_l11" }, 911 + { "l10", QCOM_RPM_PM8921_LDO10, &pm8921_pldo, "vdd_l10_l22" }, 912 + { "l11", QCOM_RPM_PM8921_LDO11, &pm8921_pldo, "vdd_l9_l11" }, 913 + { "l12", QCOM_RPM_PM8921_LDO12, &pm8921_nldo, "vdd_l1_l2_l12_l18" }, 914 + { "l14", QCOM_RPM_PM8921_LDO14, &pm8921_pldo, "vdd_l4_l14" }, 915 + { "l15", QCOM_RPM_PM8921_LDO15, &pm8921_pldo, "vdd_l3_l15_l17" }, 916 + { "l16", QCOM_RPM_PM8921_LDO16, &pm8921_pldo, "vdd_l5_l8_l16" }, 917 + { "l17", QCOM_RPM_PM8921_LDO17, &pm8921_pldo, "vdd_l3_l15_l17" }, 918 + { "l18", QCOM_RPM_PM8921_LDO18, &pm8921_nldo, "vdd_l1_l2_l12_l18" }, 919 + { "l21", QCOM_RPM_PM8921_LDO21, &pm8921_pldo, "vdd_l21_l23_l29" }, 920 + { "l22", QCOM_RPM_PM8921_LDO22, &pm8921_pldo, "vdd_l10_l22" }, 921 + { "l23", QCOM_RPM_PM8921_LDO23, &pm8921_pldo, "vdd_l21_l23_l29" }, 922 + { "l24", QCOM_RPM_PM8921_LDO24, &pm8921_nldo1200, "vdd_l24" }, 923 + { "l25", QCOM_RPM_PM8921_LDO25, &pm8921_nldo1200, "vdd_l25" }, 924 + { "l26", QCOM_RPM_PM8921_LDO26, &pm8921_nldo1200, "vdd_l26" }, 925 + { "l27", QCOM_RPM_PM8921_LDO27, &pm8921_nldo1200, "vdd_l27" }, 926 + { "l28", QCOM_RPM_PM8921_LDO28, &pm8921_nldo1200, "vdd_l28" }, 927 + { "l29", QCOM_RPM_PM8921_LDO29, &pm8921_pldo, "vdd_l21_l23_l29" }, 928 + 929 + { "lvs1", QCOM_RPM_PM8921_LVS1, &pm8921_switch, "vin_lvs1_3_6" }, 930 + { "lvs2", QCOM_RPM_PM8921_LVS2, &pm8921_switch, "vin_lvs2" }, 931 + { "lvs3", QCOM_RPM_PM8921_LVS3, &pm8921_switch, "vin_lvs1_3_6" }, 932 + { "lvs4", QCOM_RPM_PM8921_LVS4, &pm8921_switch, "vin_lvs4_5_7" }, 933 + { "lvs5", QCOM_RPM_PM8921_LVS5, &pm8921_switch, "vin_lvs4_5_7" }, 934 + { "lvs6", QCOM_RPM_PM8921_LVS6, &pm8921_switch, "vin_lvs1_3_6" }, 935 + { "lvs7", QCOM_RPM_PM8921_LVS7, &pm8921_switch, "vin_lvs4_5_7" }, 936 + 937 + { "usb-switch", QCOM_RPM_USB_OTG_SWITCH, &pm8921_switch, "vin_5vs" }, 938 + { "hdmi-switch", QCOM_RPM_HDMI_SWITCH, &pm8921_switch, "vin_5vs" }, 939 + { "ncp", QCOM_RPM_PM8921_NCP, &pm8921_ncp, "vdd_ncp" }, 940 + { } 941 + }; 942 + 943 + static const struct of_device_id rpm_of_match[] = { 944 + { .compatible = "qcom,rpm-pm8058-regulators", .data = &rpm_pm8058_regulators }, 945 + { .compatible = "qcom,rpm-pm8901-regulators", .data = &rpm_pm8901_regulators }, 946 + { .compatible = "qcom,rpm-pm8921-regulators", .data = &rpm_pm8921_regulators }, 947 + { } 948 + }; 949 + MODULE_DEVICE_TABLE(of, rpm_of_match); 950 + 951 + static int rpm_reg_probe(struct platform_device *pdev) 952 + { 953 + const struct rpm_regulator_data *reg; 954 + const struct of_device_id *match; 955 + struct regulator_config config = { }; 956 + struct regulator_dev *rdev; 957 + struct qcom_rpm_reg *vreg; 958 + struct qcom_rpm *rpm; 959 + 960 + rpm = dev_get_drvdata(pdev->dev.parent); 961 + if (!rpm) { 962 + dev_err(&pdev->dev, "unable to retrieve handle to rpm\n"); 963 + return -ENODEV; 964 + } 965 + 966 + match = of_match_device(rpm_of_match, &pdev->dev); 967 + for (reg = match->data; reg->name; reg++) { 968 + vreg = devm_kmalloc(&pdev->dev, sizeof(*vreg), GFP_KERNEL); 969 + if (!vreg) 970 + return -ENOMEM; 971 + 972 + memcpy(vreg, reg->template, sizeof(*vreg)); 973 + mutex_init(&vreg->lock); 974 + 975 + vreg->dev = &pdev->dev; 976 + vreg->resource = reg->resource; 977 + vreg->rpm = rpm; 978 + 979 + vreg->desc.id = -1; 980 + vreg->desc.owner = THIS_MODULE; 981 + vreg->desc.type = REGULATOR_VOLTAGE; 982 + vreg->desc.name = reg->name; 983 + vreg->desc.supply_name = reg->supply; 984 + vreg->desc.of_match = reg->name; 985 + vreg->desc.of_parse_cb = rpm_reg_of_parse; 986 + 987 + config.dev = &pdev->dev; 988 + config.driver_data = vreg; 989 + rdev = devm_regulator_register(&pdev->dev, &vreg->desc, &config); 990 + if (IS_ERR(rdev)) { 991 + dev_err(&pdev->dev, "failed to register %s\n", reg->name); 992 + return PTR_ERR(rdev); 993 + } 756 994 } 757 995 758 996 return 0;
+4 -4
drivers/regulator/stw481x-vmmc.c
··· 56 56 { 57 57 struct stw481x *stw481x = dev_get_platdata(&pdev->dev); 58 58 struct regulator_config config = { }; 59 + struct regulator_dev *rdev; 59 60 int ret; 60 61 61 62 /* First disable the external VMMC if it's active */ ··· 76 75 pdev->dev.of_node, 77 76 &vmmc_regulator); 78 77 79 - stw481x->vmmc_regulator = devm_regulator_register(&pdev->dev, 80 - &vmmc_regulator, &config); 81 - if (IS_ERR(stw481x->vmmc_regulator)) { 78 + rdev = devm_regulator_register(&pdev->dev, &vmmc_regulator, &config); 79 + if (IS_ERR(rdev)) { 82 80 dev_err(&pdev->dev, 83 81 "error initializing STw481x VMMC regulator\n"); 84 - return PTR_ERR(stw481x->vmmc_regulator); 82 + return PTR_ERR(rdev); 85 83 } 86 84 87 85 dev_info(&pdev->dev, "initialized STw481x VMMC regulator\n");
+7 -20
drivers/scsi/ufs/ufshcd.c
··· 4225 4225 static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg, 4226 4226 int ua) 4227 4227 { 4228 - int ret = 0; 4229 - struct regulator *reg = vreg->reg; 4230 - const char *name = vreg->name; 4228 + int ret; 4231 4229 4232 - BUG_ON(!vreg); 4230 + if (!vreg) 4231 + return 0; 4233 4232 4234 - ret = regulator_set_optimum_mode(reg, ua); 4235 - if (ret >= 0) { 4236 - /* 4237 - * regulator_set_optimum_mode() returns new regulator 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); 4233 + ret = regulator_set_load(vreg->reg, ua); 4234 + if (ret < 0) { 4235 + dev_err(dev, "%s: %s set load (ua=%d) failed, err=%d\n", 4236 + __func__, vreg->name, ua, ret); 4244 4237 } 4245 4238 4246 4239 return ret; ··· 4242 4249 static inline int ufshcd_config_vreg_lpm(struct ufs_hba *hba, 4243 4250 struct ufs_vreg *vreg) 4244 4251 { 4245 - if (!vreg) 4246 - return 0; 4247 - 4248 4252 return ufshcd_config_vreg_load(hba->dev, vreg, UFS_VREG_LPM_LOAD_UA); 4249 4253 } 4250 4254 4251 4255 static inline int ufshcd_config_vreg_hpm(struct ufs_hba *hba, 4252 4256 struct ufs_vreg *vreg) 4253 4257 { 4254 - if (!vreg) 4255 - return 0; 4256 - 4257 4258 return ufshcd_config_vreg_load(hba->dev, vreg, vreg->max_uA); 4258 4259 } 4259 4260
+2 -2
drivers/usb/phy/phy-ab8500-usb.c
··· 277 277 dev_err(ab->dev, "Failed to set the Vintcore to 1.3V, ret=%d\n", 278 278 ret); 279 279 280 - ret = regulator_set_optimum_mode(ab->v_ulpi, 28000); 280 + ret = regulator_set_load(ab->v_ulpi, 28000); 281 281 if (ret < 0) 282 282 dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n", 283 283 ret); ··· 317 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 321 if (ret < 0) 322 322 dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n", 323 323 ret);
+5 -10
drivers/usb/phy/phy-msm-usb.c
··· 142 142 int ret = 0; 143 143 144 144 if (on) { 145 - ret = regulator_set_optimum_mode(motg->v1p8, 146 - USB_PHY_1P8_HPM_LOAD); 145 + ret = regulator_set_load(motg->v1p8, USB_PHY_1P8_HPM_LOAD); 147 146 if (ret < 0) { 148 147 pr_err("Could not set HPM for v1p8\n"); 149 148 return ret; 150 149 } 151 - ret = regulator_set_optimum_mode(motg->v3p3, 152 - USB_PHY_3P3_HPM_LOAD); 150 + ret = regulator_set_load(motg->v3p3, USB_PHY_3P3_HPM_LOAD); 153 151 if (ret < 0) { 154 152 pr_err("Could not set HPM for v3p3\n"); 155 - regulator_set_optimum_mode(motg->v1p8, 156 - USB_PHY_1P8_LPM_LOAD); 153 + regulator_set_load(motg->v1p8, USB_PHY_1P8_LPM_LOAD); 157 154 return ret; 158 155 } 159 156 } else { 160 - ret = regulator_set_optimum_mode(motg->v1p8, 161 - USB_PHY_1P8_LPM_LOAD); 157 + ret = regulator_set_load(motg->v1p8, USB_PHY_1P8_LPM_LOAD); 162 158 if (ret < 0) 163 159 pr_err("Could not set LPM for v1p8\n"); 164 - ret = regulator_set_optimum_mode(motg->v3p3, 165 - USB_PHY_3P3_LPM_LOAD); 160 + ret = regulator_set_load(motg->v3p3, USB_PHY_3P3_LPM_LOAD); 166 161 if (ret < 0) 167 162 pr_err("Could not set LPM for v3p3\n"); 168 163 }
+1
include/linux/mfd/palmas.h
··· 117 117 int ldo_begin; 118 118 int ldo_end; 119 119 int max_reg; 120 + bool has_regen3; 120 121 struct palmas_regs_info *palmas_regs_info; 121 122 struct of_regulator_match *palmas_matches; 122 123 struct palmas_sleep_requestor_info *sleep_req_info;
-4
include/linux/mfd/stw481x.h
··· 41 41 42 42 /** 43 43 * struct stw481x - state holder for the Stw481x drivers 44 - * @mutex: mutex to serialize I2C accesses 45 44 * @i2c_client: corresponding I2C client 46 - * @regulator: regulator device for regulator children 47 45 * @map: regmap handle to access device registers 48 46 */ 49 47 struct stw481x { 50 - struct mutex lock; 51 48 struct i2c_client *client; 52 - struct regulator_dev *vmmc_regulator; 53 49 struct regmap *map; 54 50 }; 55 51
+18 -3
include/linux/regulator/consumer.h
··· 238 238 239 239 int regulator_set_mode(struct regulator *regulator, unsigned int mode); 240 240 unsigned int regulator_get_mode(struct regulator *regulator); 241 - int regulator_set_optimum_mode(struct regulator *regulator, int load_uA); 241 + int regulator_set_load(struct regulator *regulator, int load_uA); 242 242 243 243 int regulator_allow_bypass(struct regulator *regulator, bool allow); 244 244 ··· 252 252 /* regulator notifier block */ 253 253 int regulator_register_notifier(struct regulator *regulator, 254 254 struct notifier_block *nb); 255 + int devm_regulator_register_notifier(struct regulator *regulator, 256 + struct notifier_block *nb); 255 257 int regulator_unregister_notifier(struct regulator *regulator, 256 258 struct notifier_block *nb); 259 + void devm_regulator_unregister_notifier(struct regulator *regulator, 260 + struct notifier_block *nb); 257 261 258 262 /* driver data - core doesn't touch */ 259 263 void *regulator_get_drvdata(struct regulator *regulator); ··· 483 479 return REGULATOR_MODE_NORMAL; 484 480 } 485 481 486 - static inline int regulator_set_optimum_mode(struct regulator *regulator, 487 - int load_uA) 482 + static inline int regulator_set_load(struct regulator *regulator, int load_uA) 488 483 { 489 484 return REGULATOR_MODE_NORMAL; 490 485 } ··· 518 515 return 0; 519 516 } 520 517 518 + static inline int devm_regulator_register_notifier(struct regulator *regulator, 519 + struct notifier_block *nb) 520 + { 521 + return 0; 522 + } 523 + 521 524 static inline int regulator_unregister_notifier(struct regulator *regulator, 522 525 struct notifier_block *nb) 526 + { 527 + return 0; 528 + } 529 + 530 + static inline int devm_regulator_unregister_notifier(struct regulator *regulator, 531 + struct notifier_block *nb) 523 532 { 524 533 return 0; 525 534 }