]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
regulator: rpmh-regulator: Add RPMH regulator support for Glymur
authorKamal Wadhwa <kamal.wadhwa@oss.qualcomm.com>
Thu, 18 Sep 2025 09:27:04 +0000 (14:57 +0530)
committerMark Brown <broonie@kernel.org>
Wed, 15 Oct 2025 19:12:51 +0000 (20:12 +0100)
Add support for PMH0101/PMCX0102/PMH0110/PMH0104 PMIC voltage
regulators which are present on Glymur boards.

Introduce new LDOs & SMPSs under them (PMIC5 subtype 530 for
both).

For these new LDOs support a new optimum power mode(OPM). In
this mode LDO will automatically switch between high power mode
(HPM) and low power mode (LPM) based on the real-time LDO load
current. Its operation is analogous to SMPS AUTO mode.

Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Co-developed-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
Signed-off-by: Kamal Wadhwa <kamal.wadhwa@oss.qualcomm.com>
Link: https://patch.msgid.link/20250918-glymur-rpmh-regulator-driver-v3-4-184c09678be3@oss.qualcomm.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/qcom-rpmh-regulator.c

index dfb5bf5b72a1ee0a9a87b72c7baabd52779819a3..0a561f1d94523bf479f48e8c2062f79cf64f5b5f 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 // Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
-// Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
 
 #define pr_fmt(fmt) "%s: " fmt, __func__
 
