Skip to content

Commit cd290ab

Browse files
committed
add pmic pca9451a support
Merge series from Joy Zou <[email protected]>: The patchset supports pmic pca9451a. For the details, please check the patch commit log. --- Changes in v5: - adjust gpio@22 to the front of pmic@25. Changes in v4: - modify the comment for uSDHC but not i2c. Changes in v3: - modify the dts voltags constraints. - remove unnecessary changes in driver code. - modify commit message. - add tag for dt-bindings. Changes in v2: - drop old part support. Joy Zou (3): regulator: dt-bindings: pca9450: add pca9451a support regulator: pca9450: add pca9451a support arm64: dts: imx93-11x11-evk: add pca9451a support .../regulator/nxp,pca9450-regulator.yaml | 1 + .../boot/dts/freescale/imx93-11x11-evk.dts | 111 ++++++++++ drivers/regulator/pca9450-regulator.c | 194 +++++++++++++++++- include/linux/regulator/pca9450.h | 1 + 4 files changed, 305 insertions(+), 2 deletions(-) -- 2.37.1
2 parents 0c5f77f + 5edeb7d commit cd290ab

File tree

3 files changed

+194
-2
lines changed

3 files changed

+194
-2
lines changed

Documentation/devicetree/bindings/regulator/nxp,pca9450-regulator.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ properties:
2828
- nxp,pca9450a
2929
- nxp,pca9450b
3030
- nxp,pca9450c
31+
- nxp,pca9451a
3132

3233
reg:
3334
maxItems: 1

drivers/regulator/pca9450-regulator.c

Lines changed: 192 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,14 @@ static const struct linear_range pca9450_dvs_buck_volts[] = {
106106
REGULATOR_LINEAR_RANGE(600000, 0x00, 0x7F, 12500),
107107
};
108108

