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

regulator: s2mps11: Add support for S2MPU05 regulators

S2MPU05 is a PMIC by manufactured by Samsung, particularly used in
Exynos7870 based devices. Add driver support for controlling its 21 LDO
and 5 BUCK regulators.

Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
Acked-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Link: https://lore.kernel.org/r/20250301-exynos7870-pmic-regulators-v3-3-808d0b47a564@disroot.org
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

Kaustabh Chakraborty and committed by
Lee Jones
169cd52f ed33479b

+93 -3
+2 -2
drivers/regulator/Kconfig
··· 1330 1330 via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs. 1331 1331 1332 1332 config REGULATOR_S2MPS11 1333 - tristate "Samsung S2MPS11/13/14/15/S2MPU02 voltage regulator" 1333 + tristate "Samsung S2MPS11/13/14/15/S2MPU02/05 voltage regulator" 1334 1334 depends on MFD_SEC_CORE || COMPILE_TEST 1335 1335 help 1336 - This driver supports a Samsung S2MPS11/13/14/15/S2MPU02 voltage 1336 + This driver supports a Samsung S2MPS11/13/14/15/S2MPU02/05 voltage 1337 1337 output regulator via I2C bus. The chip is comprised of high efficient 1338 1338 Buck converters including Dual-Phase Buck converter, Buck-Boost 1339 1339 converter, various LDOs.
+91 -1
drivers/regulator/s2mps11.c
··· 21 21 #include <linux/mfd/samsung/s2mps14.h> 22 22 #include <linux/mfd/samsung/s2mps15.h> 23 23 #include <linux/mfd/samsung/s2mpu02.h> 24 + #include <linux/mfd/samsung/s2mpu05.h> 24 25 25 26 /* The highest number of possible regulators for supported devices. */ 26 27 #define S2MPS_REGULATOR_MAX S2MPS13_REGULATOR_MAX ··· 254 253 val = S2MPU02_ENABLE_SUSPEND; 255 254 else 256 255 val = rdev->desc->enable_mask; 256 + break; 257 + case S2MPU05: 258 + val = rdev->desc->enable_mask; 257 259 break; 258 260 default: 259 261 return -EINVAL; ··· 1122 1118 regulator_desc_s2mpu02_buck7(7), 1123 1119 }; 1124 1120 1121 + #define regulator_desc_s2mpu05_ldo_reg(num, min, step, reg) { \ 1122 + .name = "ldo"#num, \ 1123 + .id = S2MPU05_LDO##num, \ 1124 + .ops = &s2mpu02_ldo_ops, \ 1125 + .type = REGULATOR_VOLTAGE, \ 1126 + .owner = THIS_MODULE, \ 1127 + .min_uV = min, \ 1128 + .uV_step = step, \ 1129 + .n_voltages = S2MPU05_LDO_N_VOLTAGES, \ 1130 + .vsel_reg = reg, \ 1131 + .vsel_mask = S2MPU05_LDO_VSEL_MASK, \ 1132 + .enable_reg = reg, \ 1133 + .enable_mask = S2MPU05_ENABLE_MASK, \ 1134 + .enable_time = S2MPU05_ENABLE_TIME_LDO \ 1135 + } 1136 + 1137 + #define regulator_desc_s2mpu05_ldo(num, reg, min, step) \ 1138 + regulator_desc_s2mpu05_ldo_reg(num, min, step, S2MPU05_REG_L##num##reg) 1139 + 1140 + #define regulator_desc_s2mpu05_ldo1(num, reg) \ 1141 + regulator_desc_s2mpu05_ldo(num, reg, S2MPU05_LDO_MIN1, S2MPU05_LDO_STEP1) 1142 + 1143 + #define regulator_desc_s2mpu05_ldo2(num, reg) \ 1144 + regulator_desc_s2mpu05_ldo(num, reg, S2MPU05_LDO_MIN1, S2MPU05_LDO_STEP2) 1145 + 1146 + #define regulator_desc_s2mpu05_ldo3(num, reg) \ 1147 + regulator_desc_s2mpu05_ldo(num, reg, S2MPU05_LDO_MIN2, S2MPU05_LDO_STEP2) 1148 + 1149 + #define regulator_desc_s2mpu05_ldo4(num, reg) \ 1150 + regulator_desc_s2mpu05_ldo(num, reg, S2MPU05_LDO_MIN3, S2MPU05_LDO_STEP2) 1151 + 1152 + #define regulator_desc_s2mpu05_buck(num, which) { \ 1153 + .name = "buck"#num, \ 1154 + .id = S2MPU05_BUCK##num, \ 1155 + .ops = &s2mpu02_buck_ops, \ 1156 + .type = REGULATOR_VOLTAGE, \ 1157 + .owner = THIS_MODULE, \ 1158 + .min_uV = S2MPU05_BUCK_MIN##which, \ 1159 + .uV_step = S2MPU05_BUCK_STEP##which, \ 1160 + .n_voltages = S2MPU05_BUCK_N_VOLTAGES, \ 1161 + .vsel_reg = S2MPU05_REG_B##num##CTRL2, \ 1162 + .vsel_mask = S2MPU05_BUCK_VSEL_MASK, \ 1163 + .enable_reg = S2MPU05_REG_B##num##CTRL1, \ 1164 + .enable_mask = S2MPU05_ENABLE_MASK, \ 1165 + .enable_time = S2MPU05_ENABLE_TIME_BUCK##num \ 1166 + } 1167 + 1168 + #define regulator_desc_s2mpu05_buck123(num) regulator_desc_s2mpu05_buck(num, 1) 1169 + #define regulator_desc_s2mpu05_buck45(num) regulator_desc_s2mpu05_buck(num, 2) 1170 + 1171 + static const struct regulator_desc s2mpu05_regulators[] = { 1172 + regulator_desc_s2mpu05_ldo4(1, CTRL), 1173 + regulator_desc_s2mpu05_ldo3(2, CTRL), 1174 + regulator_desc_s2mpu05_ldo2(3, CTRL), 1175 + regulator_desc_s2mpu05_ldo1(4, CTRL), 1176 + regulator_desc_s2mpu05_ldo1(5, CTRL), 1177 + regulator_desc_s2mpu05_ldo1(6, CTRL), 1178 + regulator_desc_s2mpu05_ldo2(7, CTRL), 1179 + regulator_desc_s2mpu05_ldo3(8, CTRL), 1180 + regulator_desc_s2mpu05_ldo4(9, CTRL1), 1181 + regulator_desc_s2mpu05_ldo4(10, CTRL), 1182 + /* LDOs 11-24 are used for CP. They aren't documented. */ 1183 + regulator_desc_s2mpu05_ldo2(25, CTRL), 1184 + regulator_desc_s2mpu05_ldo3(26, CTRL), 1185 + regulator_desc_s2mpu05_ldo2(27, CTRL), 1186 + regulator_desc_s2mpu05_ldo3(28, CTRL), 1187 + regulator_desc_s2mpu05_ldo3(29, CTRL), 1188 + regulator_desc_s2mpu05_ldo2(30, CTRL), 1189 + regulator_desc_s2mpu05_ldo3(31, CTRL), 1190 + regulator_desc_s2mpu05_ldo3(32, CTRL), 1191 + regulator_desc_s2mpu05_ldo3(33, CTRL), 1192 + regulator_desc_s2mpu05_ldo3(34, CTRL), 1193 + regulator_desc_s2mpu05_ldo3(35, CTRL), 1194 + regulator_desc_s2mpu05_buck123(1), 1195 + regulator_desc_s2mpu05_buck123(2), 1196 + regulator_desc_s2mpu05_buck123(3), 1197 + regulator_desc_s2mpu05_buck45(4), 1198 + regulator_desc_s2mpu05_buck45(5), 1199 + }; 1200 + 1125 1201 static int s2mps11_pmic_probe(struct platform_device *pdev) 1126 1202 { 1127 1203 struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); ··· 1242 1158 rdev_num = ARRAY_SIZE(s2mpu02_regulators); 1243 1159 regulators = s2mpu02_regulators; 1244 1160 BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mpu02_regulators)); 1161 + break; 1162 + case S2MPU05: 1163 + rdev_num = ARRAY_SIZE(s2mpu05_regulators); 1164 + regulators = s2mpu05_regulators; 1165 + BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mpu05_regulators)); 1245 1166 break; 1246 1167 default: 1247 1168 dev_err(&pdev->dev, "Invalid device type: %u\n", ··· 1317 1228 { "s2mps14-regulator", S2MPS14X}, 1318 1229 { "s2mps15-regulator", S2MPS15X}, 1319 1230 { "s2mpu02-regulator", S2MPU02}, 1231 + { "s2mpu05-regulator", S2MPU05}, 1320 1232 { }, 1321 1233 }; 1322 1234 MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id); ··· 1335 1245 1336 1246 /* Module information */ 1337 1247 MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>"); 1338 - MODULE_DESCRIPTION("Samsung S2MPS11/S2MPS14/S2MPS15/S2MPU02 Regulator Driver"); 1248 + MODULE_DESCRIPTION("Samsung S2MPS11/14/15/S2MPU02/05 Regulator Driver"); 1339 1249 MODULE_LICENSE("GPL");