RE: [EXT] Re: [PATCH v2 2/3] regulator: pca9450: add pca9451a support

From: Joy Zou
Date: Mon Mar 11 2024 - 05:13:56 EST



> -----Original Message-----
> From: Alexander Stein <alexander.stein@xxxxxxxxxxxxxxx>
> Sent: 2024年3月11日 17:09
> To: Jacky Bai <ping.bai@xxxxxxx>; lgirdwood@xxxxxxxxx;
> broonie@xxxxxxxxxx; robh+dt@xxxxxxxxxx; krzysztof.kozlowski+dt@xxxxxxxxxx;
> conor+dt@xxxxxxxxxx; shawnguo@xxxxxxxxxx; s.hauer@xxxxxxxxxxxxxx;
> linux-arm-kernel@xxxxxxxxxxxxxxxxxxx
> Cc: kernel@xxxxxxxxxxxxxx; festevam@xxxxxxxxx; dl-linux-imx
> <linux-imx@xxxxxxx>; devicetree@xxxxxxxxxxxxxxx;
> linux-arm-kernel@xxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx;
> imx@xxxxxxxxxxxxxxx; Joy Zou <joy.zou@xxxxxxx>
> Subject: [EXT] Re: [PATCH v2 2/3] regulator: pca9450: add pca9451a support
>
> Caution: This is an external email. Please take care when clicking links or
> opening attachments. When in doubt, report the message using the 'Report
> this email' button
>
>
> Hi,
>
> thanks for the update.
>
> Am Montag, 11. März 2024, 09:47:56 CET schrieb Joy Zou:
> > Adding support for pmic pca9451a.
> >
> > This patch support old and new pmic pca9451a. The new pmic trimed
> BUCK1.
> > The default value of Toff_Deb is used to distinguish the old and new pmic.
>
> This section doesn't apply anymore. Please remove it.
>
> > Signed-off-by: Joy Zou <joy.zou@xxxxxxx>
> > ---
> > Changes in v2:
> > 1. remove the old part support because the old part only is used for
> > sample and is diffcult to distinguish old and new part. so drop old part.
> > 2. remove the unnecessary marco definition in the file pca9450.h.
> > ---
> > drivers/regulator/pca9450-regulator.c | 197
> +++++++++++++++++++++++++-
> > include/linux/regulator/pca9450.h | 1 +
> > 2 files changed, 195 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/regulator/pca9450-regulator.c
> > b/drivers/regulator/pca9450-regulator.c
> > index 2ab365d2749f..50c324e275b5 100644
> > --- a/drivers/regulator/pca9450-regulator.c
> > +++ b/drivers/regulator/pca9450-regulator.c
> > @@ -103,7 +103,15 @@ static const struct regulator_ops
> pca9450_ldo_regulator_ops = {
> > * 0.60 to 2.1875V (12.5mV step)
> > */
> > static const struct linear_range pca9450_dvs_buck_volts[] = {
> > - REGULATOR_LINEAR_RANGE(600000, 0x00, 0x7F, 12500),
> > + REGULATOR_LINEAR_RANGE(600000, 0x00, 0x7F, 12500), };
>
> That's an unrelated change.
Yeah, I will remove it.
>
> > +/*
> > + * 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),
> > };
> >
> > /*
> > @@ -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;
> > @@ -767,6 +952,7 @@ static int pca9450_i2c_probe(struct i2c_client
> *i2c)
> > const struct pca9450_regulator_desc *r;
> >
> > r = &regulator_desc[i];
> > +
>
> Please don't add this empty line. Seems like a leftover from v1.
>
Okay, will remove the empty line.
Thank you very much.
BR
Joy Zou
> Thanks and best regards,
> Alexander
>
> > desc = &r->desc;
> >
> > config.regmap = pca9450->regmap; @@ -846,7 +1032,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 +1051,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); diff --git
> > a/include/linux/regulator/pca9450.h
> > b/include/linux/regulator/pca9450.h
> > index 505c908dbb81..243633c8dceb 100644
> > --- a/include/linux/regulator/pca9450.h
> > +++ b/include/linux/regulator/pca9450.h
> > @@ -9,6 +9,7 @@
> > enum pca9450_chip_type {
> > PCA9450_TYPE_PCA9450A = 0,
> > PCA9450_TYPE_PCA9450BC,
> > + PCA9450_TYPE_PCA9451A,
> > PCA9450_TYPE_AMOUNT,
> > };
> >
> >
>
>
> --
> TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
> Amtsgericht München, HRB 105018
> Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
> http://www.t/
> q-group.com%2F&data=05%7C02%7Cjoy.zou%40nxp.com%7C127cf372317a
> 45bcefe508dc41aaeb74%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7
> C0%7C638457449552418123%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC
> 4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C
> %7C%7C&sdata=3EUbZ%2B8PQtMQ%2F4hC71tn1T3cqnQwGBwnaQf3xleDq
> %2FQ%3D&reserved=0
>