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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'regulator-fix-v6.10-merge-window' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator

Pull regulator fixes from Mark Brown:
"A bunch of fixes that came in during the merge window.

Matti found several issues with some of the more complexly configured
Rohm regulators and the helpers they use and there were some errors in
the specification of tps6594 when regulators are grouped together"

* tag 'regulator-fix-v6.10-merge-window' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator:
regulator: tps6594-regulator: Correct multi-phase configuration
regulator: tps6287x: Force writing VSEL bit
regulator: pickable ranges: don't always cache vsel
regulator: rohm-regulator: warn if unsupported voltage is set
regulator: bd71828: Don't overwrite runtime voltages

+48 -77
+2 -56
drivers/regulator/bd71828-regulator.c
··· 206 206 .suspend_reg = BD71828_REG_BUCK1_SUSP_VOLT, 207 207 .suspend_mask = BD71828_MASK_BUCK1267_VOLT, 208 208 .suspend_on_mask = BD71828_MASK_SUSP_EN, 209 - .lpsr_on_mask = BD71828_MASK_LPSR_EN, 210 209 /* 211 210 * LPSR voltage is same as SUSPEND voltage. Allow 212 - * setting it so that regulator can be set enabled at 213 - * LPSR state 211 + * only enabling/disabling regulator for LPSR state 214 212 */ 215 - .lpsr_reg = BD71828_REG_BUCK1_SUSP_VOLT, 216 - .lpsr_mask = BD71828_MASK_BUCK1267_VOLT, 213 + .lpsr_on_mask = BD71828_MASK_LPSR_EN, 217 214 }, 218 215 .reg_inits = buck1_inits, 219 216 .reg_init_amnt = ARRAY_SIZE(buck1_inits), ··· 285 288 ROHM_DVS_LEVEL_SUSPEND | 286 289 ROHM_DVS_LEVEL_LPSR, 287 290 .run_reg = BD71828_REG_BUCK3_VOLT, 288 - .idle_reg = BD71828_REG_BUCK3_VOLT, 289 - .suspend_reg = BD71828_REG_BUCK3_VOLT, 290 - .lpsr_reg = BD71828_REG_BUCK3_VOLT, 291 291 .run_mask = BD71828_MASK_BUCK3_VOLT, 292 - .idle_mask = BD71828_MASK_BUCK3_VOLT, 293 - .suspend_mask = BD71828_MASK_BUCK3_VOLT, 294 - .lpsr_mask = BD71828_MASK_BUCK3_VOLT, 295 292 .idle_on_mask = BD71828_MASK_IDLE_EN, 296 293 .suspend_on_mask = BD71828_MASK_SUSP_EN, 297 294 .lpsr_on_mask = BD71828_MASK_LPSR_EN, ··· 320 329 ROHM_DVS_LEVEL_SUSPEND | 321 330 ROHM_DVS_LEVEL_LPSR, 322 331 .run_reg = BD71828_REG_BUCK4_VOLT, 323 - .idle_reg = BD71828_REG_BUCK4_VOLT, 324 - .suspend_reg = BD71828_REG_BUCK4_VOLT, 325 - .lpsr_reg = BD71828_REG_BUCK4_VOLT, 326 332 .run_mask = BD71828_MASK_BUCK4_VOLT, 327 - .idle_mask = BD71828_MASK_BUCK4_VOLT, 328 - .suspend_mask = BD71828_MASK_BUCK4_VOLT, 329 - .lpsr_mask = BD71828_MASK_BUCK4_VOLT, 330 333 .idle_on_mask = BD71828_MASK_IDLE_EN, 331 334 .suspend_on_mask = BD71828_MASK_SUSP_EN, 332 335 .lpsr_on_mask = BD71828_MASK_LPSR_EN, ··· 355 370 ROHM_DVS_LEVEL_SUSPEND | 356 371 ROHM_DVS_LEVEL_LPSR, 357 372 .run_reg = BD71828_REG_BUCK5_VOLT, 358 - .idle_reg = BD71828_REG_BUCK5_VOLT, 359 - .suspend_reg = BD71828_REG_BUCK5_VOLT, 360 - .lpsr_reg = BD71828_REG_BUCK5_VOLT, 361 373 .run_mask = BD71828_MASK_BUCK5_VOLT, 362 - .idle_mask = BD71828_MASK_BUCK5_VOLT, 363 - .suspend_mask = BD71828_MASK_BUCK5_VOLT, 364 - .lpsr_mask = BD71828_MASK_BUCK5_VOLT, 365 374 .idle_on_mask = BD71828_MASK_IDLE_EN, 366 375 .suspend_on_mask = BD71828_MASK_SUSP_EN, 367 376 .lpsr_on_mask = BD71828_MASK_LPSR_EN, ··· 472 493 ROHM_DVS_LEVEL_SUSPEND | 473 494 ROHM_DVS_LEVEL_LPSR, 474 495 .run_reg = BD71828_REG_LDO1_VOLT, 475 - .idle_reg = BD71828_REG_LDO1_VOLT, 476 - .suspend_reg = BD71828_REG_LDO1_VOLT, 477 - .lpsr_reg = BD71828_REG_LDO1_VOLT, 478 496 .run_mask = BD71828_MASK_LDO_VOLT, 479 - .idle_mask = BD71828_MASK_LDO_VOLT, 480 - .suspend_mask = BD71828_MASK_LDO_VOLT, 481 - .lpsr_mask = BD71828_MASK_LDO_VOLT, 482 497 .idle_on_mask = BD71828_MASK_IDLE_EN, 483 498 .suspend_on_mask = BD71828_MASK_SUSP_EN, 484 499 .lpsr_on_mask = BD71828_MASK_LPSR_EN, ··· 506 533 ROHM_DVS_LEVEL_SUSPEND | 507 534 ROHM_DVS_LEVEL_LPSR, 508 535 .run_reg = BD71828_REG_LDO2_VOLT, 509 - .idle_reg = BD71828_REG_LDO2_VOLT, 510 - .suspend_reg = BD71828_REG_LDO2_VOLT, 511 - .lpsr_reg = BD71828_REG_LDO2_VOLT, 512 536 .run_mask = BD71828_MASK_LDO_VOLT, 513 - .idle_mask = BD71828_MASK_LDO_VOLT, 514 - .suspend_mask = BD71828_MASK_LDO_VOLT, 515 - .lpsr_mask = BD71828_MASK_LDO_VOLT, 516 537 .idle_on_mask = BD71828_MASK_IDLE_EN, 517 538 .suspend_on_mask = BD71828_MASK_SUSP_EN, 518 539 .lpsr_on_mask = BD71828_MASK_LPSR_EN, ··· 540 573 ROHM_DVS_LEVEL_SUSPEND | 541 574 ROHM_DVS_LEVEL_LPSR, 542 575 .run_reg = BD71828_REG_LDO3_VOLT, 543 - .idle_reg = BD71828_REG_LDO3_VOLT, 544 - .suspend_reg = BD71828_REG_LDO3_VOLT, 545 - .lpsr_reg = BD71828_REG_LDO3_VOLT, 546 576 .run_mask = BD71828_MASK_LDO_VOLT, 547 - .idle_mask = BD71828_MASK_LDO_VOLT, 548 - .suspend_mask = BD71828_MASK_LDO_VOLT, 549 - .lpsr_mask = BD71828_MASK_LDO_VOLT, 550 577 .idle_on_mask = BD71828_MASK_IDLE_EN, 551 578 .suspend_on_mask = BD71828_MASK_SUSP_EN, 552 579 .lpsr_on_mask = BD71828_MASK_LPSR_EN, ··· 575 614 ROHM_DVS_LEVEL_SUSPEND | 576 615 ROHM_DVS_LEVEL_LPSR, 577 616 .run_reg = BD71828_REG_LDO4_VOLT, 578 - .idle_reg = BD71828_REG_LDO4_VOLT, 579 - .suspend_reg = BD71828_REG_LDO4_VOLT, 580 - .lpsr_reg = BD71828_REG_LDO4_VOLT, 581 617 .run_mask = BD71828_MASK_LDO_VOLT, 582 - .idle_mask = BD71828_MASK_LDO_VOLT, 583 - .suspend_mask = BD71828_MASK_LDO_VOLT, 584 - .lpsr_mask = BD71828_MASK_LDO_VOLT, 585 618 .idle_on_mask = BD71828_MASK_IDLE_EN, 586 619 .suspend_on_mask = BD71828_MASK_SUSP_EN, 587 620 .lpsr_on_mask = BD71828_MASK_LPSR_EN, ··· 610 655 ROHM_DVS_LEVEL_SUSPEND | 611 656 ROHM_DVS_LEVEL_LPSR, 612 657 .run_reg = BD71828_REG_LDO5_VOLT, 613 - .idle_reg = BD71828_REG_LDO5_VOLT, 614 - .suspend_reg = BD71828_REG_LDO5_VOLT, 615 - .lpsr_reg = BD71828_REG_LDO5_VOLT, 616 658 .run_mask = BD71828_MASK_LDO_VOLT, 617 - .idle_mask = BD71828_MASK_LDO_VOLT, 618 - .suspend_mask = BD71828_MASK_LDO_VOLT, 619 - .lpsr_mask = BD71828_MASK_LDO_VOLT, 620 659 .idle_on_mask = BD71828_MASK_IDLE_EN, 621 660 .suspend_on_mask = BD71828_MASK_SUSP_EN, 622 661 .lpsr_on_mask = BD71828_MASK_LPSR_EN, ··· 669 720 .suspend_reg = BD71828_REG_LDO7_VOLT, 670 721 .lpsr_reg = BD71828_REG_LDO7_VOLT, 671 722 .run_mask = BD71828_MASK_LDO_VOLT, 672 - .idle_mask = BD71828_MASK_LDO_VOLT, 673 - .suspend_mask = BD71828_MASK_LDO_VOLT, 674 - .lpsr_mask = BD71828_MASK_LDO_VOLT, 675 723 .idle_on_mask = BD71828_MASK_IDLE_EN, 676 724 .suspend_on_mask = BD71828_MASK_SUSP_EN, 677 725 .lpsr_on_mask = BD71828_MASK_LPSR_EN,
+30 -13
drivers/regulator/helpers.c
··· 161 161 } 162 162 EXPORT_SYMBOL_GPL(regulator_get_voltage_sel_pickable_regmap); 163 163 164 + static int write_separate_vsel_and_range(struct regulator_dev *rdev, 165 + unsigned int sel, unsigned int range) 166 + { 167 + bool range_updated; 168 + int ret; 169 + 170 + ret = regmap_update_bits_base(rdev->regmap, rdev->desc->vsel_range_reg, 171 + rdev->desc->vsel_range_mask, 172 + range, &range_updated, false, false); 173 + if (ret) 174 + return ret; 175 + 176 + /* 177 + * Some PMICs treat the vsel_reg same as apply-bit. Force it to be 178 + * written if the range changed, even if the old selector was same as 179 + * the new one 180 + */ 181 + if (rdev->desc->range_applied_by_vsel && range_updated) 182 + return regmap_write_bits(rdev->regmap, 183 + rdev->desc->vsel_reg, 184 + rdev->desc->vsel_mask, sel); 185 + 186 + return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, 187 + rdev->desc->vsel_mask, sel); 188 + } 189 + 164 190 /** 165 191 * regulator_set_voltage_sel_pickable_regmap - pickable range set_voltage_sel 166 192 * ··· 225 199 range = rdev->desc->linear_range_selectors_bitfield[i]; 226 200 range <<= ffs(rdev->desc->vsel_range_mask) - 1; 227 201 228 - if (rdev->desc->vsel_reg == rdev->desc->vsel_range_reg) { 229 - ret = regmap_update_bits(rdev->regmap, 230 - rdev->desc->vsel_reg, 202 + if (rdev->desc->vsel_reg == rdev->desc->vsel_range_reg) 203 + ret = regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, 231 204 rdev->desc->vsel_range_mask | 232 205 rdev->desc->vsel_mask, sel | range); 233 - } else { 234 - ret = regmap_update_bits(rdev->regmap, 235 - rdev->desc->vsel_range_reg, 236 - rdev->desc->vsel_range_mask, range); 237 - if (ret) 238 - return ret; 239 - 240 - ret = regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, 241 - rdev->desc->vsel_mask, sel); 242 - } 206 + else 207 + ret = write_separate_vsel_and_range(rdev, sel, range); 243 208 244 209 if (ret) 245 210 return ret;
+4
drivers/regulator/rohm-regulator.c
··· 46 46 continue; 47 47 if (ret == uv) { 48 48 i <<= ffs(desc->vsel_mask) - 1; 49 + 49 50 ret = regmap_update_bits(regmap, reg, mask, i); 50 51 if (omask && !ret) 51 52 ret = regmap_update_bits(regmap, oreg, omask, ··· 54 53 break; 55 54 } 56 55 } 56 + if (i == desc->n_voltages) 57 + pr_warn("Unsupported %s voltage %u\n", prop, uv); 58 + 57 59 return ret; 58 60 } 59 61
+1
drivers/regulator/tps6287x-regulator.c
··· 115 115 .vsel_mask = 0xFF, 116 116 .vsel_range_reg = TPS6287X_CTRL2, 117 117 .vsel_range_mask = TPS6287X_CTRL2_VRANGE, 118 + .range_applied_by_vsel = true, 118 119 .ramp_reg = TPS6287X_CTRL1, 119 120 .ramp_mask = TPS6287X_CTRL1_VRAMP, 120 121 .ramp_delay_table = tps6287x_ramp_table,
+8 -8
drivers/regulator/tps6594-regulator.c
··· 400 400 static const struct regulator_desc tps6594_multi_regs[] = { 401 401 TPS6594_REGULATOR("BUCK12", "buck12", TPS6594_BUCK_1, 402 402 REGULATOR_VOLTAGE, tps6594_bucks_ops, TPS6594_MASK_BUCKS_VSET, 403 - TPS6594_REG_BUCKX_VOUT_1(1), 403 + TPS6594_REG_BUCKX_VOUT_1(0), 404 404 TPS6594_MASK_BUCKS_VSET, 405 - TPS6594_REG_BUCKX_CTRL(1), 405 + TPS6594_REG_BUCKX_CTRL(0), 406 406 TPS6594_BIT_BUCK_EN, 0, 0, bucks_ranges, 407 407 4, 4000, 0, NULL, 0, 0), 408 408 TPS6594_REGULATOR("BUCK34", "buck34", TPS6594_BUCK_3, 409 409 REGULATOR_VOLTAGE, tps6594_bucks_ops, TPS6594_MASK_BUCKS_VSET, 410 - TPS6594_REG_BUCKX_VOUT_1(3), 410 + TPS6594_REG_BUCKX_VOUT_1(2), 411 411 TPS6594_MASK_BUCKS_VSET, 412 - TPS6594_REG_BUCKX_CTRL(3), 412 + TPS6594_REG_BUCKX_CTRL(2), 413 413 TPS6594_BIT_BUCK_EN, 0, 0, bucks_ranges, 414 414 4, 0, 0, NULL, 0, 0), 415 415 TPS6594_REGULATOR("BUCK123", "buck123", TPS6594_BUCK_1, 416 416 REGULATOR_VOLTAGE, tps6594_bucks_ops, TPS6594_MASK_BUCKS_VSET, 417 - TPS6594_REG_BUCKX_VOUT_1(1), 417 + TPS6594_REG_BUCKX_VOUT_1(0), 418 418 TPS6594_MASK_BUCKS_VSET, 419 - TPS6594_REG_BUCKX_CTRL(1), 419 + TPS6594_REG_BUCKX_CTRL(0), 420 420 TPS6594_BIT_BUCK_EN, 0, 0, bucks_ranges, 421 421 4, 4000, 0, NULL, 0, 0), 422 422 TPS6594_REGULATOR("BUCK1234", "buck1234", TPS6594_BUCK_1, 423 423 REGULATOR_VOLTAGE, tps6594_bucks_ops, TPS6594_MASK_BUCKS_VSET, 424 - TPS6594_REG_BUCKX_VOUT_1(1), 424 + TPS6594_REG_BUCKX_VOUT_1(0), 425 425 TPS6594_MASK_BUCKS_VSET, 426 - TPS6594_REG_BUCKX_CTRL(1), 426 + TPS6594_REG_BUCKX_CTRL(0), 427 427 TPS6594_BIT_BUCK_EN, 0, 0, bucks_ranges, 428 428 4, 4000, 0, NULL, 0, 0), 429 429 };
+3
include/linux/regulator/driver.h
··· 299 299 * @vsel_range_reg: Register for range selector when using pickable ranges 300 300 * and ``regulator_map_*_voltage_*_pickable`` functions. 301 301 * @vsel_range_mask: Mask for register bitfield used for range selector 302 + * @range_applied_by_vsel: A flag to indicate that changes to vsel_range_reg 303 + * are only effective after vsel_reg is written 302 304 * @vsel_reg: Register for selector when using ``regulator_map_*_voltage_*`` 303 305 * @vsel_mask: Mask for register bitfield used for selector 304 306 * @vsel_step: Specify the resolution of selector stepping when setting ··· 391 389 392 390 unsigned int vsel_range_reg; 393 391 unsigned int vsel_range_mask; 392 + bool range_applied_by_vsel; 394 393 unsigned int vsel_reg; 395 394 unsigned int vsel_mask; 396 395 unsigned int vsel_step;