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
12201220 {
12211221 const struct regulator_ops *ops = rdev->desc->ops;
12221222 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+ }
12231312
12241313 /* do we need to apply the constraint voltage */
1225− if (rdev->constraints->apply_uV &&
1226− rdev->constraints->min_uV && rdev->constraints->max_uV) {
1314+ if (apply_uV) {
12271315 int target_min, target_max;
12281316 int current_uV = regulator_get_voltage_rdev(rdev);
12291317
@@ -1278,77 +1366,6 @@ static int machine_constraints_voltage(struct regulator_dev *rdev, · 48 unmodified lines
12781366 }
12791367 }
12801368
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−
13521369 return 0;
13531370 }
13541371
drivers/regulator/mt6358-regulator.c+1−1
@@ -492,7 +492,7 @@ static const struct regulator_ops mt6358_volt_fixed_ops = { · 491 unmodified lines
492492 .list_voltage = regulator_list_voltage_linear,
493493 .map_voltage = regulator_map_voltage_linear,
494494 .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,
496496 .set_voltage_time_sel = regulator_set_voltage_time_sel,
497497 .enable = regulator_enable_regmap,
498498 .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