> -----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 = ®ulator_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 >