@@ -86,6 +86,22 @@ static struct da9121_range da9121_3A_1phase_current = {
86
86
.reg_max = 6 ,
87
87
};
88
88
89
+ static struct da9121_range da914x_40A_4phase_current = {
90
+ .val_min = 14000000 ,
91
+ .val_max = 80000000 ,
92
+ .val_stp = 2000000 ,
93
+ .reg_min = 1 ,
94
+ .reg_max = 14 ,
95
+ };
96
+
97
+ static struct da9121_range da914x_20A_2phase_current = {
98
+ .val_min = 7000000 ,
99
+ .val_max = 40000000 ,
100
+ .val_stp = 2000000 ,
101
+ .reg_min = 1 ,
102
+ .reg_max = 14 ,
103
+ };
104
+
89
105
struct da9121_variant_info {
90
106
int num_bucks ;
91
107
int num_phases ;
@@ -97,6 +113,8 @@ static const struct da9121_variant_info variant_parameters[] = {
97
113
{ 2 , 1 , & da9121_3A_1phase_current }, //DA9121_TYPE_DA9220_DA9132
98
114
{ 2 , 1 , & da9121_5A_1phase_current }, //DA9121_TYPE_DA9122_DA9131
99
115
{ 1 , 2 , & da9121_6A_2phase_current }, //DA9121_TYPE_DA9217
116
+ { 1 , 4 , & da914x_40A_4phase_current }, //DA9121_TYPE_DA9141
117
+ { 1 , 2 , & da914x_20A_2phase_current }, //DA9121_TYPE_DA9142
100
118
};
101
119
102
120
struct da9121_field {
@@ -542,11 +560,65 @@ static const struct regulator_desc da9217_reg = {
542
560
.vsel_mask = DA9121_MASK_BUCK_BUCKx_5_CHx_A_VOUT ,
543
561
};
544
562
563
+ #define DA914X_MIN_MV 500
564
+ #define DA914X_MAX_MV 1000
565
+ #define DA914X_STEP_MV 10
566
+ #define DA914X_MIN_SEL (DA914X_MIN_MV / DA914X_STEP_MV)
567
+ #define DA914X_N_VOLTAGES (((DA914X_MAX_MV - DA914X_MIN_MV) / DA914X_STEP_MV) \
568
+ + 1 + DA914X_MIN_SEL)
569
+
570
+ static const struct regulator_desc da9141_reg = {
571
+ .id = DA9121_IDX_BUCK1 ,
572
+ .name = "DA9141" ,
573
+ .of_match = "buck1" ,
574
+ .of_parse_cb = da9121_of_parse_cb ,
575
+ .owner = THIS_MODULE ,
576
+ .regulators_node = of_match_ptr ("regulators" ),
577
+ .of_map_mode = da9121_map_mode ,
578
+ .ops = & da9121_buck_ops ,
579
+ .type = REGULATOR_VOLTAGE ,
580
+ .n_voltages = DA914X_N_VOLTAGES ,
581
+ .min_uV = DA914X_MIN_MV * 1000 ,
582
+ .uV_step = DA914X_STEP_MV * 1000 ,
583
+ .linear_min_sel = DA914X_MIN_SEL ,
584
+ .vsel_reg = DA9121_REG_BUCK_BUCK1_5 ,
585
+ .vsel_mask = DA9121_MASK_BUCK_BUCKx_5_CHx_A_VOUT ,
586
+ .enable_reg = DA9121_REG_BUCK_BUCK1_0 ,
587
+ .enable_mask = DA9121_MASK_BUCK_BUCKx_0_CHx_EN ,
588
+ /* Default value of BUCK_BUCK1_0.CH1_SRC_DVC_UP */
589
+ .ramp_delay = 20000 ,
590
+ /* tBUCK_EN */
591
+ .enable_time = 20 ,
592
+ };
593
+
594
+ static const struct regulator_desc da9142_reg = {
595
+ .id = DA9121_IDX_BUCK1 ,
596
+ .name = "DA9142 BUCK1" ,
597
+ .of_match = "buck1" ,
598
+ .of_parse_cb = da9121_of_parse_cb ,
599
+ .owner = THIS_MODULE ,
600
+ .regulators_node = of_match_ptr ("regulators" ),
601
+ .of_map_mode = da9121_map_mode ,
602
+ .ops = & da9121_buck_ops ,
603
+ .type = REGULATOR_VOLTAGE ,
604
+ .n_voltages = DA914X_N_VOLTAGES ,
605
+ .min_uV = DA914X_MIN_MV * 1000 ,
606
+ .uV_step = DA914X_STEP_MV * 1000 ,
607
+ .linear_min_sel = DA914X_MIN_SEL ,
608
+ .enable_reg = DA9121_REG_BUCK_BUCK1_0 ,
609
+ .enable_mask = DA9121_MASK_BUCK_BUCKx_0_CHx_EN ,
610
+ .vsel_reg = DA9121_REG_BUCK_BUCK1_5 ,
611
+ .vsel_mask = DA9121_MASK_BUCK_BUCKx_5_CHx_A_VOUT ,
612
+ };
613
+
614
+
545
615
static const struct regulator_desc * local_da9121_regulators [][DA9121_IDX_MAX ] = {
546
616
[DA9121_TYPE_DA9121_DA9130 ] = { & da9121_reg , NULL },
547
617
[DA9121_TYPE_DA9220_DA9132 ] = { & da9220_reg [0 ], & da9220_reg [1 ] },
548
618
[DA9121_TYPE_DA9122_DA9131 ] = { & da9122_reg [0 ], & da9122_reg [1 ] },
549
619
[DA9121_TYPE_DA9217 ] = { & da9217_reg , NULL },
620
+ [DA9121_TYPE_DA9141 ] = { & da9141_reg , NULL },
621
+ [DA9121_TYPE_DA9142 ] = { & da9142_reg , NULL },
550
622
};
551
623
552
624
static void da9121_status_poll_on (struct work_struct * work )
@@ -840,7 +912,7 @@ static int da9121_check_device_type(struct i2c_client *i2c, struct da9121 *chip)
840
912
goto error ;
841
913
}
842
914
843
- if (device_id != DA9121_DEVICE_ID ) {
915
+ if (( device_id != DA9121_DEVICE_ID ) && ( device_id != DA914x_DEVICE_ID ) ) {
844
916
dev_err (chip -> dev , "Invalid device ID: 0x%02x\n" , device_id );
845
917
ret = - ENODEV ;
846
918
goto error ;
@@ -882,6 +954,22 @@ static int da9121_check_device_type(struct i2c_client *i2c, struct da9121 *chip)
882
954
break ;
883
955
}
884
956
957
+ if (device_id == DA914x_DEVICE_ID ) {
958
+ switch (chip -> subvariant_id ) {
959
+ case DA9121_SUBTYPE_DA9141 :
960
+ type = "DA9141" ;
961
+ config_match = (variant_vrc == DA9141_VARIANT_VRC );
962
+ break ;
963
+ case DA9121_SUBTYPE_DA9142 :
964
+ type = "DA9142" ;
965
+ config_match = (variant_vrc == DA9142_VARIANT_VRC );
966
+ break ;
967
+ default :
968
+ type = "Unknown" ;
969
+ break ;
970
+ }
971
+ }
972
+
885
973
dev_info (chip -> dev ,
886
974
"Device detected (device-ID: 0x%02X, var-ID: 0x%02X, %s)\n" ,
887
975
device_id , variant_id , type );
@@ -895,8 +983,10 @@ static int da9121_check_device_type(struct i2c_client *i2c, struct da9121 *chip)
895
983
variant_mrc = (variant_id & DA9121_MASK_OTP_VARIANT_ID_MRC )
896
984
>> DA9121_SHIFT_OTP_VARIANT_ID_MRC ;
897
985
898
- if ((device_id == DA9121_DEVICE_ID ) &&
899
- (variant_mrc < DA9121_VARIANT_MRC_BASE )) {
986
+ if (((device_id == DA9121_DEVICE_ID ) &&
987
+ (variant_mrc < DA9121_VARIANT_MRC_BASE )) ||
988
+ ((device_id == DA914x_DEVICE_ID ) &&
989
+ (variant_mrc != DA914x_VARIANT_MRC_BASE ))) {
900
990
dev_err (chip -> dev ,
901
991
"Cannot support variant MRC: 0x%02X\n" , variant_mrc );
902
992
ret = - EINVAL ;
@@ -936,6 +1026,14 @@ static int da9121_assign_chip_model(struct i2c_client *i2c,
936
1026
chip -> variant_id = DA9121_TYPE_DA9220_DA9132 ;
937
1027
regmap = & da9121_2ch_regmap_config ;
938
1028
break ;
1029
+ case DA9121_SUBTYPE_DA9141 :
1030
+ chip -> variant_id = DA9121_TYPE_DA9141 ;
1031
+ regmap = & da9121_1ch_regmap_config ;
1032
+ break ;
1033
+ case DA9121_SUBTYPE_DA9142 :
1034
+ chip -> variant_id = DA9121_TYPE_DA9142 ;
1035
+ regmap = & da9121_2ch_regmap_config ;
1036
+ break ;
939
1037
}
940
1038
941
1039
/* Set these up for of_regulator_match call which may want .of_map_modes */
@@ -1015,6 +1113,8 @@ static const struct of_device_id da9121_dt_ids[] = {
1015
1113
{ .compatible = "dlg,da9131" , .data = (void * ) DA9121_SUBTYPE_DA9131 },
1016
1114
{ .compatible = "dlg,da9220" , .data = (void * ) DA9121_SUBTYPE_DA9220 },
1017
1115
{ .compatible = "dlg,da9132" , .data = (void * ) DA9121_SUBTYPE_DA9132 },
1116
+ { .compatible = "dlg,da9141" , .data = (void * ) DA9121_SUBTYPE_DA9141 },
1117
+ { .compatible = "dlg,da9142" , .data = (void * ) DA9121_SUBTYPE_DA9142 },
1018
1118
{ }
1019
1119
};
1020
1120
MODULE_DEVICE_TABLE (of , da9121_dt_ids );
@@ -1089,6 +1189,8 @@ static const struct i2c_device_id da9121_i2c_id[] = {
1089
1189
{"da9131" , DA9121_TYPE_DA9122_DA9131 },
1090
1190
{"da9220" , DA9121_TYPE_DA9220_DA9132 },
1091
1191
{"da9132" , DA9121_TYPE_DA9220_DA9132 },
1192
+ {"da9141" , DA9121_TYPE_DA9141 },
1193
+ {"da9142" , DA9121_TYPE_DA9142 },
1092
1194
{},
1093
1195
};
1094
1196
MODULE_DEVICE_TABLE (i2c , da9121_i2c_id );
0 commit comments