109+
/*
110+
* BUCK1/3
111+
* 0.65 to 2.2375V (12.5mV step)
112+
*/
113+
static const struct linear_range pca9451a_dvs_buck_volts[] = {
114+
REGULATOR_LINEAR_RANGE(650000, 0x00, 0x7F, 12500),
115+
};
116+
109117
/*
110118
* BUCK4/5/6
111119
* 0.6V to 3.4V (25mV step)
@@ -662,6 +670,178 @@ static const struct pca9450_regulator_desc pca9450bc_regulators[] = {
662670
},
663671
};
664672

673+
static const struct pca9450_regulator_desc pca9451a_regulators[] = {
674+
{
675+
.desc = {
676+
.name = "buck1",
677+
.of_match = of_match_ptr("BUCK1"),
678+
.regulators_node = of_match_ptr("regulators"),
679+
.id = PCA9450_BUCK1,
680+
.ops = &pca9450_dvs_buck_regulator_ops,
681+
.type = REGULATOR_VOLTAGE,
682+
.n_voltages = PCA9450_BUCK1_VOLTAGE_NUM,
683+
.linear_ranges = pca9451a_dvs_buck_volts,
684+
.n_linear_ranges = ARRAY_SIZE(pca9451a_dvs_buck_volts),
685+
.vsel_reg = PCA9450_REG_BUCK1OUT_DVS0,
686+
.vsel_mask = BUCK1OUT_DVS0_MASK,
687+
.enable_reg = PCA9450_REG_BUCK1CTRL,
688+
.enable_mask = BUCK1_ENMODE_MASK,
689+
.enable_val = BUCK_ENMODE_ONREQ,
690+
.ramp_mask = BUCK1_RAMP_MASK,
691+
.ramp_delay_table = pca9450_dvs_buck_ramp_table,
692+
.n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
693+
.owner = THIS_MODULE,
694+
.of_parse_cb = pca9450_set_dvs_levels,
695+
},
696+
.dvs = {
697+
.run_reg = PCA9450_REG_BUCK1OUT_DVS0,
698+
.run_mask = BUCK1OUT_DVS0_MASK,
699+
.standby_reg = PCA9450_REG_BUCK1OUT_DVS1,
700+
.standby_mask = BUCK1OUT_DVS1_MASK,
701+
},
702+
},
703+
{
704+
.desc = {
705+
.name = "buck2",
706+
.of_match = of_match_ptr("BUCK2"),
707+
.regulators_node = of_match_ptr("regulators"),
708+
.id = PCA9450_BUCK2,
709+
.ops = &pca9450_dvs_buck_regulator_ops,
710+
.type = REGULATOR_VOLTAGE,
711+
.n_voltages = PCA9450_BUCK2_VOLTAGE_NUM,
712+
.linear_ranges = pca9450_dvs_buck_volts,
713+
.n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
714+
.vsel_reg = PCA9450_REG_BUCK2OUT_DVS0,
715+
.vsel_mask = BUCK2OUT_DVS0_MASK,
716+
.enable_reg = PCA9450_REG_BUCK2CTRL,
717+
.enable_mask = BUCK2_ENMODE_MASK,
718+
.enable_val = BUCK_ENMODE_ONREQ_STBYREQ,
719+
.ramp_mask = BUCK2_RAMP_MASK,
720+
.ramp_delay_table = pca9450_dvs_buck_ramp_table,
721+
.n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
722+
.owner = THIS_MODULE,
723+
.of_parse_cb = pca9450_set_dvs_levels,
724+
},
725+
.dvs = {
726+
.run_reg = PCA9450_REG_BUCK2OUT_DVS0,
727+
.run_mask = BUCK2OUT_DVS0_MASK,
728+
.standby_reg = PCA9450_REG_BUCK2OUT_DVS1,
729+
.standby_mask = BUCK2OUT_DVS1_MASK,
730+
},
731+
},
732+
{
733+
.desc = {
734+
.name = "buck4",
735+
.of_match = of_match_ptr("BUCK4"),
736+
.regulators_node = of_match_ptr("regulators"),
737+
.id = PCA9450_BUCK4,
738+
.ops = &pca9450_buck_regulator_ops,
739+
.type = REGULATOR_VOLTAGE,
740+
.n_voltages = PCA9450_BUCK4_VOLTAGE_NUM,
741+
.linear_ranges = pca9450_buck_volts,
742+
.n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
743+
.vsel_reg = PCA9450_REG_BUCK4OUT,
744+
.vsel_mask = BUCK4OUT_MASK,
745+
.enable_reg = PCA9450_REG_BUCK4CTRL,
746+
.enable_mask = BUCK4_ENMODE_MASK,
747+
.enable_val = BUCK_ENMODE_ONREQ,
748+
.owner = THIS_MODULE,
749+
},
750+
},
751+
{
752+
.desc = {
753+
.name = "buck5",
754+
.of_match = of_match_ptr("BUCK5"),
755+
.regulators_node = of_match_ptr("regulators"),
756+
.id = PCA9450_BUCK5,
757+
.ops = &pca9450_buck_regulator_ops,
758+
.type = REGULATOR_VOLTAGE,
759+
.n_voltages = PCA9450_BUCK5_VOLTAGE_NUM,
760+
.linear_ranges = pca9450_buck_volts,
761+
.n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
762+
.vsel_reg = PCA9450_REG_BUCK5OUT,
763+
.vsel_mask = BUCK5OUT_MASK,
764+
.enable_reg = PCA9450_REG_BUCK5CTRL,
765+
.enable_mask = BUCK5_ENMODE_MASK,
766+
.enable_val = BUCK_ENMODE_ONREQ,
767+
.owner = THIS_MODULE,
768+
},
769+
},
770+
{
771+
.desc = {
772+
.name = "buck6",
773+
.of_match = of_match_ptr("BUCK6"),
774+
.regulators_node = of_match_ptr("regulators"),
775+
.id = PCA9450_BUCK6,
776+
.ops = &pca9450_buck_regulator_ops,
777+
.type = REGULATOR_VOLTAGE,
778+
.n_voltages = PCA9450_BUCK6_VOLTAGE_NUM,
779+
.linear_ranges = pca9450_buck_volts,
780+
.n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
781+
.vsel_reg = PCA9450_REG_BUCK6OUT,
782+
.vsel_mask = BUCK6OUT_MASK,
783+
.enable_reg = PCA9450_REG_BUCK6CTRL,
784+
.enable_mask = BUCK6_ENMODE_MASK,
785+
.enable_val = BUCK_ENMODE_ONREQ,
786+
.owner = THIS_MODULE,
787+
},
788+
},
789+
{
790+
.desc = {
791+
.name = "ldo1",
792+
.of_match = of_match_ptr("LDO1"),
793+
.regulators_node = of_match_ptr("regulators"),
794+
.id = PCA9450_LDO1,
795+
.ops = &pca9450_ldo_regulator_ops,
796+
.type = REGULATOR_VOLTAGE,
797+
.n_voltages = PCA9450_LDO1_VOLTAGE_NUM,
798+
.linear_ranges = pca9450_ldo1_volts,
799+
.n_linear_ranges = ARRAY_SIZE(pca9450_ldo1_volts),
800+
.vsel_reg = PCA9450_REG_LDO1CTRL,
801+
.vsel_mask = LDO1OUT_MASK,
802+
.enable_reg = PCA9450_REG_LDO1CTRL,
803+
.enable_mask = LDO1_EN_MASK,
804+
.owner = THIS_MODULE,
805+
},
806+
},
807+
{
808+
.desc = {
809+
.name = "ldo4",
810+
.of_match = of_match_ptr("LDO4"),
811+
.regulators_node = of_match_ptr("regulators"),
812+
.id = PCA9450_LDO4,
813+
.ops = &pca9450_ldo_regulator_ops,
814+
.type = REGULATOR_VOLTAGE,
815+
.n_voltages = PCA9450_LDO4_VOLTAGE_NUM,
816+
.linear_ranges = pca9450_ldo34_volts,
817+
.n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
818+
.vsel_reg = PCA9450_REG_LDO4CTRL,
819+
.vsel_mask = LDO4OUT_MASK,
820+
.enable_reg = PCA9450_REG_LDO4CTRL,
821+
.enable_mask = LDO4_EN_MASK,
822+
.owner = THIS_MODULE,
823+
},
824+
},
825+
{
826+
.desc = {
827+
.name = "ldo5",
828+
.of_match = of_match_ptr("LDO5"),
829+
.regulators_node = of_match_ptr("regulators"),
830+
.id = PCA9450_LDO5,
831+
.ops = &pca9450_ldo_regulator_ops,
832+
.type = REGULATOR_VOLTAGE,
833+
.n_voltages = PCA9450_LDO5_VOLTAGE_NUM,
834+
.linear_ranges = pca9450_ldo5_volts,
835+
.n_linear_ranges = ARRAY_SIZE(pca9450_ldo5_volts),
836+
.vsel_reg = PCA9450_REG_LDO5CTRL_H,
837+
.vsel_mask = LDO5HOUT_MASK,
838+
.enable_reg = PCA9450_REG_LDO5CTRL_H,
839+
.enable_mask = LDO5H_EN_MASK,
840+
.owner = THIS_MODULE,
841+
},
842+
},
843+
};
844+
665845
static irqreturn_t pca9450_irq_handler(int irq, void *data)
666846
{
667847
struct pca9450 *pca9450 = data;
@@ -729,6 +909,10 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
729909
regulator_desc = pca9450bc_regulators;
730910
pca9450->rcnt = ARRAY_SIZE(pca9450bc_regulators);
731911
break;
912+
case PCA9450_TYPE_PCA9451A:
913+
regulator_desc = pca9451a_regulators;
914+
pca9450->rcnt = ARRAY_SIZE(pca9451a_regulators);
915+
break;
732916
default:
733917
dev_err(&i2c->dev, "Unknown device type");
734918
return -EINVAL;
@@ -755,7 +939,8 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
755939

756940
/* Check your board and dts for match the right pmic */
757941
if (((device_id >> 4) != 0x1 && type == PCA9450_TYPE_PCA9450A) ||
758-
((device_id >> 4) != 0x3 && type == PCA9450_TYPE_PCA9450BC)) {
942+
((device_id >> 4) != 0x3 && type == PCA9450_TYPE_PCA9450BC) ||
943+
((device_id >> 4) != 0x9 && type == PCA9450_TYPE_PCA9451A)) {
759944
dev_err(&i2c->dev, "Device id(%x) mismatched\n",
760945
device_id >> 4);
761946
return -EINVAL;
@@ -846,7 +1031,8 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
8461031
}
8471032

