History

Merge tag 'regulator-fix-v7.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator

Pull regulator fixes from Mark Brown: "One driver specific fix where one of the MediaTek drivers duplicated some core code buggily, and a core fix for an ordering issue on startup where we could end up configuring a voltage outside of constraints due to the order in which we applied constraints" * tag 'regulator-fix-v7.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator: regulator: core: clamp voltage constraints before applying apply_uV regulator: mt6358: use regmap helper to read fixed LDO calibration

Linus Torvalds committed 3 months ago

Commit e6bfeeb2 parents 09b2124 a45cc642 files · +91 −74Browse files

Unified · Split

2 files
  1. drivers/regulator/core.c +90 −73
  2. drivers/regulator/mt6358-regulator.c +1 −1
drivers/regulator/core.c+90−73
@@ -1220,10 +1220,98 @@ static int machine_constraints_voltage(struct regulator_dev *rdev, · 1219 unmodified lines
1220{1220{
1221 const struct regulator_ops *ops = rdev->desc->ops;1221 const struct regulator_ops *ops = rdev->desc->ops;
1222 int ret;1222 int ret;
1223 bool apply_uV;
1224
1225 /*
1226 * Decide up front, from the constraints as handed to us, whether
1227 * apply_uV needs to run below. The clamping pass right after this
1228 * may rewrite constraints->min_uV/max_uV (e.g. the fixed-voltage
1229 * autoconfigure case), and we don't want that to change whether
1230 * apply_uV fires.
1231 */
1232 apply_uV = rdev->constraints->apply_uV &&
1233 rdev->constraints->min_uV && rdev->constraints->max_uV;
1234
1235 /*
1236 * Constrain machine-level voltage specs to fit the actual range
1237 * supported by this regulator before apply_uV (below) tries to
1238 * force hardware to a value from that range: otherwise apply_uV
1239 * can target a constraint value that doesn't correspond to any
1240 * real voltage selector and fail registration outright, even
1241 * though the clamping pass would have narrowed it to a value
1242 * the regulator can actually hit.
1243 */
1244 if (ops->list_voltage && rdev->desc->n_voltages) {
1245 int count = rdev->desc->n_voltages;
1246 int i;
1247 int min_uV = INT_MAX;
1248 int max_uV = INT_MIN;
1249 int cmin = constraints->min_uV;
1250 int cmax = constraints->max_uV;
1251
1252 /* it's safe to autoconfigure fixed-voltage supplies
1253 * and the constraints are used by list_voltage.
1254 */
1255 if (count == 1 && !cmin) {
1256 cmin = 1;
1257 cmax = INT_MAX;
1258 constraints->min_uV = cmin;
1259 constraints->max_uV = cmax;
1260 }
1261
1262 /* voltage constraints are optional */
1263 if ((cmin == 0) && (cmax == 0)) {
1264 /* nothing more to do */
1265
1266 /* else require explicit machine-level constraints */
1267 } else if (cmin <= 0 || cmax <= 0 || cmax < cmin) {
1268 rdev_err(rdev, "invalid voltage constraints\n");
1269 return -EINVAL;
1270
1271 /* no need to loop voltages if range is continuous */
1272 } else if (rdev->desc->continuous_voltage_range) {
1273 /* nothing more to do */
1274
1275 } else {
1276 /* initial: [cmin..cmax] valid, [min_uV..max_uV] not */
1277 for (i = 0; i < count; i++) {
1278 int value;
1279
1280 value = ops->list_voltage(rdev, i);
1281 if (value <= 0)
1282 continue;
1283
1284 /* maybe adjust [min_uV..max_uV] */
1285 if (value >= cmin && value < min_uV)
1286 min_uV = value;
1287 if (value <= cmax && value > max_uV)
1288 max_uV = value;
1289 }
1290
1291 /* final: [min_uV..max_uV] valid iff constraints valid */
1292 if (max_uV < min_uV) {
1293 rdev_err(rdev,
1294 "unsupportable voltage constraints %u-%uuV\n",
1295 min_uV, max_uV);
1296 return -EINVAL;
1297 }
1298
1299 /* use regulator's subset of machine constraints */
1300 if (constraints->min_uV < min_uV) {
1301 rdev_dbg(rdev, "override min_uV, %d -> %d\n",
1302 constraints->min_uV, min_uV);
1303 constraints->min_uV = min_uV;
1304 }
1305 if (constraints->max_uV > max_uV) {
1306 rdev_dbg(rdev, "override max_uV, %d -> %d\n",
1307 constraints->max_uV, max_uV);
1308 constraints->max_uV = max_uV;
1309 }
1310 }
1311 }
1223 1312
1224 /* do we need to apply the constraint voltage */1313 /* do we need to apply the constraint voltage */
1225 if (rdev->constraints->apply_uV &&1314 if (apply_uV) {
1226 rdev->constraints->min_uV && rdev->constraints->max_uV) {
1227 int target_min, target_max;1315 int target_min, target_max;
1228 int current_uV = regulator_get_voltage_rdev(rdev);1316 int current_uV = regulator_get_voltage_rdev(rdev);
1229 1317
@@ -1278,77 +1366,6 @@ static int machine_constraints_voltage(struct regulator_dev *rdev, · 48 unmodified lines
1278 }1366 }
1279 }1367 }
1280 1368
1281 /* constrain machine-level voltage specs to fit
1282 * the actual range supported by this regulator.
1283 */
1284 if (ops->list_voltage && rdev->desc->n_voltages) {
1285 int count = rdev->desc->n_voltages;
1286 int i;
1287 int min_uV = INT_MAX;
1288 int max_uV = INT_MIN;
1289 int cmin = constraints->min_uV;
1290 int cmax = constraints->max_uV;
1291
1292 /* it's safe to autoconfigure fixed-voltage supplies
1293 * and the constraints are used by list_voltage.
1294 */
1295 if (count == 1 && !cmin) {
1296 cmin = 1;
1297 cmax = INT_MAX;
1298 constraints->min_uV = cmin;
1299 constraints->max_uV = cmax;
1300 }
1301
1302 /* voltage constraints are optional */
1303 if ((cmin == 0) && (cmax == 0))
1304 return 0;
1305
1306 /* else require explicit machine-level constraints */
1307 if (cmin <= 0 || cmax <= 0 || cmax < cmin) {
1308 rdev_err(rdev, "invalid voltage constraints\n");
1309 return -EINVAL;
1310 }
1311
1312 /* no need to loop voltages if range is continuous */
1313 if (rdev->desc->continuous_voltage_range)
1314 return 0;
1315
1316 /* initial: [cmin..cmax] valid, [min_uV..max_uV] not */
1317 for (i = 0; i < count; i++) {
1318 int value;
1319
1320 value = ops->list_voltage(rdev, i);
1321 if (value <= 0)
1322 continue;
1323
1324 /* maybe adjust [min_uV..max_uV] */
1325 if (value >= cmin && value < min_uV)
1326 min_uV = value;
1327 if (value <= cmax && value > max_uV)
1328 max_uV = value;
1329 }
1330
1331 /* final: [min_uV..max_uV] valid iff constraints valid */
1332 if (max_uV < min_uV) {
1333 rdev_err(rdev,
1334 "unsupportable voltage constraints %u-%uuV\n",
1335 min_uV, max_uV);
1336 return -EINVAL;
1337 }
1338
1339 /* use regulator's subset of machine constraints */
1340 if (constraints->min_uV < min_uV) {
1341 rdev_dbg(rdev, "override min_uV, %d -> %d\n",
1342 constraints->min_uV, min_uV);
1343 constraints->min_uV = min_uV;
1344 }
1345 if (constraints->max_uV > max_uV) {
1346 rdev_dbg(rdev, "override max_uV, %d -> %d\n",
1347 constraints->max_uV, max_uV);
1348 constraints->max_uV = max_uV;
1349 }
1350 }
1351
1352 return 0;1369 return 0;
1353}1370}
1354 1371
drivers/regulator/mt6358-regulator.c+1−1
@@ -492,7 +492,7 @@ static const struct regulator_ops mt6358_volt_fixed_ops = { · 491 unmodified lines
492 .list_voltage = regulator_list_voltage_linear,492 .list_voltage = regulator_list_voltage_linear,
493 .map_voltage = regulator_map_voltage_linear,493 .map_voltage = regulator_map_voltage_linear,
494 .set_voltage_sel = regulator_set_voltage_sel_regmap,494 .set_voltage_sel = regulator_set_voltage_sel_regmap,
495 .get_voltage_sel = mt6358_get_buck_voltage_sel,495 .get_voltage_sel = regulator_get_voltage_sel_regmap,
496 .set_voltage_time_sel = regulator_set_voltage_time_sel,496 .set_voltage_time_sel = regulator_set_voltage_time_sel,
497 .enable = regulator_enable_regmap,497 .enable = regulator_enable_regmap,
498 .disable = regulator_disable_regmap,498 .disable = regulator_disable_regmap,

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t