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

regulator: qcom_smd: Add PM660/PM660L regulator support

The PM660 and PM660L are a very very common PMIC combo, found on
boards using the SDM630, SDM636, SDM660 (and SDA variants) SoC.

PM660 provides 6 SMPS and 19 LDOs (of which one is unaccesible),
while PM660L provides 5 SMPS (of which S3 and S4 are combined),
10 LDOs and a Buck-or-Boost (BoB) regulator.

The PM660L IC also provides other regulators that are very
specialized (for example, for the display) and will be managed
in the other appropriate drivers (for example, labibb).

Signed-off-by: AngeloGioacchino Del Regno <kholk11@gmail.com>
Link: https://lore.kernel.org/r/20200926125549.13191-6-kholk11@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

AngeloGioacchino Del Regno and committed by
Mark Brown
6d849653 f9f061a5

+117
+113
drivers/regulator/qcom_smd-regulator.c
··· 541 541 .ops = &rpm_bob_ops, 542 542 }; 543 543 544 + static const struct regulator_desc pm660_ftsmps = { 545 + .linear_ranges = (struct linear_range[]) { 546 + REGULATOR_LINEAR_RANGE(355000, 0, 199, 5000), 547 + }, 548 + .n_linear_ranges = 1, 549 + .n_voltages = 200, 550 + .ops = &rpm_smps_ldo_ops, 551 + }; 552 + 553 + static const struct regulator_desc pm660_hfsmps = { 554 + .linear_ranges = (struct linear_range[]) { 555 + REGULATOR_LINEAR_RANGE(320000, 0, 216, 8000), 556 + }, 557 + .n_linear_ranges = 1, 558 + .n_voltages = 217, 559 + .ops = &rpm_smps_ldo_ops, 560 + }; 561 + 562 + static const struct regulator_desc pm660_ht_nldo = { 563 + .linear_ranges = (struct linear_range[]) { 564 + REGULATOR_LINEAR_RANGE(312000, 0, 124, 8000), 565 + }, 566 + .n_linear_ranges = 1, 567 + .n_voltages = 125, 568 + .ops = &rpm_smps_ldo_ops, 569 + }; 570 + 571 + static const struct regulator_desc pm660_ht_lvpldo = { 572 + .linear_ranges = (struct linear_range[]) { 573 + REGULATOR_LINEAR_RANGE(1504000, 0, 62, 8000), 574 + }, 575 + .n_linear_ranges = 1, 576 + .n_voltages = 63, 577 + .ops = &rpm_smps_ldo_ops, 578 + }; 579 + 580 + static const struct regulator_desc pm660_nldo660 = { 581 + .linear_ranges = (struct linear_range[]) { 582 + REGULATOR_LINEAR_RANGE(320000, 0, 123, 8000), 583 + }, 584 + .n_linear_ranges = 1, 585 + .n_voltages = 124, 586 + .ops = &rpm_smps_ldo_ops, 587 + }; 588 + 589 + static const struct regulator_desc pm660_pldo660 = { 590 + .linear_ranges = (struct linear_range[]) { 591 + REGULATOR_LINEAR_RANGE(1504000, 0, 255, 8000), 592 + }, 593 + .n_linear_ranges = 1, 594 + .n_voltages = 256, 595 + .ops = &rpm_smps_ldo_ops, 596 + }; 597 + 598 + static const struct regulator_desc pm660l_bob = { 599 + .linear_ranges = (struct linear_range[]) { 600 + REGULATOR_LINEAR_RANGE(1800000, 0, 84, 32000), 601 + }, 602 + .n_linear_ranges = 1, 603 + .n_voltages = 85, 604 + .ops = &rpm_bob_ops, 605 + }; 606 + 544 607 static const struct regulator_desc pms405_hfsmps3 = { 545 608 .linear_ranges = (struct linear_range[]) { 546 609 REGULATOR_LINEAR_RANGE(320000, 0, 215, 8000), ··· 965 902 {} 966 903 }; 967 904 905 + static const struct rpm_regulator_data rpm_pm660_regulators[] = { 906 + { "s1", QCOM_SMD_RPM_SMPA, 1, &pm660_ftsmps, "vdd_s1" }, 907 + { "s2", QCOM_SMD_RPM_SMPA, 2, &pm660_ftsmps, "vdd_s2" }, 908 + { "s3", QCOM_SMD_RPM_SMPA, 3, &pm660_ftsmps, "vdd_s3" }, 909 + { "s4", QCOM_SMD_RPM_SMPA, 4, &pm660_hfsmps, "vdd_s4" }, 910 + { "s5", QCOM_SMD_RPM_SMPA, 5, &pm660_hfsmps, "vdd_s5" }, 911 + { "s6", QCOM_SMD_RPM_SMPA, 6, &pm660_hfsmps, "vdd_s6" }, 912 + { "l1", QCOM_SMD_RPM_LDOA, 1, &pm660_nldo660, "vdd_l1_l6_l7" }, 913 + { "l2", QCOM_SMD_RPM_LDOA, 2, &pm660_ht_nldo, "vdd_l2_l3" }, 914 + { "l3", QCOM_SMD_RPM_LDOA, 3, &pm660_nldo660, "vdd_l2_l3" }, 915 + /* l4 is unaccessible on PM660 */ 916 + { "l5", QCOM_SMD_RPM_LDOA, 5, &pm660_ht_nldo, "vdd_l5" }, 917 + { "l6", QCOM_SMD_RPM_LDOA, 6, &pm660_ht_nldo, "vdd_l1_l6_l7" }, 918 + { "l7", QCOM_SMD_RPM_LDOA, 7, &pm660_ht_nldo, "vdd_l1_l6_l7" }, 919 + { "l8", QCOM_SMD_RPM_LDOA, 8, &pm660_ht_lvpldo, "vdd_l8_l9_l10_l11_l12_l13_l14" }, 920 + { "l9", QCOM_SMD_RPM_LDOA, 9, &pm660_ht_lvpldo, "vdd_l8_l9_l10_l11_l12_l13_l14" }, 921 + { "l10", QCOM_SMD_RPM_LDOA, 10, &pm660_ht_lvpldo, "vdd_l8_l9_l10_l11_l12_l13_l14" }, 922 + { "l11", QCOM_SMD_RPM_LDOA, 11, &pm660_ht_lvpldo, "vdd_l8_l9_l10_l11_l12_l13_l14" }, 923 + { "l12", QCOM_SMD_RPM_LDOA, 12, &pm660_ht_lvpldo, "vdd_l8_l9_l10_l11_l12_l13_l14" }, 924 + { "l13", QCOM_SMD_RPM_LDOA, 13, &pm660_ht_lvpldo, "vdd_l8_l9_l10_l11_l12_l13_l14" }, 925 + { "l14", QCOM_SMD_RPM_LDOA, 14, &pm660_ht_lvpldo, "vdd_l8_l9_l10_l11_l12_l13_l14" }, 926 + { "l15", QCOM_SMD_RPM_LDOA, 15, &pm660_pldo660, "vdd_l15_l16_l17_l18_l19" }, 927 + { "l16", QCOM_SMD_RPM_LDOA, 16, &pm660_pldo660, "vdd_l15_l16_l17_l18_l19" }, 928 + { "l17", QCOM_SMD_RPM_LDOA, 17, &pm660_pldo660, "vdd_l15_l16_l17_l18_l19" }, 929 + { "l18", QCOM_SMD_RPM_LDOA, 18, &pm660_pldo660, "vdd_l15_l16_l17_l18_l19" }, 930 + { "l19", QCOM_SMD_RPM_LDOA, 19, &pm660_pldo660, "vdd_l15_l16_l17_l18_l19" }, 931 + { } 932 + }; 933 + 934 + static const struct rpm_regulator_data rpm_pm660l_regulators[] = { 935 + { "s1", QCOM_SMD_RPM_SMPB, 1, &pm660_ftsmps, "vdd_s1" }, 936 + { "s2", QCOM_SMD_RPM_SMPB, 2, &pm660_ftsmps, "vdd_s2" }, 937 + { "s3", QCOM_SMD_RPM_RWCX, 0, &pm660_ftsmps, "vdd_s3_s4" }, 938 + { "s5", QCOM_SMD_RPM_RWMX, 0, &pm660_ftsmps, "vdd_s5" }, 939 + { "l1", QCOM_SMD_RPM_LDOB, 1, &pm660_nldo660, "vdd_l1_l9_l10" }, 940 + { "l2", QCOM_SMD_RPM_LDOB, 2, &pm660_pldo660, "vdd_l2" }, 941 + { "l3", QCOM_SMD_RPM_LDOB, 3, &pm660_pldo660, "vdd_l3_l5_l7_l8" }, 942 + { "l4", QCOM_SMD_RPM_LDOB, 4, &pm660_pldo660, "vdd_l4_l6" }, 943 + { "l5", QCOM_SMD_RPM_LDOB, 5, &pm660_pldo660, "vdd_l3_l5_l7_l8" }, 944 + { "l6", QCOM_SMD_RPM_LDOB, 6, &pm660_pldo660, "vdd_l4_l6" }, 945 + { "l7", QCOM_SMD_RPM_LDOB, 7, &pm660_pldo660, "vdd_l3_l5_l7_l8" }, 946 + { "l8", QCOM_SMD_RPM_LDOB, 8, &pm660_pldo660, "vdd_l3_l5_l7_l8" }, 947 + { "l9", QCOM_SMD_RPM_RWLC, 0, &pm660_ht_nldo, "vdd_l1_l9_l10" }, 948 + { "l10", QCOM_SMD_RPM_RWLM, 0, &pm660_ht_nldo, "vdd_l1_l9_l10" }, 949 + { "bob", QCOM_SMD_RPM_BOBB, 1, &pm660l_bob, "vdd_bob", }, 950 + { } 951 + }; 952 + 968 953 static const struct rpm_regulator_data rpm_pms405_regulators[] = { 969 954 { "s1", QCOM_SMD_RPM_SMPA, 1, &pms405_hfsmps3, "vdd_s1" }, 970 955 { "s2", QCOM_SMD_RPM_SMPA, 2, &pms405_hfsmps3, "vdd_s2" }, ··· 1043 932 { .compatible = "qcom,rpm-pm8950-regulators", .data = &rpm_pm8950_regulators }, 1044 933 { .compatible = "qcom,rpm-pm8994-regulators", .data = &rpm_pm8994_regulators }, 1045 934 { .compatible = "qcom,rpm-pm8998-regulators", .data = &rpm_pm8998_regulators }, 935 + { .compatible = "qcom,rpm-pm660-regulators", .data = &rpm_pm660_regulators }, 936 + { .compatible = "qcom,rpm-pm660l-regulators", .data = &rpm_pm660l_regulators }, 1046 937 { .compatible = "qcom,rpm-pma8084-regulators", .data = &rpm_pma8084_regulators }, 1047 938 { .compatible = "qcom,rpm-pmi8994-regulators", .data = &rpm_pmi8994_regulators }, 1048 939 { .compatible = "qcom,rpm-pmi8998-regulators", .data = &rpm_pmi8998_regulators },
+4
include/linux/soc/qcom/smd-rpm.h
··· 19 19 #define QCOM_SMD_RPM_CLK_BUF_A 0x616B6C63 20 20 #define QCOM_SMD_RPM_LDOA 0x616f646c 21 21 #define QCOM_SMD_RPM_LDOB 0x626F646C 22 + #define QCOM_SMD_RPM_RWCX 0x78637772 23 + #define QCOM_SMD_RPM_RWMX 0x786d7772 24 + #define QCOM_SMD_RPM_RWLC 0x636c7772 25 + #define QCOM_SMD_RPM_RWLM 0x6d6c7772 22 26 #define QCOM_SMD_RPM_MEM_CLK 0x326b6c63 23 27 #define QCOM_SMD_RPM_MISC_CLK 0x306b6c63 24 28 #define QCOM_SMD_RPM_NCPA 0x6170636E