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

regulator: qcom_spmi: add PMS405 SPMI regulator

The PMS405 has 5 HFSMPS and 13 LDO regulators,

This commit adds support for one of the 5 HFSMPS regulators (s3) to
the spmi regulator driver.

The PMIC HFSMPS 430 regulators have 8 mV step size and a voltage
control scheme consisting of two 8-bit registers defining a 16-bit
voltage set point in units of millivolts

S3 controls the cpu voltages (s3 is a buck regulator of type HFS430);
it is therefore required so we can enable voltage scaling for safely
running cpufreq.

Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
Signed-off-by: Jeffrey Hugo <jeffrey.l.hugo@gmail.com>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Jorge Ramirez and committed by
Mark Brown
0211f68e bbd7992e

+40 -3
+40 -3
drivers/regulator/qcom_spmi-regulator.c
··· 97 97 SPMI_REGULATOR_LOGICAL_TYPE_ULT_HO_SMPS, 98 98 SPMI_REGULATOR_LOGICAL_TYPE_ULT_LDO, 99 99 SPMI_REGULATOR_LOGICAL_TYPE_FTSMPS426, 100 + SPMI_REGULATOR_LOGICAL_TYPE_HFS430, 100 101 }; 101 102 102 103 enum spmi_regulator_type { ··· 150 149 SPMI_REGULATOR_SUBTYPE_ULT_HF_CTL2 = 0x0e, 151 150 SPMI_REGULATOR_SUBTYPE_ULT_HF_CTL3 = 0x0f, 152 151 SPMI_REGULATOR_SUBTYPE_ULT_HF_CTL4 = 0x10, 152 + SPMI_REGULATOR_SUBTYPE_HFS430 = 0x0a, 153 153 }; 154 154 155 155 enum spmi_common_regulator_registers { ··· 295 293 296 294 /* Clock rate in kHz of the FTSMPS426 regulator reference clock. */ 297 295 #define SPMI_FTSMPS426_CLOCK_RATE 4800 296 + 297 + #define SPMI_HFS430_CLOCK_RATE 1600 298 298 299 299 /* Minimum voltage stepper delay for each step. */ 300 300 #define SPMI_FTSMPS426_STEP_DELAY 2 ··· 511 507 SPMI_VOLTAGE_RANGE(0, 1750000, 1750000, 3337500, 3337500, 12500), 512 508 }; 513 509 510 + static struct spmi_voltage_range hfs430_ranges[] = { 511 + SPMI_VOLTAGE_RANGE(0, 320000, 320000, 2040000, 2040000, 8000), 512 + }; 513 + 514 514 static DEFINE_SPMI_SET_POINTS(pldo); 515 515 static DEFINE_SPMI_SET_POINTS(nldo1); 516 516 static DEFINE_SPMI_SET_POINTS(nldo2); ··· 530 522 static DEFINE_SPMI_SET_POINTS(ult_ho_smps); 531 523 static DEFINE_SPMI_SET_POINTS(ult_nldo); 532 524 static DEFINE_SPMI_SET_POINTS(ult_pldo); 525 + static DEFINE_SPMI_SET_POINTS(hfs430); 533 526 534 527 static inline int spmi_vreg_read(struct spmi_regulator *vreg, u16 addr, u8 *buf, 535 528 int len) ··· 1407 1398 .set_pull_down = spmi_regulator_common_set_pull_down, 1408 1399 }; 1409 1400 1401 + static struct regulator_ops spmi_hfs430_ops = { 1402 + .enable = regulator_enable_regmap, 1403 + .disable = regulator_disable_regmap, 1404 + .is_enabled = regulator_is_enabled_regmap, 1405 + .set_voltage_sel = spmi_regulator_ftsmps426_set_voltage, 1406 + .set_voltage_time_sel = spmi_regulator_set_voltage_time_sel, 1407 + .get_voltage_sel = spmi_regulator_ftsmps426_get_voltage, 1408 + .map_voltage = spmi_regulator_single_map_voltage, 1409 + .list_voltage = spmi_regulator_common_list_voltage, 1410 + .set_mode = spmi_regulator_ftsmps426_set_mode, 1411 + .get_mode = spmi_regulator_ftsmps426_get_mode, 1412 + }; 1413 + 1410 1414 /* Maximum possible digital major revision value */ 1411 1415 #define INF 0xFF 1412 1416 1413 1417 static const struct spmi_regulator_mapping supported_regulators[] = { 1414 1418 /* type subtype dig_min dig_max ltype ops setpoints hpm_min */ 1415 1419 SPMI_VREG(BUCK, GP_CTL, 0, INF, SMPS, smps, smps, 100000), 1420 + SPMI_VREG(BUCK, HFS430, 0, INF, HFS430, hfs430, hfs430, 10000), 1416 1421 SPMI_VREG(LDO, N300, 0, INF, LDO, ldo, nldo1, 10000), 1417 1422 SPMI_VREG(LDO, N600, 0, 0, LDO, ldo, nldo2, 10000), 1418 1423 SPMI_VREG(LDO, N1200, 0, 0, LDO, ldo, nldo2, 10000), ··· 1594 1571 return ret; 1595 1572 } 1596 1573 1597 - static int spmi_regulator_init_slew_rate_ftsmps426(struct spmi_regulator *vreg) 1574 + static int spmi_regulator_init_slew_rate_ftsmps426(struct spmi_regulator *vreg, 1575 + int clock_rate) 1598 1576 { 1599 1577 int ret; 1600 1578 u8 reg = 0; ··· 1612 1588 delay >>= SPMI_FTSMPS426_STEP_CTRL_DELAY_SHIFT; 1613 1589 1614 1590 /* slew_rate has units of uV/us */ 1615 - slew_rate = SPMI_FTSMPS426_CLOCK_RATE * range->step_uV; 1591 + slew_rate = clock_rate * range->step_uV; 1616 1592 slew_rate /= 1000 * (SPMI_FTSMPS426_STEP_DELAY << delay); 1617 1593 slew_rate *= SPMI_FTSMPS426_STEP_MARGIN_NUM; 1618 1594 slew_rate /= SPMI_FTSMPS426_STEP_MARGIN_DEN; ··· 1764 1740 return ret; 1765 1741 break; 1766 1742 case SPMI_REGULATOR_LOGICAL_TYPE_FTSMPS426: 1767 - ret = spmi_regulator_init_slew_rate_ftsmps426(vreg); 1743 + ret = spmi_regulator_init_slew_rate_ftsmps426(vreg, 1744 + SPMI_FTSMPS426_CLOCK_RATE); 1745 + if (ret) 1746 + return ret; 1747 + break; 1748 + case SPMI_REGULATOR_LOGICAL_TYPE_HFS430: 1749 + ret = spmi_regulator_init_slew_rate_ftsmps426(vreg, 1750 + SPMI_HFS430_CLOCK_RATE); 1768 1751 if (ret) 1769 1752 return ret; 1770 1753 break; ··· 1939 1908 { } 1940 1909 }; 1941 1910 1911 + static const struct spmi_regulator_data pms405_regulators[] = { 1912 + { "s3", 0x1a00, "vdd_s3"}, 1913 + { } 1914 + }; 1915 + 1942 1916 static const struct of_device_id qcom_spmi_regulator_match[] = { 1943 1917 { .compatible = "qcom,pm8005-regulators", .data = &pm8005_regulators }, 1944 1918 { .compatible = "qcom,pm8841-regulators", .data = &pm8841_regulators }, ··· 1951 1915 { .compatible = "qcom,pm8941-regulators", .data = &pm8941_regulators }, 1952 1916 { .compatible = "qcom,pm8994-regulators", .data = &pm8994_regulators }, 1953 1917 { .compatible = "qcom,pmi8994-regulators", .data = &pmi8994_regulators }, 1918 + { .compatible = "qcom,pms405-regulators", .data = &pms405_regulators }, 1954 1919 { } 1955 1920 }; 1956 1921 MODULE_DEVICE_TABLE(of, qcom_spmi_regulator_match);