regulator: pca9450: add pca9451a support
authorJoy Zou <joy.zou@nxp.com>
Mon, 18 Mar 2024 09:56:32 +0000 (17:56 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 25 Mar 2024 00:48:35 +0000 (00:48 +0000)
Adding support for new pmic pca9451a.

Signed-off-by: Joy Zou <joy.zou@nxp.com>
Link: https://msgid.link/r/20240318095633.4079027-3-joy.zou@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/pca9450-regulator.c
include/linux/regulator/pca9450.h

index 2ab365d2749f9a44d9f78ec0d8d684d2845122b3..242ff25f5b83080c01fd95284c023e50468d4e2e 100644 (file)
@@ -106,6 +106,14 @@ static const struct linear_range pca9450_dvs_buck_volts[] = {
        REGULATOR_LINEAR_RANGE(600000,  0x00, 0x7F, 12500),
 };
 
+/*
+ * BUCK1/3
+ * 0.65 to 2.2375V (12.5mV step)
+ */
+static const struct linear_range pca9451a_dvs_buck_volts[] = {
+       REGULATOR_LINEAR_RANGE(650000, 0x00, 0x7F, 12500),
+};
+
 /*
  * BUCK4/5/6
  * 0.6V to 3.4V (25mV step)
@@ -662,6 +670,178 @@ static const struct pca9450_regulator_desc pca9450bc_regulators[] = {
        },
 };
 
+static const struct pca9450_regulator_desc pca9451a_regulators[] = {
+       {
+               .desc = {
+                       .name = "buck1",
+                       .of_match = of_match_ptr("BUCK1"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = PCA9450_BUCK1,
+                       .ops = &pca9450_dvs_buck_regulator_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .n_voltages = PCA9450_BUCK1_VOLTAGE_NUM,
+                       .linear_ranges = pca9451a_dvs_buck_volts,
+                       .n_linear_ranges = ARRAY_SIZE(pca9451a_dvs_buck_volts),
+                       .vsel_reg = PCA9450_REG_BUCK1OUT_DVS0,
+                       .vsel_mask = BUCK1OUT_DVS0_MASK,
+                       .enable_reg = PCA9450_REG_BUCK1CTRL,
+                       .enable_mask = BUCK1_ENMODE_MASK,
+                       .enable_val = BUCK_ENMODE_ONREQ,
+                       .ramp_mask = BUCK1_RAMP_MASK,
+                       .ramp_delay_table = pca9450_dvs_buck_ramp_table,
+                       .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = pca9450_set_dvs_levels,
+               },
+               .dvs = {
+                       .run_reg = PCA9450_REG_BUCK1OUT_DVS0,
+                       .run_mask = BUCK1OUT_DVS0_MASK,
+                       .standby_reg = PCA9450_REG_BUCK1OUT_DVS1,
+                       .standby_mask = BUCK1OUT_DVS1_MASK,
+               },
+       },
+       {
+               .desc = {
+                       .name = "buck2",
+                       .of_match = of_match_ptr("BUCK2"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = PCA9450_BUCK2,
+                       .ops = &pca9450_dvs_buck_regulator_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .n_voltages = PCA9450_BUCK2_VOLTAGE_NUM,
+                       .linear_ranges = pca9450_dvs_buck_volts,
+                       .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
+                       .vsel_reg = PCA9450_REG_BUCK2OUT_DVS0,
+                       .vsel_mask = BUCK2OUT_DVS0_MASK,
+                       .enable_reg = PCA9450_REG_BUCK2CTRL,
+                       .enable_mask = BUCK2_ENMODE_MASK,
+                       .enable_val = BUCK_ENMODE_ONREQ_STBYREQ,
+                       .ramp_mask = BUCK2_RAMP_MASK,
+                       .ramp_delay_table = pca9450_dvs_buck_ramp_table,
+                       .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = pca9450_set_dvs_levels,
+               },
+               .dvs = {
+                       .run_reg = PCA9450_REG_BUCK2OUT_DVS0,
+                       .run_mask = BUCK2OUT_DVS0_MASK,
+                       .standby_reg = PCA9450_REG_BUCK2OUT_DVS1,
+                       .standby_mask = BUCK2OUT_DVS1_MASK,
+               },
+       },
+       {
+               .desc = {
+                       .name = "buck4",
+                       .of_match = of_match_ptr("BUCK4"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = PCA9450_BUCK4,
+                       .ops = &pca9450_buck_regulator_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .n_voltages = PCA9450_BUCK4_VOLTAGE_NUM,
+                       .linear_ranges = pca9450_buck_volts,
+                       .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
+                       .vsel_reg = PCA9450_REG_BUCK4OUT,
+                       .vsel_mask = BUCK4OUT_MASK,
+                       .enable_reg = PCA9450_REG_BUCK4CTRL,
+                       .enable_mask = BUCK4_ENMODE_MASK,
+                       .enable_val = BUCK_ENMODE_ONREQ,
+                       .owner = THIS_MODULE,
+               },
+       },
+       {
+               .desc = {
+                       .name = "buck5",
+                       .of_match = of_match_ptr("BUCK5"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = PCA9450_BUCK5,
+                       .ops = &pca9450_buck_regulator_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .n_voltages = PCA9450_BUCK5_VOLTAGE_NUM,
+                       .linear_ranges = pca9450_buck_volts,
+                       .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
+                       .vsel_reg = PCA9450_REG_BUCK5OUT,
+                       .vsel_mask = BUCK5OUT_MASK,
+                       .enable_reg = PCA9450_REG_BUCK5CTRL,
+                       .enable_mask = BUCK5_ENMODE_MASK,
+                       .enable_val = BUCK_ENMODE_ONREQ,
+                       .owner = THIS_MODULE,
+               },
+       },
+       {
+               .desc = {
+                       .name = "buck6",
+                       .of_match = of_match_ptr("BUCK6"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = PCA9450_BUCK6,
+                       .ops = &pca9450_buck_regulator_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .n_voltages = PCA9450_BUCK6_VOLTAGE_NUM,
+                       .linear_ranges = pca9450_buck_volts,
+                       .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
+                       .vsel_reg = PCA9450_REG_BUCK6OUT,
+                       .vsel_mask = BUCK6OUT_MASK,
+                       .enable_reg = PCA9450_REG_BUCK6CTRL,
+                       .enable_mask = BUCK6_ENMODE_MASK,
+                       .enable_val = BUCK_ENMODE_ONREQ,
+                       .owner = THIS_MODULE,
+               },
+       },
+       {
+               .desc = {
+                       .name = "ldo1",
+                       .of_match = of_match_ptr("LDO1"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = PCA9450_LDO1,
+                       .ops = &pca9450_ldo_regulator_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .n_voltages = PCA9450_LDO1_VOLTAGE_NUM,
+                       .linear_ranges = pca9450_ldo1_volts,
+                       .n_linear_ranges = ARRAY_SIZE(pca9450_ldo1_volts),
+                       .vsel_reg = PCA9450_REG_LDO1CTRL,
+                       .vsel_mask = LDO1OUT_MASK,
+                       .enable_reg = PCA9450_REG_LDO1CTRL,
+                       .enable_mask = LDO1_EN_MASK,
+                       .owner = THIS_MODULE,
+               },
+       },
+       {
+               .desc = {
+                       .name = "ldo4",
+                       .of_match = of_match_ptr("LDO4"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = PCA9450_LDO4,
+                       .ops = &pca9450_ldo_regulator_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .n_voltages = PCA9450_LDO4_VOLTAGE_NUM,
+                       .linear_ranges = pca9450_ldo34_volts,
+                       .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
+                       .vsel_reg = PCA9450_REG_LDO4CTRL,
+                       .vsel_mask = LDO4OUT_MASK,
+                       .enable_reg = PCA9450_REG_LDO4CTRL,
+                       .enable_mask = LDO4_EN_MASK,
+                       .owner = THIS_MODULE,
+               },
+       },
+       {
+               .desc = {
+                       .name = "ldo5",
+                       .of_match = of_match_ptr("LDO5"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = PCA9450_LDO5,
+                       .ops = &pca9450_ldo_regulator_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .n_voltages = PCA9450_LDO5_VOLTAGE_NUM,
+                       .linear_ranges = pca9450_ldo5_volts,
+                       .n_linear_ranges = ARRAY_SIZE(pca9450_ldo5_volts),
+                       .vsel_reg = PCA9450_REG_LDO5CTRL_H,
+                       .vsel_mask = LDO5HOUT_MASK,
+                       .enable_reg = PCA9450_REG_LDO5CTRL_H,
+                       .enable_mask = LDO5H_EN_MASK,
+                       .owner = THIS_MODULE,
+               },
+       },
+};
+
 static irqreturn_t pca9450_irq_handler(int irq, void *data)
 {
        struct pca9450 *pca9450 = data;
@@ -729,6 +909,10 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
                regulator_desc = pca9450bc_regulators;
                pca9450->rcnt = ARRAY_SIZE(pca9450bc_regulators);
                break;
+       case PCA9450_TYPE_PCA9451A:
+               regulator_desc = pca9451a_regulators;
+               pca9450->rcnt = ARRAY_SIZE(pca9451a_regulators);
+               break;
        default:
                dev_err(&i2c->dev, "Unknown device type");
                return -EINVAL;
@@ -755,7 +939,8 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
 
        /* Check your board and dts for match the right pmic */
        if (((device_id >> 4) != 0x1 && type == PCA9450_TYPE_PCA9450A) ||
-           ((device_id >> 4) != 0x3 && type == PCA9450_TYPE_PCA9450BC)) {
+           ((device_id >> 4) != 0x3 && type == PCA9450_TYPE_PCA9450BC) ||
+           ((device_id >> 4) != 0x9 && type == PCA9450_TYPE_PCA9451A)) {
                dev_err(&i2c->dev, "Device id(%x) mismatched\n",
                        device_id >> 4);
                return -EINVAL;
@@ -846,7 +1031,8 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
        }
 
        dev_info(&i2c->dev, "%s probed.\n",
-               type == PCA9450_TYPE_PCA9450A ? "pca9450a" : "pca9450bc");
+               type == PCA9450_TYPE_PCA9450A ? "pca9450a" :
+               (type == PCA9450_TYPE_PCA9451A ? "pca9451a" : "pca9450bc"));
 
        return 0;
 }
@@ -864,6 +1050,10 @@ static const struct of_device_id pca9450_of_match[] = {
                .compatible = "nxp,pca9450c",
                .data = (void *)PCA9450_TYPE_PCA9450BC,
        },
+       {
+               .compatible = "nxp,pca9451a",
+               .data = (void *)PCA9450_TYPE_PCA9451A,
+       },
        { }
 };
 MODULE_DEVICE_TABLE(of, pca9450_of_match);
index 505c908dbb8175cc27d086c93cb8aaea7082338f..243633c8dceb3f2b1446cec2f9c928b7c0a1c9c3 100644 (file)
@@ -9,6 +9,7 @@
 enum pca9450_chip_type {
        PCA9450_TYPE_PCA9450A = 0,
        PCA9450_TYPE_PCA9450BC,
+       PCA9450_TYPE_PCA9451A,
        PCA9450_TYPE_AMOUNT,
 };