Merge tag 'kbuild-fixes-v5.12-2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / regulator / qcom_spmi-regulator.c
index 5ee7c53..e62e1d7 100644 (file)
@@ -135,6 +135,18 @@ enum spmi_regulator_subtype {
        SPMI_REGULATOR_SUBTYPE_LV_P600          = 0x2b,
        SPMI_REGULATOR_SUBTYPE_LV_P1200         = 0x2c,
        SPMI_REGULATOR_SUBTYPE_LV_P450          = 0x2d,
+       SPMI_REGULATOR_SUBTYPE_HT_N300_ST       = 0x30,
+       SPMI_REGULATOR_SUBTYPE_HT_N600_ST       = 0x31,
+       SPMI_REGULATOR_SUBTYPE_HT_N1200_ST      = 0x32,
+       SPMI_REGULATOR_SUBTYPE_HT_LVP150        = 0x3b,
+       SPMI_REGULATOR_SUBTYPE_HT_LVP300        = 0x3c,
+       SPMI_REGULATOR_SUBTYPE_L660_N300_ST     = 0x42,
+       SPMI_REGULATOR_SUBTYPE_L660_N600_ST     = 0x43,
+       SPMI_REGULATOR_SUBTYPE_L660_P50         = 0x46,
+       SPMI_REGULATOR_SUBTYPE_L660_P150        = 0x47,
+       SPMI_REGULATOR_SUBTYPE_L660_P600        = 0x49,
+       SPMI_REGULATOR_SUBTYPE_L660_LVP150      = 0x4d,
+       SPMI_REGULATOR_SUBTYPE_L660_LVP600      = 0x4f,
        SPMI_REGULATOR_SUBTYPE_LV100            = 0x01,
        SPMI_REGULATOR_SUBTYPE_LV300            = 0x02,
        SPMI_REGULATOR_SUBTYPE_MV300            = 0x08,
@@ -511,6 +523,22 @@ static struct spmi_voltage_range ult_pldo_ranges[] = {
        SPMI_VOLTAGE_RANGE(0, 1750000, 1750000, 3337500, 3337500, 12500),
 };
 
+static struct spmi_voltage_range pldo660_ranges[] = {
+       SPMI_VOLTAGE_RANGE(0, 1504000, 1504000, 3544000, 3544000, 8000),
+};
+
+static struct spmi_voltage_range nldo660_ranges[] = {
+       SPMI_VOLTAGE_RANGE(0,  320000,  320000, 1304000, 1304000, 8000),
+};
+
+static struct spmi_voltage_range ht_lvpldo_ranges[] = {
+       SPMI_VOLTAGE_RANGE(0, 1504000, 1504000, 2000000, 2000000, 8000),
+};
+
+static struct spmi_voltage_range ht_nldo_ranges[] = {
+       SPMI_VOLTAGE_RANGE(0,  312000,  312000, 1304000, 1304000, 8000),
+};
+
 static struct spmi_voltage_range hfs430_ranges[] = {
        SPMI_VOLTAGE_RANGE(0, 320000, 320000, 2040000, 2040000, 8000),
 };
@@ -530,6 +558,10 @@ static DEFINE_SPMI_SET_POINTS(ult_lo_smps);
 static DEFINE_SPMI_SET_POINTS(ult_ho_smps);
 static DEFINE_SPMI_SET_POINTS(ult_nldo);
 static DEFINE_SPMI_SET_POINTS(ult_pldo);
+static DEFINE_SPMI_SET_POINTS(pldo660);
+static DEFINE_SPMI_SET_POINTS(nldo660);
+static DEFINE_SPMI_SET_POINTS(ht_lvpldo);
+static DEFINE_SPMI_SET_POINTS(ht_nldo);
 static DEFINE_SPMI_SET_POINTS(hfs430);
 
 static inline int spmi_vreg_read(struct spmi_regulator *vreg, u16 addr, u8 *buf,
@@ -1443,6 +1475,30 @@ static const struct spmi_regulator_mapping supported_regulators[] = {
        SPMI_VREG(LDO,   LV_P300,  0, INF, LDO,    ldo,    pldo,    10000),
        SPMI_VREG(LDO,   LV_P600,  0, INF, LDO,    ldo,    pldo,    10000),
        SPMI_VREG(LDO,   LV_P1200, 0, INF, LDO,    ldo,    pldo,    10000),
+       SPMI_VREG(LDO, HT_N300_ST,   0, INF, FTSMPS426, ftsmps426,
+                                                       ht_nldo,   30000),
+       SPMI_VREG(LDO, HT_N600_ST,   0, INF, FTSMPS426, ftsmps426,
+                                                       ht_nldo,   30000),
+       SPMI_VREG(LDO, HT_N1200_ST,  0, INF, FTSMPS426, ftsmps426,
+                                                       ht_nldo,   30000),
+       SPMI_VREG(LDO, HT_LVP150,    0, INF, FTSMPS426, ftsmps426,
+                                                       ht_lvpldo, 10000),
+       SPMI_VREG(LDO, HT_LVP300,    0, INF, FTSMPS426, ftsmps426,
+                                                       ht_lvpldo, 10000),
+       SPMI_VREG(LDO, L660_N300_ST, 0, INF, FTSMPS426, ftsmps426,
+                                                       nldo660,   10000),
+       SPMI_VREG(LDO, L660_N600_ST, 0, INF, FTSMPS426, ftsmps426,
+                                                       nldo660,   10000),
+       SPMI_VREG(LDO, L660_P50,     0, INF, FTSMPS426, ftsmps426,
+                                                       pldo660,   10000),
+       SPMI_VREG(LDO, L660_P150,    0, INF, FTSMPS426, ftsmps426,
+                                                       pldo660,   10000),
+       SPMI_VREG(LDO, L660_P600,    0, INF, FTSMPS426, ftsmps426,
+                                                       pldo660,   10000),
+       SPMI_VREG(LDO, L660_LVP150,  0, INF, FTSMPS426, ftsmps426,
+                                                       ht_lvpldo, 10000),
+       SPMI_VREG(LDO, L660_LVP600,  0, INF, FTSMPS426, ftsmps426,
+                                                       ht_lvpldo, 10000),
        SPMI_VREG_VS(LV100,        0, INF),
        SPMI_VREG_VS(LV300,        0, INF),
        SPMI_VREG_VS(MV300,        0, INF),
@@ -1633,45 +1689,43 @@ static int spmi_regulator_init_registers(struct spmi_regulator *vreg,
                return ret;
 
        /* Set up enable pin control. */
-       if ((type == SPMI_REGULATOR_LOGICAL_TYPE_SMPS
-            || type == SPMI_REGULATOR_LOGICAL_TYPE_LDO
-            || type == SPMI_REGULATOR_LOGICAL_TYPE_VS)
-           && !(data->pin_ctrl_enable
-                       & SPMI_REGULATOR_PIN_CTRL_ENABLE_HW_DEFAULT)) {
-               ctrl_reg[SPMI_COMMON_IDX_ENABLE] &=
-                       ~SPMI_COMMON_ENABLE_FOLLOW_ALL_MASK;
-               ctrl_reg[SPMI_COMMON_IDX_ENABLE] |=
-                   data->pin_ctrl_enable & SPMI_COMMON_ENABLE_FOLLOW_ALL_MASK;
+       if (!(data->pin_ctrl_enable & SPMI_REGULATOR_PIN_CTRL_ENABLE_HW_DEFAULT)) {
+               switch (type) {
+               case SPMI_REGULATOR_LOGICAL_TYPE_SMPS:
+               case SPMI_REGULATOR_LOGICAL_TYPE_LDO:
+               case SPMI_REGULATOR_LOGICAL_TYPE_VS:
+                       ctrl_reg[SPMI_COMMON_IDX_ENABLE] &=
+                               ~SPMI_COMMON_ENABLE_FOLLOW_ALL_MASK;
+                       ctrl_reg[SPMI_COMMON_IDX_ENABLE] |=
+                               data->pin_ctrl_enable & SPMI_COMMON_ENABLE_FOLLOW_ALL_MASK;
+                       break;
+               default:
+                       break;
+               }
        }
 
        /* Set up mode pin control. */
-       if ((type == SPMI_REGULATOR_LOGICAL_TYPE_SMPS
-           || type == SPMI_REGULATOR_LOGICAL_TYPE_LDO)
-               && !(data->pin_ctrl_hpm
-                       & SPMI_REGULATOR_PIN_CTRL_HPM_HW_DEFAULT)) {
-               ctrl_reg[SPMI_COMMON_IDX_MODE] &=
-                       ~SPMI_COMMON_MODE_FOLLOW_ALL_MASK;
-               ctrl_reg[SPMI_COMMON_IDX_MODE] |=
-                       data->pin_ctrl_hpm & SPMI_COMMON_MODE_FOLLOW_ALL_MASK;
-       }
-
-       if (type == SPMI_REGULATOR_LOGICAL_TYPE_VS
-          && !(data->pin_ctrl_hpm & SPMI_REGULATOR_PIN_CTRL_HPM_HW_DEFAULT)) {
-               ctrl_reg[SPMI_COMMON_IDX_MODE] &=
-                       ~SPMI_COMMON_MODE_FOLLOW_AWAKE_MASK;
-               ctrl_reg[SPMI_COMMON_IDX_MODE] |=
-                      data->pin_ctrl_hpm & SPMI_COMMON_MODE_FOLLOW_AWAKE_MASK;
-       }
-
-       if ((type == SPMI_REGULATOR_LOGICAL_TYPE_ULT_LO_SMPS
-               || type == SPMI_REGULATOR_LOGICAL_TYPE_ULT_HO_SMPS
-               || type == SPMI_REGULATOR_LOGICAL_TYPE_ULT_LDO)
-               && !(data->pin_ctrl_hpm
-                       & SPMI_REGULATOR_PIN_CTRL_HPM_HW_DEFAULT)) {
-               ctrl_reg[SPMI_COMMON_IDX_MODE] &=
-                       ~SPMI_COMMON_MODE_FOLLOW_AWAKE_MASK;
-               ctrl_reg[SPMI_COMMON_IDX_MODE] |=
-                      data->pin_ctrl_hpm & SPMI_COMMON_MODE_FOLLOW_AWAKE_MASK;
+       if (!(data->pin_ctrl_hpm & SPMI_REGULATOR_PIN_CTRL_HPM_HW_DEFAULT)) {
+               switch (type) {
+               case SPMI_REGULATOR_LOGICAL_TYPE_SMPS:
+               case SPMI_REGULATOR_LOGICAL_TYPE_LDO:
+                       ctrl_reg[SPMI_COMMON_IDX_MODE] &=
+                               ~SPMI_COMMON_MODE_FOLLOW_ALL_MASK;
+                       ctrl_reg[SPMI_COMMON_IDX_MODE] |=
+                               data->pin_ctrl_hpm & SPMI_COMMON_MODE_FOLLOW_ALL_MASK;
+                       break;
+               case SPMI_REGULATOR_LOGICAL_TYPE_VS:
+               case SPMI_REGULATOR_LOGICAL_TYPE_ULT_LO_SMPS:
+               case SPMI_REGULATOR_LOGICAL_TYPE_ULT_HO_SMPS:
+               case SPMI_REGULATOR_LOGICAL_TYPE_ULT_LDO:
+                       ctrl_reg[SPMI_COMMON_IDX_MODE] &=
+                               ~SPMI_COMMON_MODE_FOLLOW_AWAKE_MASK;
+                       ctrl_reg[SPMI_COMMON_IDX_MODE] |=
+                               data->pin_ctrl_hpm & SPMI_COMMON_MODE_FOLLOW_AWAKE_MASK;
+                       break;
+               default:
+                       break;
+               }
        }
 
        /* Write back any control register values that were modified. */
@@ -1960,6 +2014,55 @@ static const struct spmi_regulator_data pmi8994_regulators[] = {
        { }
 };
 
+static const struct spmi_regulator_data pm660_regulators[] = {
+       { "s1", 0x1400, "vdd_s1", },
+       { "s2", 0x1700, "vdd_s2", },
+       { "s3", 0x1a00, "vdd_s3", },
+       { "s4", 0x1d00, "vdd_s3", },
+       { "s5", 0x2000, "vdd_s5", },
+       { "s6", 0x2300, "vdd_s6", },
+       { "l1", 0x4000, "vdd_l1_l6_l7", },
+       { "l2", 0x4100, "vdd_l2_l3", },
+       { "l3", 0x4200, "vdd_l2_l3", },
+       /* l4 is unaccessible on PM660 */
+       { "l5", 0x4400, "vdd_l5", },
+       { "l6", 0x4500, "vdd_l1_l6_l7", },
+       { "l7", 0x4600, "vdd_l1_l6_l7", },
+       { "l8", 0x4700, "vdd_l8_l9_l10_l11_l12_l13_l14", },
+       { "l9", 0x4800, "vdd_l8_l9_l10_l11_l12_l13_l14", },
+       { "l10", 0x4900, "vdd_l8_l9_l10_l11_l12_l13_l14", },
+       { "l11", 0x4a00, "vdd_l8_l9_l10_l11_l12_l13_l14", },
+       { "l12", 0x4b00, "vdd_l8_l9_l10_l11_l12_l13_l14", },
+       { "l13", 0x4c00, "vdd_l8_l9_l10_l11_l12_l13_l14", },
+       { "l14", 0x4d00, "vdd_l8_l9_l10_l11_l12_l13_l14", },
+       { "l15", 0x4e00, "vdd_l15_l16_l17_l18_l19", },
+       { "l16", 0x4f00, "vdd_l15_l16_l17_l18_l19", },
+       { "l17", 0x5000, "vdd_l15_l16_l17_l18_l19", },
+       { "l18", 0x5100, "vdd_l15_l16_l17_l18_l19", },
+       { "l19", 0x5200, "vdd_l15_l16_l17_l18_l19", },
+       { }
+};
+
+static const struct spmi_regulator_data pm660l_regulators[] = {
+       { "s1", 0x1400, "vdd_s1", },
+       { "s2", 0x1700, "vdd_s2", },
+       { "s3", 0x1a00, "vdd_s3", },
+       { "s4", 0x1d00, "vdd_s4", },
+       { "s5", 0x2000, "vdd_s5", },
+       { "l1", 0x4000, "vdd_l1_l9_l10", },
+       { "l2", 0x4100, "vdd_l2", },
+       { "l3", 0x4200, "vdd_l3_l5_l7_l8", },
+       { "l4", 0x4300, "vdd_l4_l6", },
+       { "l5", 0x4400, "vdd_l3_l5_l7_l8", },
+       { "l6", 0x4500, "vdd_l4_l6", },
+       { "l7", 0x4600, "vdd_l3_l5_l7_l8", },
+       { "l8", 0x4700, "vdd_l3_l5_l7_l8", },
+       { "l9", 0x4800, "vdd_l1_l9_l10", },
+       { "l10", 0x4900, "vdd_l1_l9_l10", },
+       { }
+};
+
+
 static const struct spmi_regulator_data pm8004_regulators[] = {
        { "s2", 0x1700, "vdd_s2", },
        { "s5", 0x2000, "vdd_s5", },
@@ -1988,6 +2091,8 @@ static const struct of_device_id qcom_spmi_regulator_match[] = {
        { .compatible = "qcom,pm8950-regulators", .data = &pm8950_regulators },
        { .compatible = "qcom,pm8994-regulators", .data = &pm8994_regulators },
        { .compatible = "qcom,pmi8994-regulators", .data = &pmi8994_regulators },
+       { .compatible = "qcom,pm660-regulators", .data = &pm660_regulators },
+       { .compatible = "qcom,pm660l-regulators", .data = &pm660l_regulators },
        { .compatible = "qcom,pms405-regulators", .data = &pms405_regulators },
        { }
 };