8481033
dev_info(&i2c->dev, "%s probed.\n",
849-
type == PCA9450_TYPE_PCA9450A ? "pca9450a" : "pca9450bc");
1034+
type == PCA9450_TYPE_PCA9450A ? "pca9450a" :
1035+
(type == PCA9450_TYPE_PCA9451A ? "pca9451a" : "pca9450bc"));
8501036

8511037
return 0;
8521038
}
@@ -864,6 +1050,10 @@ static const struct of_device_id pca9450_of_match[] = {
8641050
.compatible = "nxp,pca9450c",
8651051
.data = (void *)PCA9450_TYPE_PCA9450BC,
8661052
},
1053+
{
1054+
.compatible = "nxp,pca9451a",
1055+
.data = (void *)PCA9450_TYPE_PCA9451A,
1056+
},
8671057
{ }
8681058
};
8691059
MODULE_DEVICE_TABLE(of, pca9450_of_match);

include/linux/regulator/pca9450.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
enum pca9450_chip_type {
1010
PCA9450_TYPE_PCA9450A = 0,
1111
PCA9450_TYPE_PCA9450BC,
12+
PCA9450_TYPE_PCA9451A,
1213
PCA9450_TYPE_AMOUNT,
1314
};
1415

0 commit comments

Comments
 (0)