@@ -106,6 +106,14 @@ static const struct linear_range pca9450_dvs_buck_volts[] = {
106
106
REGULATOR_LINEAR_RANGE (600000 , 0x00 , 0x7F , 12500 ),
107
107
};
108
108
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
+
109
117
/*
110
118
* BUCK4/5/6
111
119
* 0.6V to 3.4V (25mV step)
@@ -662,6 +670,178 @@ static const struct pca9450_regulator_desc pca9450bc_regulators[] = {
662
670
},
663
671
};
664
672
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
+
665
845
static irqreturn_t pca9450_irq_handler (int irq , void * data )
666
846
{
667
847
struct pca9450 * pca9450 = data ;
@@ -729,6 +909,10 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
729
909
regulator_desc = pca9450bc_regulators ;
730
910
pca9450 -> rcnt = ARRAY_SIZE (pca9450bc_regulators );
731
911
break ;
912
+ case PCA9450_TYPE_PCA9451A :
913
+ regulator_desc = pca9451a_regulators ;
914
+ pca9450 -> rcnt = ARRAY_SIZE (pca9451a_regulators );
915
+ break ;
732
916
default :
733
917
dev_err (& i2c -> dev , "Unknown device type" );
734
918
return - EINVAL ;
@@ -755,7 +939,8 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
755
939
756
940
/* Check your board and dts for match the right pmic */
757
941
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 )) {
759
944
dev_err (& i2c -> dev , "Device id(%x) mismatched\n" ,
760
945
device_id >> 4 );
761
946
return - EINVAL ;
@@ -846,7 +1031,8 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
846
1031
}
847
1032
848
1033
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" ));
850
1036
851
1037
return 0 ;
852
1038
}
@@ -864,6 +1050,10 @@ static const struct of_device_id pca9450_of_match[] = {
864
1050
.compatible = "nxp,pca9450c" ,
865
1051
.data = (void * )PCA9450_TYPE_PCA9450BC ,
866
1052
},
1053
+ {
1054
+ .compatible = "nxp,pca9451a" ,
1055
+ .data = (void * )PCA9450_TYPE_PCA9451A ,
1056
+ },
867
1057
{ }
868
1058
};
869
1059
MODULE_DEVICE_TABLE (of , pca9450_of_match );
0 commit comments