mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-06 05:02:31 +00:00
regulator: pca9450: add pca9451a support
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>
This commit is contained in:
parent
0f3b73eb14
commit
5edeb7d312
@ -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);
|
||||
|
@ -9,6 +9,7 @@
|
||||
enum pca9450_chip_type {
|
||||
PCA9450_TYPE_PCA9450A = 0,
|
||||
PCA9450_TYPE_PCA9450BC,
|
||||
PCA9450_TYPE_PCA9451A,
|
||||
PCA9450_TYPE_AMOUNT,
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user