Skip to content

Commit c5187a2

Browse files
Adam Wardbroonie
authored andcommitted
regulator: da9121: Add DA914x support
Add the DA9141 and DA9142 regulators device recognition data and operational parameters. Signed-off-by: Adam Ward <[email protected]> Link: https://lore.kernel.org/r/5f5b9b02f07578cd36c6bc266349a56efc9b08d1.1638223185.git.Adam.Ward.opensource@diasemi.com Signed-off-by: Mark Brown <[email protected]>
1 parent 24f0853 commit c5187a2

File tree

2 files changed

+124
-5
lines changed

2 files changed

+124
-5
lines changed

drivers/regulator/da9121-regulator.c

Lines changed: 105 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,22 @@ static struct da9121_range da9121_3A_1phase_current = {
8686
.reg_max = 6,
8787
};
8888

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+
89105
struct da9121_variant_info {
90106
int num_bucks;
91107
int num_phases;
@@ -97,6 +113,8 @@ static const struct da9121_variant_info variant_parameters[] = {
97113
{ 2, 1, &da9121_3A_1phase_current }, //DA9121_TYPE_DA9220_DA9132
98114
{ 2, 1, &da9121_5A_1phase_current }, //DA9121_TYPE_DA9122_DA9131
99115
{ 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
100118
};
101119

102120
struct da9121_field {
@@ -542,11 +560,65 @@ static const struct regulator_desc da9217_reg = {
542560
.vsel_mask = DA9121_MASK_BUCK_BUCKx_5_CHx_A_VOUT,
543561
};
544562

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+
545615
static const struct regulator_desc *local_da9121_regulators[][DA9121_IDX_MAX] = {
546616
[DA9121_TYPE_DA9121_DA9130] = { &da9121_reg, NULL },
547617
[DA9121_TYPE_DA9220_DA9132] = { &da9220_reg[0], &da9220_reg[1] },
548618
[DA9121_TYPE_DA9122_DA9131] = { &da9122_reg[0], &da9122_reg[1] },
549619
[DA9121_TYPE_DA9217] = { &da9217_reg, NULL },
620+
[DA9121_TYPE_DA9141] = { &da9141_reg, NULL },
621+
[DA9121_TYPE_DA9142] = { &da9142_reg, NULL },
550622
};
551623

552624
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)
840912
goto error;
841913
}
842914

843-
if (device_id != DA9121_DEVICE_ID) {
915+
if ((device_id != DA9121_DEVICE_ID) && (device_id != DA914x_DEVICE_ID)) {
844916
dev_err(chip->dev, "Invalid device ID: 0x%02x\n", device_id);
845917
ret = -ENODEV;
846918
goto error;
@@ -882,6 +954,22 @@ static int da9121_check_device_type(struct i2c_client *i2c, struct da9121 *chip)
882954
break;
883955
}
884956

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+
885973
dev_info(chip->dev,
886974
"Device detected (device-ID: 0x%02X, var-ID: 0x%02X, %s)\n",
887975
device_id, variant_id, type);
@@ -895,8 +983,10 @@ static int da9121_check_device_type(struct i2c_client *i2c, struct da9121 *chip)
895983
variant_mrc = (variant_id & DA9121_MASK_OTP_VARIANT_ID_MRC)
896984
>> DA9121_SHIFT_OTP_VARIANT_ID_MRC;
897985

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))) {
900990
dev_err(chip->dev,
901991
"Cannot support variant MRC: 0x%02X\n", variant_mrc);
902992
ret = -EINVAL;
@@ -936,6 +1026,14 @@ static int da9121_assign_chip_model(struct i2c_client *i2c,
9361026
chip->variant_id = DA9121_TYPE_DA9220_DA9132;
9371027
regmap = &da9121_2ch_regmap_config;
9381028
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;
9391037
}
9401038

9411039
/* 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[] = {
10151113
{ .compatible = "dlg,da9131", .data = (void *) DA9121_SUBTYPE_DA9131 },
10161114
{ .compatible = "dlg,da9220", .data = (void *) DA9121_SUBTYPE_DA9220 },
10171115
{ .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 },
10181118
{ }
10191119
};
10201120
MODULE_DEVICE_TABLE(of, da9121_dt_ids);
@@ -1089,6 +1189,8 @@ static const struct i2c_device_id da9121_i2c_id[] = {
10891189
{"da9131", DA9121_TYPE_DA9122_DA9131},
10901190
{"da9220", DA9121_TYPE_DA9220_DA9132},
10911191
{"da9132", DA9121_TYPE_DA9220_DA9132},
1192+
{"da9141", DA9121_TYPE_DA9141},
1193+
{"da9142", DA9121_TYPE_DA9142},
10921194
{},
10931195
};
10941196
MODULE_DEVICE_TABLE(i2c, da9121_i2c_id);

drivers/regulator/da9121-regulator.h

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ enum da9121_variant {
2626
DA9121_TYPE_DA9121_DA9130,
2727
DA9121_TYPE_DA9220_DA9132,
2828
DA9121_TYPE_DA9122_DA9131,
29-
DA9121_TYPE_DA9217
29+
DA9121_TYPE_DA9217,
30+
DA9121_TYPE_DA9141,
31+
DA9121_TYPE_DA9142
3032
};
3133

3234
enum da9121_subvariant {
@@ -36,7 +38,9 @@ enum da9121_subvariant {
3638
DA9121_SUBTYPE_DA9132,
3739
DA9121_SUBTYPE_DA9122,
3840
DA9121_SUBTYPE_DA9131,
39-
DA9121_SUBTYPE_DA9217
41+
DA9121_SUBTYPE_DA9217,
42+
DA9121_SUBTYPE_DA9141,
43+
DA9121_SUBTYPE_DA9142
4044
};
4145

4246
/* Minimum, maximum and default polling millisecond periods are provided
@@ -70,6 +74,14 @@ enum da9121_subvariant {
7074
#define DA9121_REG_SYS_GPIO1_1 0x13
7175
#define DA9121_REG_SYS_GPIO2_0 0x14
7276
#define DA9121_REG_SYS_GPIO2_1 0x15
77+
#define DA914x_REG_SYS_GPIO3_0 0x16
78+
#define DA914x_REG_SYS_GPIO3_1 0x17
79+
#define DA914x_REG_SYS_GPIO4_0 0x18
80+
#define DA914x_REG_SYS_GPIO4_1 0x19
81+
#define DA914x_REG_SYS_ADMUX1_0 0x1A
82+
#define DA914x_REG_SYS_ADMUX1_1 0x1B
83+
#define DA914x_REG_SYS_ADMUX2_0 0x1C
84+
#define DA914x_REG_SYS_ADMUX2_1 0x1D
7385
#define DA9121_REG_BUCK_BUCK1_0 0x20
7486
#define DA9121_REG_BUCK_BUCK1_1 0x21
7587
#define DA9121_REG_BUCK_BUCK1_2 0x22
@@ -276,6 +288,7 @@ enum da9121_subvariant {
276288
#define DA9121_MASK_OTP_DEVICE_ID_DEV_ID 0xFF
277289

278290
#define DA9121_DEVICE_ID 0x05
291+
#define DA914x_DEVICE_ID 0x26
279292

280293
/* DA9121_REG_OTP_VARIANT_ID */
281294

@@ -293,6 +306,10 @@ enum da9121_subvariant {
293306
#define DA9131_VARIANT_VRC 0x1
294307
#define DA9132_VARIANT_VRC 0x2
295308

309+
#define DA914x_VARIANT_MRC_BASE 0x0
310+
#define DA9141_VARIANT_VRC 0x1
311+
#define DA9142_VARIANT_VRC 0x2
312+
296313
/* DA9121_REG_OTP_CUSTOMER_ID */
297314

298315
#define DA9121_MASK_OTP_CUSTOMER_ID_CUST_ID 0xFF

0 commit comments

Comments
 (0)