@@ -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+
665845static 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};
8691059MODULE_DEVICE_TABLE (of , pca9450_of_match );
0 commit comments