@@ -92,6 +92,11 @@ static const struct resource_name_formats vreg_rsc_name_lookup[NUM_REGULATOR_TYP
 #define PMIC5_BOB_MODE_AUTO                    6
 #define PMIC5_BOB_MODE_PWM                     7
 
+#define PMIC530_LDO_MODE_RETENTION             3
+#define PMIC530_LDO_MODE_LPM                   4
+#define PMIC530_LDO_MODE_OPM                   5
+#define PMIC530_LDO_MODE_HPM                   7
+
 #define PMIC_ID_LEN                            4
 /**
  * struct rpmh_vreg_hw_data - RPMh regulator hardware configurations
@@ -557,6 +562,14 @@ static const int pmic_mode_map_pmic5_ldo_hpm[REGULATOR_MODE_STANDBY + 1] = {
        [REGULATOR_MODE_FAST]    = -EINVAL,
 };
 
+static const int pmic_mode_map_pmic530_ldo[REGULATOR_MODE_STANDBY + 1] = {
+       [REGULATOR_MODE_INVALID] = -EINVAL,
+       [REGULATOR_MODE_STANDBY] = PMIC530_LDO_MODE_RETENTION,
+       [REGULATOR_MODE_IDLE]    = PMIC530_LDO_MODE_LPM,
+       [REGULATOR_MODE_NORMAL]  = PMIC530_LDO_MODE_OPM,
+       [REGULATOR_MODE_FAST]    = PMIC530_LDO_MODE_HPM,
+};
+
 static unsigned int rpmh_regulator_pmic4_ldo_of_map_mode(unsigned int rpmh_mode)
 {
        unsigned int mode;
@@ -579,6 +592,30 @@ static unsigned int rpmh_regulator_pmic4_ldo_of_map_mode(unsigned int rpmh_mode)
        return mode;
 }
 
+static unsigned int rpmh_regulator_pmic530_ldo_of_map_mode(unsigned int rpmh_mode)
+{
+       unsigned int mode;
+
+       switch (rpmh_mode) {
+       case RPMH_REGULATOR_MODE_HPM:
+               mode = REGULATOR_MODE_FAST;
+               break;
+       case RPMH_REGULATOR_MODE_AUTO:
+               mode = REGULATOR_MODE_NORMAL;
+               break;
+       case RPMH_REGULATOR_MODE_LPM:
+               mode = REGULATOR_MODE_IDLE;
+               break;
+       case RPMH_REGULATOR_MODE_RET:
+               mode = REGULATOR_MODE_STANDBY;
+               break;
+       default:
+               mode = REGULATOR_MODE_INVALID;
+               break;
+       }
+       return mode;
+}
+
 static const int pmic_mode_map_pmic4_smps[REGULATOR_MODE_STANDBY + 1] = {
        [REGULATOR_MODE_INVALID] = -EINVAL,
        [REGULATOR_MODE_STANDBY] = PMIC4_SMPS_MODE_RETENTION,
@@ -942,6 +979,71 @@ static const struct rpmh_vreg_hw_data pmic5_bob = {
        .of_map_mode = rpmh_regulator_pmic4_bob_of_map_mode,
 };
 
+static const struct rpmh_vreg_hw_data pmic5_nldo530 = {
+       .regulator_type = VRM,
+       .ops = &rpmh_regulator_vrm_drms_ops,
+       .voltage_ranges = (struct linear_range[]) {
+               REGULATOR_LINEAR_RANGE(320000, 0, 210, 8000),
+       },
+       .n_linear_ranges = 1,
+       .n_voltages = 211,
+       .hpm_min_load_uA = 30000,
+       .pmic_mode_map = pmic_mode_map_pmic530_ldo,
+       .of_map_mode = rpmh_regulator_pmic530_ldo_of_map_mode,
+};
+
+static const struct rpmh_vreg_hw_data pmic5_pldo530_mvp150 = {
+       .regulator_type = VRM,
+       .ops = &rpmh_regulator_vrm_drms_ops,
+       .voltage_ranges = (struct linear_range[]) {
+               REGULATOR_LINEAR_RANGE(1504000, 0, 255, 8000),
+       },
+       .n_linear_ranges = 1,
+       .n_voltages = 256,
+       .hpm_min_load_uA = 10000,
+       .pmic_mode_map = pmic_mode_map_pmic530_ldo,
+       .of_map_mode = rpmh_regulator_pmic530_ldo_of_map_mode,
+};
+
+static const struct rpmh_vreg_hw_data pmic5_pldo530_mvp300 = {
+       .regulator_type = VRM,
+       .ops = &rpmh_regulator_vrm_drms_ops,
+       .voltage_ranges = (struct linear_range[]) {
+               REGULATOR_LINEAR_RANGE(1504000, 0, 255, 8000),
+       },
+       .n_linear_ranges = 1,
+       .n_voltages = 256,
+       .hpm_min_load_uA = 20000,
+       .pmic_mode_map = pmic_mode_map_pmic530_ldo,
+       .of_map_mode = rpmh_regulator_pmic530_ldo_of_map_mode,
+};
+
+static const struct rpmh_vreg_hw_data pmic5_pldo530_mvp600 = {
+       .regulator_type = VRM,
+       .ops = &rpmh_regulator_vrm_drms_ops,
+       .voltage_ranges = (struct linear_range[]) {
+               REGULATOR_LINEAR_RANGE(1504000, 0, 255, 8000),
+       },
+       .n_linear_ranges = 1,
+       .n_voltages = 256,
+       .hpm_min_load_uA = 40000,
+       .pmic_mode_map = pmic_mode_map_pmic530_ldo,
+       .of_map_mode = rpmh_regulator_pmic530_ldo_of_map_mode,
+};
+
+static const struct rpmh_vreg_hw_data pmic5_ftsmps530 = {
+       .regulator_type = VRM,
+       .ops = &rpmh_regulator_vrm_ops,
+       .voltage_ranges = (struct linear_range[]) {
+               REGULATOR_LINEAR_RANGE(252000, 0, 305, 4000),
+               REGULATOR_LINEAR_RANGE(1480000, 306, 464, 8000),
+       },
+       .n_linear_ranges = 2,
+       .n_voltages = 465,
+       .pmic_mode_map = pmic_mode_map_pmic5_smps,
+       .of_map_mode = rpmh_regulator_pmic4_smps_of_map_mode,
+};
+
 #define RPMH_VREG(_name, _vreg_hw_type, _index, _hw_data, _supply_name) \
 { \
        .name           = _name, \
@@ -1376,6 +1478,74 @@ static const struct rpmh_vreg_init_data pm6350_vreg_data[] = {
        RPMH_VREG("ldo22",  LDO,  22, &pmic5_nldo,      NULL),
 };
 
+static const struct rpmh_vreg_init_data pmcx0102_vreg_data[] = {
+       RPMH_VREG("smps1",   SMPS, 1,    &pmic5_ftsmps530, "vdd-s1"),
+       RPMH_VREG("smps2",   SMPS, 2,    &pmic5_ftsmps530, "vdd-s2"),
+       RPMH_VREG("smps3",   SMPS, 3,    &pmic5_ftsmps530, "vdd-s3"),
+       RPMH_VREG("smps4",   SMPS, 4,    &pmic5_ftsmps530, "vdd-s4"),
+       RPMH_VREG("smps5",   SMPS, 5,    &pmic5_ftsmps530, "vdd-s5"),
+       RPMH_VREG("smps6",   SMPS, 6,    &pmic5_ftsmps530, "vdd-s6"),
+       RPMH_VREG("smps7",   SMPS, 7,    &pmic5_ftsmps530, "vdd-s7"),
+       RPMH_VREG("smps8",   SMPS, 8,    &pmic5_ftsmps530, "vdd-s8"),
+       RPMH_VREG("smps9",   SMPS, 9,    &pmic5_ftsmps530, "vdd-s9"),
+       RPMH_VREG("smps10",  SMPS, 10,   &pmic5_ftsmps530, "vdd-s10"),
+       RPMH_VREG("ldo1",   LDO,  1,    &pmic5_nldo530,      "vdd-l1"),
+       RPMH_VREG("ldo2",   LDO,  2,    &pmic5_nldo530,      "vdd-l2"),
+       RPMH_VREG("ldo3",   LDO,  3,    &pmic5_nldo530,      "vdd-l3"),
+       RPMH_VREG("ldo4",   LDO,  4,    &pmic5_nldo530,      "vdd-l4"),
+       {}
+};
+
+static const struct rpmh_vreg_init_data pmh0101_vreg_data[] = {
+       RPMH_VREG("ldo1",   LDO, 1,  &pmic5_nldo530,      "vdd-l1-l4-l10"),
+       RPMH_VREG("ldo2",   LDO, 2,  &pmic5_pldo530_mvp300,      "vdd-l2-l13-l14"),
+       RPMH_VREG("ldo3",   LDO, 3,  &pmic5_nldo530,      "vdd-l3-l11"),
+       RPMH_VREG("ldo4",   LDO, 4,  &pmic5_nldo530,      "vdd-l1-l4-l10"),
+       RPMH_VREG("ldo5",   LDO, 5,  &pmic5_pldo530_mvp150,      "vdd-l5-l16"),
+       RPMH_VREG("ldo6",   LDO, 6,  &pmic5_pldo530_mvp300,      "vdd-l6-l7"),
+       RPMH_VREG("ldo7",   LDO, 7,  &pmic5_pldo530_mvp300,      "vdd-l6-l7"),
+       RPMH_VREG("ldo8",   LDO, 8,  &pmic5_pldo530_mvp150,      "vdd-l8-l9"),
+       RPMH_VREG("ldo9",   LDO, 9,  &pmic5_pldo515_mv,      "vdd-l8-l9"),
+       RPMH_VREG("ldo10",  LDO, 10, &pmic5_nldo530,      "vdd-l1-l4-l10"),
+       RPMH_VREG("ldo11",  LDO, 11, &pmic5_nldo530,      "vdd-l3-l11"),
+       RPMH_VREG("ldo12",  LDO, 12, &pmic5_nldo530,      "vdd-l12"),
+       RPMH_VREG("ldo13",  LDO, 13, &pmic5_pldo530_mvp150,     "vdd-l2-l13-l14"),
+       RPMH_VREG("ldo14",  LDO, 14, &pmic5_pldo530_mvp150,     "vdd-l2-l13-l14"),
+       RPMH_VREG("ldo15",  LDO, 15, &pmic5_nldo530,      "vdd-l15"),
+       RPMH_VREG("ldo16",  LDO, 15, &pmic5_pldo530_mvp600,      "vdd-l5-l16"),
+       RPMH_VREG("ldo17",  LDO, 17, &pmic5_pldo515_mv,   "vdd-l17"),
+       RPMH_VREG("ldo18",  LDO, 18, &pmic5_nldo530,      "vdd-l18"),
+       RPMH_VREG("bob1",   BOB, 1,  &pmic5_bob,          "vdd-bob1"),
+       RPMH_VREG("bob2",   BOB, 2,  &pmic5_bob,          "vdd-bob2"),
+       {}
+};
+
+static const struct rpmh_vreg_init_data pmh0104_vreg_data[] = {
+       RPMH_VREG("smps1",   SMPS, 1,    &pmic5_ftsmps530, "vdd-s1"),
+       RPMH_VREG("smps2",   SMPS, 2,    &pmic5_ftsmps530, "vdd-s2"),
+       RPMH_VREG("smps3",   SMPS, 3,    &pmic5_ftsmps530, "vdd-s3"),
+       RPMH_VREG("smps4",   SMPS, 4,    &pmic5_ftsmps530, "vdd-s4"),
+       {}
+};
+
+static const struct rpmh_vreg_init_data pmh0110_vreg_data[] = {
+       RPMH_VREG("smps1",   SMPS, 1,    &pmic5_ftsmps530, "vdd-s1"),
+       RPMH_VREG("smps2",   SMPS, 2,    &pmic5_ftsmps530, "vdd-s2"),
+       RPMH_VREG("smps3",   SMPS, 3,    &pmic5_ftsmps530, "vdd-s3"),
+       RPMH_VREG("smps4",   SMPS, 4,    &pmic5_ftsmps530, "vdd-s4"),
+       RPMH_VREG("smps5",   SMPS, 5,    &pmic5_ftsmps530, "vdd-s5"),
+       RPMH_VREG("smps6",   SMPS, 6,    &pmic5_ftsmps530, "vdd-s6"),
+       RPMH_VREG("smps7",   SMPS, 7,    &pmic5_ftsmps530, "vdd-s7"),
+       RPMH_VREG("smps8",   SMPS, 8,    &pmic5_ftsmps530, "vdd-s8"),
+       RPMH_VREG("smps9",   SMPS, 9,    &pmic5_ftsmps530, "vdd-s9"),
+       RPMH_VREG("smps10",  SMPS, 10,   &pmic5_ftsmps530, "vdd-s10"),
+       RPMH_VREG("ldo1",   LDO,  1,    &pmic5_nldo530,      "vdd-l1"),
+       RPMH_VREG("ldo2",   LDO,  2,    &pmic5_nldo530,      "vdd-l2"),
+       RPMH_VREG("ldo3",   LDO,  3,    &pmic5_nldo530,      "vdd-l3"),
+       RPMH_VREG("ldo4",   LDO,  4,    &pmic5_nldo530,      "vdd-l4"),
+       {}
+};
+
 static const struct rpmh_vreg_init_data pmx55_vreg_data[] = {
        RPMH_VREG("smps1",  SMPS, 1,  &pmic5_ftsmps510, "vdd-s1"),
        RPMH_VREG("smps2",  SMPS, 2,  &pmic5_hfsmps510, "vdd-s2"),
@@ -1728,6 +1898,22 @@ static const struct of_device_id __maybe_unused rpmh_regulator_match_table[] = {
                .compatible = "qcom,pmc8380-rpmh-regulators",
                .data = pmc8380_vreg_data,
        },
+       {
+               .compatible = "qcom,pmcx0102-rpmh-regulators",
+               .data = pmcx0102_vreg_data,
+       },
+       {
+               .compatible = "qcom,pmh0101-rpmh-regulators",
+               .data = pmh0101_vreg_data,
+       },
+       {
+               .compatible = "qcom,pmh0104-rpmh-regulators",
+               .data = pmh0104_vreg_data,
+       },
+       {
+               .compatible = "qcom,pmh0110-rpmh-regulators",
+               .data = pmh0110_vreg_data,
+       },
        {
                .compatible = "qcom,pmm8155au-rpmh-regulators",
                .data = pmm8155au_vreg_data,