Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

regulator: da9121: Add DA914x support

Add the DA9141 and DA9142 regulators device recognition data and
operational parameters.

Signed-off-by: Adam Ward <Adam.Ward.opensource@diasemi.com>
Link: https://lore.kernel.org/r/5f5b9b02f07578cd36c6bc266349a56efc9b08d1.1638223185.git.Adam.Ward.opensource@diasemi.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Adam Ward and committed by
Mark Brown
c5187a24 24f08532

+124 -5
+105 -3
drivers/regulator/da9121-regulator.c
··· 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; ··· 113 97 { 2, 1, &da9121_3A_1phase_current }, //DA9121_TYPE_DA9220_DA9132 114 98 { 2, 1, &da9121_5A_1phase_current }, //DA9121_TYPE_DA9122_DA9131 115 99 { 1, 2, &da9121_6A_2phase_current }, //DA9121_TYPE_DA9217 100 + { 1, 4, &da914x_40A_4phase_current }, //DA9121_TYPE_DA9141 101 + { 1, 2, &da914x_20A_2phase_current }, //DA9121_TYPE_DA9142 116 102 }; 117 103 118 104 struct da9121_field { ··· 560 542 .vsel_mask = DA9121_MASK_BUCK_BUCKx_5_CHx_A_VOUT, 561 543 }; 562 544 545 + #define DA914X_MIN_MV 500 546 + #define DA914X_MAX_MV 1000 547 + #define DA914X_STEP_MV 10 548 + #define DA914X_MIN_SEL (DA914X_MIN_MV / DA914X_STEP_MV) 549 + #define DA914X_N_VOLTAGES (((DA914X_MAX_MV - DA914X_MIN_MV) / DA914X_STEP_MV) \ 550 + + 1 + DA914X_MIN_SEL) 551 + 552 + static const struct regulator_desc da9141_reg = { 553 + .id = DA9121_IDX_BUCK1, 554 + .name = "DA9141", 555 + .of_match = "buck1", 556 + .of_parse_cb = da9121_of_parse_cb, 557 + .owner = THIS_MODULE, 558 + .regulators_node = of_match_ptr("regulators"), 559 + .of_map_mode = da9121_map_mode, 560 + .ops = &da9121_buck_ops, 561 + .type = REGULATOR_VOLTAGE, 562 + .n_voltages = DA914X_N_VOLTAGES, 563 + .min_uV = DA914X_MIN_MV * 1000, 564 + .uV_step = DA914X_STEP_MV * 1000, 565 + .linear_min_sel = DA914X_MIN_SEL, 566 + .vsel_reg = DA9121_REG_BUCK_BUCK1_5, 567 + .vsel_mask = DA9121_MASK_BUCK_BUCKx_5_CHx_A_VOUT, 568 + .enable_reg = DA9121_REG_BUCK_BUCK1_0, 569 + .enable_mask = DA9121_MASK_BUCK_BUCKx_0_CHx_EN, 570 + /* Default value of BUCK_BUCK1_0.CH1_SRC_DVC_UP */ 571 + .ramp_delay = 20000, 572 + /* tBUCK_EN */ 573 + .enable_time = 20, 574 + }; 575 + 576 + static const struct regulator_desc da9142_reg = { 577 + .id = DA9121_IDX_BUCK1, 578 + .name = "DA9142 BUCK1", 579 + .of_match = "buck1", 580 + .of_parse_cb = da9121_of_parse_cb, 581 + .owner = THIS_MODULE, 582 + .regulators_node = of_match_ptr("regulators"), 583 + .of_map_mode = da9121_map_mode, 584 + .ops = &da9121_buck_ops, 585 + .type = REGULATOR_VOLTAGE, 586 + .n_voltages = DA914X_N_VOLTAGES, 587 + .min_uV = DA914X_MIN_MV * 1000, 588 + .uV_step = DA914X_STEP_MV * 1000, 589 + .linear_min_sel = DA914X_MIN_SEL, 590 + .enable_reg = DA9121_REG_BUCK_BUCK1_0, 591 + .enable_mask = DA9121_MASK_BUCK_BUCKx_0_CHx_EN, 592 + .vsel_reg = DA9121_REG_BUCK_BUCK1_5, 593 + .vsel_mask = DA9121_MASK_BUCK_BUCKx_5_CHx_A_VOUT, 594 + }; 595 + 596 + 563 597 static const struct regulator_desc *local_da9121_regulators[][DA9121_IDX_MAX] = { 564 598 [DA9121_TYPE_DA9121_DA9130] = { &da9121_reg, NULL }, 565 599 [DA9121_TYPE_DA9220_DA9132] = { &da9220_reg[0], &da9220_reg[1] }, 566 600 [DA9121_TYPE_DA9122_DA9131] = { &da9122_reg[0], &da9122_reg[1] }, 567 601 [DA9121_TYPE_DA9217] = { &da9217_reg, NULL }, 602 + [DA9121_TYPE_DA9141] = { &da9141_reg, NULL }, 603 + [DA9121_TYPE_DA9142] = { &da9142_reg, NULL }, 568 604 }; 569 605 570 606 static void da9121_status_poll_on(struct work_struct *work) ··· 912 840 goto error; 913 841 } 914 842 915 - if (device_id != DA9121_DEVICE_ID) { 843 + if ((device_id != DA9121_DEVICE_ID) && (device_id != DA914x_DEVICE_ID)) { 916 844 dev_err(chip->dev, "Invalid device ID: 0x%02x\n", device_id); 917 845 ret = -ENODEV; 918 846 goto error; ··· 954 882 break; 955 883 } 956 884 885 + if (device_id == DA914x_DEVICE_ID) { 886 + switch (chip->subvariant_id) { 887 + case DA9121_SUBTYPE_DA9141: 888 + type = "DA9141"; 889 + config_match = (variant_vrc == DA9141_VARIANT_VRC); 890 + break; 891 + case DA9121_SUBTYPE_DA9142: 892 + type = "DA9142"; 893 + config_match = (variant_vrc == DA9142_VARIANT_VRC); 894 + break; 895 + default: 896 + type = "Unknown"; 897 + break; 898 + } 899 + } 900 + 957 901 dev_info(chip->dev, 958 902 "Device detected (device-ID: 0x%02X, var-ID: 0x%02X, %s)\n", 959 903 device_id, variant_id, type); ··· 983 895 variant_mrc = (variant_id & DA9121_MASK_OTP_VARIANT_ID_MRC) 984 896 >> DA9121_SHIFT_OTP_VARIANT_ID_MRC; 985 897 986 - if ((device_id == DA9121_DEVICE_ID) && 987 - (variant_mrc < DA9121_VARIANT_MRC_BASE)) { 898 + if (((device_id == DA9121_DEVICE_ID) && 899 + (variant_mrc < DA9121_VARIANT_MRC_BASE)) || 900 + ((device_id == DA914x_DEVICE_ID) && 901 + (variant_mrc != DA914x_VARIANT_MRC_BASE))) { 988 902 dev_err(chip->dev, 989 903 "Cannot support variant MRC: 0x%02X\n", variant_mrc); 990 904 ret = -EINVAL; ··· 1024 934 case DA9121_SUBTYPE_DA9220: 1025 935 case DA9121_SUBTYPE_DA9132: 1026 936 chip->variant_id = DA9121_TYPE_DA9220_DA9132; 937 + regmap = &da9121_2ch_regmap_config; 938 + break; 939 + case DA9121_SUBTYPE_DA9141: 940 + chip->variant_id = DA9121_TYPE_DA9141; 941 + regmap = &da9121_1ch_regmap_config; 942 + break; 943 + case DA9121_SUBTYPE_DA9142: 944 + chip->variant_id = DA9121_TYPE_DA9142; 1027 945 regmap = &da9121_2ch_regmap_config; 1028 946 break; 1029 947 } ··· 1113 1015 { .compatible = "dlg,da9131", .data = (void *) DA9121_SUBTYPE_DA9131 }, 1114 1016 { .compatible = "dlg,da9220", .data = (void *) DA9121_SUBTYPE_DA9220 }, 1115 1017 { .compatible = "dlg,da9132", .data = (void *) DA9121_SUBTYPE_DA9132 }, 1018 + { .compatible = "dlg,da9141", .data = (void *) DA9121_SUBTYPE_DA9141 }, 1019 + { .compatible = "dlg,da9142", .data = (void *) DA9121_SUBTYPE_DA9142 }, 1116 1020 { } 1117 1021 }; 1118 1022 MODULE_DEVICE_TABLE(of, da9121_dt_ids); ··· 1189 1089 {"da9131", DA9121_TYPE_DA9122_DA9131}, 1190 1090 {"da9220", DA9121_TYPE_DA9220_DA9132}, 1191 1091 {"da9132", DA9121_TYPE_DA9220_DA9132}, 1092 + {"da9141", DA9121_TYPE_DA9141}, 1093 + {"da9142", DA9121_TYPE_DA9142}, 1192 1094 {}, 1193 1095 }; 1194 1096 MODULE_DEVICE_TABLE(i2c, da9121_i2c_id);
+19 -2
drivers/regulator/da9121-regulator.h
··· 26 26 DA9121_TYPE_DA9121_DA9130, 27 27 DA9121_TYPE_DA9220_DA9132, 28 28 DA9121_TYPE_DA9122_DA9131, 29 - DA9121_TYPE_DA9217 29 + DA9121_TYPE_DA9217, 30 + DA9121_TYPE_DA9141, 31 + DA9121_TYPE_DA9142 30 32 }; 31 33 32 34 enum da9121_subvariant { ··· 38 36 DA9121_SUBTYPE_DA9132, 39 37 DA9121_SUBTYPE_DA9122, 40 38 DA9121_SUBTYPE_DA9131, 41 - DA9121_SUBTYPE_DA9217 39 + DA9121_SUBTYPE_DA9217, 40 + DA9121_SUBTYPE_DA9141, 41 + DA9121_SUBTYPE_DA9142 42 42 }; 43 43 44 44 /* Minimum, maximum and default polling millisecond periods are provided ··· 74 70 #define DA9121_REG_SYS_GPIO1_1 0x13 75 71 #define DA9121_REG_SYS_GPIO2_0 0x14 76 72 #define DA9121_REG_SYS_GPIO2_1 0x15 73 + #define DA914x_REG_SYS_GPIO3_0 0x16 74 + #define DA914x_REG_SYS_GPIO3_1 0x17 75 + #define DA914x_REG_SYS_GPIO4_0 0x18 76 + #define DA914x_REG_SYS_GPIO4_1 0x19 77 + #define DA914x_REG_SYS_ADMUX1_0 0x1A 78 + #define DA914x_REG_SYS_ADMUX1_1 0x1B 79 + #define DA914x_REG_SYS_ADMUX2_0 0x1C 80 + #define DA914x_REG_SYS_ADMUX2_1 0x1D 77 81 #define DA9121_REG_BUCK_BUCK1_0 0x20 78 82 #define DA9121_REG_BUCK_BUCK1_1 0x21 79 83 #define DA9121_REG_BUCK_BUCK1_2 0x22 ··· 288 276 #define DA9121_MASK_OTP_DEVICE_ID_DEV_ID 0xFF 289 277 290 278 #define DA9121_DEVICE_ID 0x05 279 + #define DA914x_DEVICE_ID 0x26 291 280 292 281 /* DA9121_REG_OTP_VARIANT_ID */ 293 282 ··· 305 292 #define DA9130_VARIANT_VRC 0x0 306 293 #define DA9131_VARIANT_VRC 0x1 307 294 #define DA9132_VARIANT_VRC 0x2 295 + 296 + #define DA914x_VARIANT_MRC_BASE 0x0 297 + #define DA9141_VARIANT_VRC 0x1 298 + #define DA9142_VARIANT_VRC 0x2 308 299 309 300 /* DA9121_REG_OTP_CUSTOMER_ID */ 310 301