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

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

Pull regulator updates from Mark Brown:
"There's one API update here, a new API factoring out a common pattern
for reference voltage supplies. These are supplies used as a reference
by analogue circuits where the consumer requests and enables the
supply, reads the voltage to calibrate the user and then never touches
it again. This is factored out into a single operation which just
returns the voltage and uses devm_ to manage the request and enable
portion.

Otherwise this has been a very quiet release, we've got some new
device support, some small fixes, housekeeping and cleanup work but
nothing substantial.

There's also some non-regulator changes in here, a number of users for
the new reference voltage API were merged along with it and some MFD
changes were pulled in as dependencies for new driver work.

Highlights:

- Add a new API for single operation handling of reference voltages

- Support for Allwinner AXP717 and D1, and NXP PCA9561A"

* tag 'regulator-v6.10' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator: (33 commits)
regulator: sun20i: Add Allwinner D1 LDOs driver
regulator: dt-bindings: Add Allwinner D1 system LDOs
regulator: Mention regulator id in error message about dummy supplies
staging: iio: impedance-analyzer: ad5933: Use devm_regulator_get_enable_read_voltage()
iio: frequency: admv1013: Use devm_regulator_get_enable_read_voltage()
iio: addac: ad74115: Use devm_regulator_get_enable_read_voltage()
hwmon: (adc128d818) simplify final return in probe
regulator: devres: fix devm_regulator_get_enable_read_voltage() return
hwmon: (da9052) Use devm_regulator_get_enable_read_voltage()
hwmon: (adc128d818) Use devm_regulator_get_enable_read_voltage()
regulator: devres: add API for reference voltage supplies
regulator: rtq2208: Fix LDO discharge register and add vsel setting
regulator: dt-bindings: fixed-regulator: Add a preferred node name
regulator: axp20x: add support for the AXP717
mfd: axp20x: Add support for AXP717 PMIC
dt-bindings: mfd: x-powers,axp152: Document AXP717
regulator: axp20x: fix typo-ed identifier
dt-bindings: regulator: qcom,usb-vbus-regulator: Add PM7250B compatible
regulator: pca9450: add pca9451a support
regulator: dt-bindings: pca9450: add pca9451a support
...

+879 -215
+2
Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml
··· 83 83 enum: 84 84 - x-powers,axp313a 85 85 - x-powers,axp15060 86 + - x-powers,axp717 86 87 87 88 then: 88 89 properties: ··· 100 99 - x-powers,axp221 101 100 - x-powers,axp223 102 101 - x-powers,axp313a 102 + - x-powers,axp717 103 103 - x-powers,axp803 104 104 - x-powers,axp806 105 105 - x-powers,axp809
+37
Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-system-ldos.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Allwinner D1 System LDOs 8 + 9 + maintainers: 10 + - Samuel Holland <samuel@sholland.org> 11 + 12 + description: 13 + Allwinner D1 contains a pair of general-purpose LDOs which are designed to 14 + supply power inside and outside the SoC. They are controlled by a register 15 + within the system control MMIO space. 16 + 17 + properties: 18 + compatible: 19 + enum: 20 + - allwinner,sun20i-d1-system-ldos 21 + 22 + reg: 23 + maxItems: 1 24 + 25 + patternProperties: 26 + "^ldo[ab]$": 27 + type: object 28 + $ref: regulator.yaml# 29 + unevaluatedProperties: false 30 + 31 + required: 32 + - compatible 33 + - reg 34 + 35 + additionalProperties: false 36 + 37 + ...
+7
Documentation/devicetree/bindings/regulator/fixed-regulator.yaml
··· 41 41 - gpios 42 42 43 43 properties: 44 + $nodename: 45 + anyOf: 46 + - description: Preferred name is 'regulator-[0-9]v[0-9]' 47 + pattern: '^regulator(-[0-9]+v[0-9]+|-[0-9a-z-]+)?$' 48 + - description: Any name allowed 49 + deprecated: true 50 + 44 51 compatible: 45 52 enum: 46 53 - regulator-fixed
+1
Documentation/devicetree/bindings/regulator/nxp,pca9450-regulator.yaml
··· 28 28 - nxp,pca9450a 29 29 - nxp,pca9450b 30 30 - nxp,pca9450c 31 + - nxp,pca9451a 31 32 32 33 reg: 33 34 maxItems: 1
+1
Documentation/devicetree/bindings/regulator/qcom,usb-vbus-regulator.yaml
··· 26 26 - enum: 27 27 - qcom,pm4125-vbus-reg 28 28 - qcom,pm6150-vbus-reg 29 + - qcom,pm7250b-vbus-reg 29 30 - qcom,pmi632-vbus-reg 30 31 - const: qcom,pm8150b-vbus-reg 31 32
+1
Documentation/driver-api/driver-model/devres.rst
··· 433 433 devm_regulator_bulk_put() 434 434 devm_regulator_get() 435 435 devm_regulator_get_enable() 436 + devm_regulator_get_enable_read_voltage() 436 437 devm_regulator_get_enable_optional() 437 438 devm_regulator_get_exclusive() 438 439 devm_regulator_get_optional()
+16 -41
drivers/hwmon/adc128d818.c
··· 58 58 59 59 struct adc128_data { 60 60 struct i2c_client *client; 61 - struct regulator *regulator; 62 61 int vref; /* Reference voltage in mV */ 63 62 struct mutex update_lock; 64 63 u8 mode; /* Operation mode */ ··· 388 389 return 0; 389 390 } 390 391 391 - static int adc128_init_client(struct adc128_data *data) 392 + static int adc128_init_client(struct adc128_data *data, bool external_vref) 392 393 { 393 394 struct i2c_client *client = data->client; 394 395 int err; ··· 407 408 regval |= data->mode << 1; 408 409 409 410 /* If external vref is selected, configure the chip to use it */ 410 - if (data->regulator) 411 + if (external_vref) 411 412 regval |= 0x01; 412 413 413 414 /* Write advanced configuration register */ ··· 429 430 static int adc128_probe(struct i2c_client *client) 430 431 { 431 432 struct device *dev = &client->dev; 432 - struct regulator *regulator; 433 433 struct device *hwmon_dev; 434 434 struct adc128_data *data; 435 + bool external_vref; 435 436 int err, vref; 436 437 437 438 data = devm_kzalloc(dev, sizeof(struct adc128_data), GFP_KERNEL); ··· 439 440 return -ENOMEM; 440 441 441 442 /* vref is optional. If specified, is used as chip reference voltage */ 442 - regulator = devm_regulator_get_optional(dev, "vref"); 443 - if (!IS_ERR(regulator)) { 444 - data->regulator = regulator; 445 - err = regulator_enable(regulator); 446 - if (err < 0) 447 - return err; 448 - vref = regulator_get_voltage(regulator); 449 - if (vref < 0) { 450 - err = vref; 451 - goto error; 452 - } 453 - data->vref = DIV_ROUND_CLOSEST(vref, 1000); 454 - } else { 443 + vref = devm_regulator_get_enable_read_voltage(dev, "vref"); 444 + if (vref == -ENODEV) { 445 + external_vref = false; 455 446 data->vref = 2560; /* 2.56V, in mV */ 447 + } else if (vref < 0) { 448 + return vref; 449 + } else { 450 + external_vref = true; 451 + data->vref = DIV_ROUND_CLOSEST(vref, 1000); 456 452 } 457 453 458 454 /* Operation mode is optional. If unspecified, keep current mode */ ··· 455 461 if (data->mode > 3) { 456 462 dev_err(dev, "invalid operation mode %d\n", 457 463 data->mode); 458 - err = -EINVAL; 459 - goto error; 464 + return -EINVAL; 460 465 } 461 466 } else { 462 467 err = i2c_smbus_read_byte_data(client, ADC128_REG_CONFIG_ADV); 463 468 if (err < 0) 464 - goto error; 469 + return err; 465 470 data->mode = (err >> 1) & ADC128_REG_MASK; 466 471 } 467 472 ··· 469 476 mutex_init(&data->update_lock); 470 477 471 478 /* Initialize the chip */ 472 - err = adc128_init_client(data); 479 + err = adc128_init_client(data, external_vref); 473 480 if (err < 0) 474 - goto error; 481 + return err; 475 482 476 483 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, 477 484 data, adc128_groups); 478 - if (IS_ERR(hwmon_dev)) { 479 - err = PTR_ERR(hwmon_dev); 480 - goto error; 481 - } 482 485 483 - return 0; 484 - 485 - error: 486 - if (data->regulator) 487 - regulator_disable(data->regulator); 488 - return err; 489 - } 490 - 491 - static void adc128_remove(struct i2c_client *client) 492 - { 493 - struct adc128_data *data = i2c_get_clientdata(client); 494 - 495 - if (data->regulator) 496 - regulator_disable(data->regulator); 486 + return PTR_ERR_OR_ZERO(hwmon_dev); 497 487 } 498 488 499 489 static const struct i2c_device_id adc128_id[] = { ··· 498 522 .of_match_table = of_match_ptr(adc128_of_match), 499 523 }, 500 524 .probe = adc128_probe, 501 - .remove = adc128_remove, 502 525 .id_table = adc128_id, 503 526 .detect = adc128_detect, 504 527 .address_list = normal_i2c,
+10 -28
drivers/hwmon/da9052-hwmon.c
··· 26 26 struct mutex hwmon_lock; 27 27 bool tsi_as_adc; 28 28 int tsiref_mv; 29 - struct regulator *tsiref; 30 29 struct completion tsidone; 31 30 }; 32 31 ··· 396 397 struct device *dev = &pdev->dev; 397 398 struct da9052_hwmon *hwmon; 398 399 struct device *hwmon_dev; 399 - int err; 400 + int err, tsiref_uv; 400 401 401 402 hwmon = devm_kzalloc(dev, sizeof(struct da9052_hwmon), GFP_KERNEL); 402 403 if (!hwmon) ··· 413 414 device_property_read_bool(pdev->dev.parent, "dlg,tsi-as-adc"); 414 415 415 416 if (hwmon->tsi_as_adc) { 416 - hwmon->tsiref = devm_regulator_get(pdev->dev.parent, "tsiref"); 417 - if (IS_ERR(hwmon->tsiref)) { 418 - err = PTR_ERR(hwmon->tsiref); 419 - dev_err(&pdev->dev, "failed to get tsiref: %d", err); 420 - return err; 421 - } 422 - 423 - err = regulator_enable(hwmon->tsiref); 424 - if (err) 425 - return err; 426 - 427 - hwmon->tsiref_mv = regulator_get_voltage(hwmon->tsiref); 428 - if (hwmon->tsiref_mv < 0) { 429 - err = hwmon->tsiref_mv; 430 - goto exit_regulator; 431 - } 417 + tsiref_uv = devm_regulator_get_enable_read_voltage(dev->parent, 418 + "tsiref"); 419 + if (tsiref_uv < 0) 420 + return dev_err_probe(dev, tsiref_uv, 421 + "failed to get tsiref voltage\n"); 432 422 433 423 /* convert from microvolt (DT) to millivolt (hwmon) */ 434 - hwmon->tsiref_mv /= 1000; 424 + hwmon->tsiref_mv = tsiref_uv / 1000; 435 425 436 426 /* TSIREF limits from datasheet */ 437 427 if (hwmon->tsiref_mv < 1800 || hwmon->tsiref_mv > 2600) { 438 428 dev_err(hwmon->da9052->dev, "invalid TSIREF voltage: %d", 439 429 hwmon->tsiref_mv); 440 - err = -ENXIO; 441 - goto exit_regulator; 430 + return -ENXIO; 442 431 } 443 432 444 433 /* disable touchscreen features */ ··· 443 456 if (err) { 444 457 dev_err(&pdev->dev, "Failed to register TSIRDY IRQ: %d", 445 458 err); 446 - goto exit_regulator; 459 + return err; 447 460 } 448 461 } 449 462 ··· 459 472 exit_irq: 460 473 if (hwmon->tsi_as_adc) 461 474 da9052_free_irq(hwmon->da9052, DA9052_IRQ_TSIREADY, hwmon); 462 - exit_regulator: 463 - if (hwmon->tsiref) 464 - regulator_disable(hwmon->tsiref); 465 475 466 476 return err; 467 477 } ··· 467 483 { 468 484 struct da9052_hwmon *hwmon = platform_get_drvdata(pdev); 469 485 470 - if (hwmon->tsi_as_adc) { 486 + if (hwmon->tsi_as_adc) 471 487 da9052_free_irq(hwmon->da9052, DA9052_IRQ_TSIREADY, hwmon); 472 - regulator_disable(hwmon->tsiref); 473 - } 474 488 } 475 489 476 490 static struct platform_driver da9052_hwmon_driver = {
+15 -25
drivers/iio/addac/ad74115.c
··· 199 199 struct spi_device *spi; 200 200 struct regmap *regmap; 201 201 struct iio_trigger *trig; 202 - struct regulator *avdd; 203 202 204 203 /* 205 204 * Synchronize consecutive operations when doing a one-shot ··· 1671 1672 if (ret) 1672 1673 return ret; 1673 1674 1674 - if (val == AD74115_DIN_THRESHOLD_MODE_AVDD) { 1675 - ret = regulator_get_voltage(st->avdd); 1676 - if (ret < 0) 1677 - return ret; 1678 - 1679 - st->avdd_mv = ret / 1000; 1680 - } 1675 + if (val == AD74115_DIN_THRESHOLD_MODE_AVDD && !st->avdd_mv) 1676 + return dev_err_probe(dev, -EINVAL, 1677 + "AVDD voltage is required for digital input threshold mode AVDD\n"); 1681 1678 1682 1679 st->din_threshold_mode = val; 1683 1680 ··· 1783 1788 return 0; 1784 1789 } 1785 1790 1786 - static void ad74115_regulator_disable(void *data) 1787 - { 1788 - regulator_disable(data); 1789 - } 1790 - 1791 1791 static int ad74115_setup_trigger(struct iio_dev *indio_dev) 1792 1792 { 1793 1793 struct ad74115_state *st = iio_priv(indio_dev); ··· 1845 1855 indio_dev->modes = INDIO_DIRECT_MODE; 1846 1856 indio_dev->info = &ad74115_info; 1847 1857 1848 - st->avdd = devm_regulator_get(dev, "avdd"); 1849 - if (IS_ERR(st->avdd)) 1850 - return PTR_ERR(st->avdd); 1851 - 1852 - ret = regulator_enable(st->avdd); 1853 - if (ret) { 1854 - dev_err(dev, "Failed to enable avdd regulator\n"); 1855 - return ret; 1858 + ret = devm_regulator_get_enable_read_voltage(dev, "avdd"); 1859 + if (ret < 0) { 1860 + /* 1861 + * Since this is both a power supply and only optionally a 1862 + * reference voltage, make sure to enable it even when the 1863 + * voltage is not available. 1864 + */ 1865 + ret = devm_regulator_get_enable(dev, "avdd"); 1866 + if (ret) 1867 + return dev_err_probe(dev, ret, "failed to enable avdd\n"); 1868 + } else { 1869 + st->avdd_mv = ret / 1000; 1856 1870 } 1857 - 1858 - ret = devm_add_action_or_reset(dev, ad74115_regulator_disable, st->avdd); 1859 - if (ret) 1860 - return ret; 1861 1871 1862 1872 ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulator_names), 1863 1873 regulator_names);
+10 -30
drivers/iio/frequency/admv1013.c
··· 95 95 struct clk *clkin; 96 96 /* Protect against concurrent accesses to the device and to data */ 97 97 struct mutex lock; 98 - struct regulator *reg; 99 98 struct notifier_block nb; 100 99 unsigned int input_mode; 101 100 unsigned int quad_se_mode; ··· 341 342 FIELD_PREP(ADMV1013_QUAD_FILTERS_MSK, filt_raw)); 342 343 } 343 344 344 - static int admv1013_update_mixer_vgate(struct admv1013_state *st) 345 + static int admv1013_update_mixer_vgate(struct admv1013_state *st, int vcm) 345 346 { 346 347 unsigned int mixer_vgate; 347 - int vcm; 348 - 349 - vcm = regulator_get_voltage(st->reg); 350 - if (vcm < 0) 351 - return vcm; 352 348 353 349 if (vcm <= 1800000) 354 350 mixer_vgate = (2389 * vcm / 1000000 + 8100) / 100; ··· 437 443 ADMV1013_CHAN_CALIB(1, Q), 438 444 }; 439 445 440 - static int admv1013_init(struct admv1013_state *st) 446 + static int admv1013_init(struct admv1013_state *st, int vcm_uv) 441 447 { 442 448 int ret; 443 449 unsigned int data; ··· 477 483 if (ret) 478 484 return ret; 479 485 480 - ret = admv1013_update_mixer_vgate(st); 486 + ret = admv1013_update_mixer_vgate(st, vcm_uv); 481 487 if (ret) 482 488 return ret; 483 489 ··· 490 496 ADMV1013_MIXER_IF_EN_MSK, 491 497 st->det_en | 492 498 st->input_mode); 493 - } 494 - 495 - static void admv1013_reg_disable(void *data) 496 - { 497 - regulator_disable(data); 498 499 } 499 500 500 501 static void admv1013_powerdown(void *data) ··· 546 557 else 547 558 return -EINVAL; 548 559 549 - st->reg = devm_regulator_get(&spi->dev, "vcm"); 550 - if (IS_ERR(st->reg)) 551 - return dev_err_probe(&spi->dev, PTR_ERR(st->reg), 552 - "failed to get the common-mode voltage\n"); 553 - 554 560 ret = devm_regulator_bulk_get_enable(&st->spi->dev, 555 561 ARRAY_SIZE(admv1013_vcc_regs), 556 562 admv1013_vcc_regs); ··· 562 578 { 563 579 struct iio_dev *indio_dev; 564 580 struct admv1013_state *st; 565 - int ret; 581 + int ret, vcm_uv; 566 582 567 583 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); 568 584 if (!indio_dev) ··· 581 597 if (ret) 582 598 return ret; 583 599 584 - ret = regulator_enable(st->reg); 585 - if (ret) { 586 - dev_err(&spi->dev, "Failed to enable specified Common-Mode Voltage!\n"); 587 - return ret; 588 - } 600 + ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vcm"); 601 + if (ret < 0) 602 + return dev_err_probe(&spi->dev, ret, 603 + "failed to get the common-mode voltage\n"); 589 604 590 - ret = devm_add_action_or_reset(&spi->dev, admv1013_reg_disable, 591 - st->reg); 592 - if (ret) 593 - return ret; 605 + vcm_uv = ret; 594 606 595 607 st->clkin = devm_clk_get_enabled(&spi->dev, "lo_in"); 596 608 if (IS_ERR(st->clkin)) ··· 600 620 601 621 mutex_init(&st->lock); 602 622 603 - ret = admv1013_init(st); 623 + ret = admv1013_init(st, vcm_uv); 604 624 if (ret) { 605 625 dev_err(&spi->dev, "admv1013 init failed\n"); 606 626 return ret;
+2
drivers/mfd/axp20x-i2c.c
··· 65 65 { .compatible = "x-powers,axp221", .data = (void *)AXP221_ID }, 66 66 { .compatible = "x-powers,axp223", .data = (void *)AXP223_ID }, 67 67 { .compatible = "x-powers,axp313a", .data = (void *)AXP313A_ID }, 68 + { .compatible = "x-powers,axp717", .data = (void *)AXP717_ID }, 68 69 { .compatible = "x-powers,axp803", .data = (void *)AXP803_ID }, 69 70 { .compatible = "x-powers,axp806", .data = (void *)AXP806_ID }, 70 71 { .compatible = "x-powers,axp15060", .data = (void *)AXP15060_ID }, ··· 82 81 { "axp221", 0 }, 83 82 { "axp223", 0 }, 84 83 { "axp313a", 0 }, 84 + { "axp717", 0 }, 85 85 { "axp803", 0 }, 86 86 { "axp806", 0 }, 87 87 { "axp15060", 0 },
+1
drivers/mfd/axp20x-rsb.c
··· 58 58 59 59 static const struct of_device_id axp20x_rsb_of_match[] = { 60 60 { .compatible = "x-powers,axp223", .data = (void *)AXP223_ID }, 61 + { .compatible = "x-powers,axp717", .data = (void *)AXP717_ID }, 61 62 { .compatible = "x-powers,axp803", .data = (void *)AXP803_ID }, 62 63 { .compatible = "x-powers,axp806", .data = (void *)AXP806_ID }, 63 64 { .compatible = "x-powers,axp809", .data = (void *)AXP809_ID },
+90
drivers/mfd/axp20x.c
··· 42 42 "AXP223", 43 43 "AXP288", 44 44 "AXP313a", 45 + "AXP717", 45 46 "AXP803", 46 47 "AXP806", 47 48 "AXP809", ··· 208 207 .n_yes_ranges = ARRAY_SIZE(axp313a_volatile_ranges), 209 208 }; 210 209 210 + static const struct regmap_range axp717_writeable_ranges[] = { 211 + regmap_reg_range(AXP717_IRQ0_EN, AXP717_IRQ4_EN), 212 + regmap_reg_range(AXP717_DCDC_OUTPUT_CONTROL, AXP717_CPUSLDO_CONTROL), 213 + }; 214 + 215 + static const struct regmap_range axp717_volatile_ranges[] = { 216 + regmap_reg_range(AXP717_IRQ0_STATE, AXP717_IRQ4_STATE), 217 + }; 218 + 219 + static const struct regmap_access_table axp717_writeable_table = { 220 + .yes_ranges = axp717_writeable_ranges, 221 + .n_yes_ranges = ARRAY_SIZE(axp717_writeable_ranges), 222 + }; 223 + 224 + static const struct regmap_access_table axp717_volatile_table = { 225 + .yes_ranges = axp717_volatile_ranges, 226 + .n_yes_ranges = ARRAY_SIZE(axp717_volatile_ranges), 227 + }; 228 + 211 229 static const struct regmap_range axp806_volatile_ranges[] = { 212 230 regmap_reg_range(AXP20X_IRQ1_STATE, AXP20X_IRQ2_STATE), 213 231 }; ··· 337 317 DEFINE_RES_IRQ_NAMED(AXP313A_IRQ_PEK_FAL_EDGE, "PEK_DBF"), 338 318 }; 339 319 320 + static const struct resource axp717_pek_resources[] = { 321 + DEFINE_RES_IRQ_NAMED(AXP717_IRQ_PEK_RIS_EDGE, "PEK_DBR"), 322 + DEFINE_RES_IRQ_NAMED(AXP717_IRQ_PEK_FAL_EDGE, "PEK_DBF"), 323 + }; 324 + 340 325 static const struct resource axp803_pek_resources[] = { 341 326 DEFINE_RES_IRQ_NAMED(AXP803_IRQ_PEK_RIS_EDGE, "PEK_DBR"), 342 327 DEFINE_RES_IRQ_NAMED(AXP803_IRQ_PEK_FAL_EDGE, "PEK_DBF"), ··· 414 389 .volatile_table = &axp313a_volatile_table, 415 390 .max_register = AXP313A_IRQ_STATE, 416 391 .cache_type = REGCACHE_MAPLE, 392 + }; 393 + 394 + static const struct regmap_config axp717_regmap_config = { 395 + .reg_bits = 8, 396 + .val_bits = 8, 397 + .wr_table = &axp717_writeable_table, 398 + .volatile_table = &axp717_volatile_table, 399 + .max_register = AXP717_CPUSLDO_CONTROL, 400 + .cache_type = REGCACHE_RBTREE, 417 401 }; 418 402 419 403 static const struct regmap_config axp806_regmap_config = { ··· 623 589 INIT_REGMAP_IRQ(AXP313A, DIE_TEMP_HIGH, 0, 0), 624 590 }; 625 591 592 + static const struct regmap_irq axp717_regmap_irqs[] = { 593 + INIT_REGMAP_IRQ(AXP717, SOC_DROP_LVL2, 0, 7), 594 + INIT_REGMAP_IRQ(AXP717, SOC_DROP_LVL1, 0, 6), 595 + INIT_REGMAP_IRQ(AXP717, GAUGE_NEW_SOC, 0, 4), 596 + INIT_REGMAP_IRQ(AXP717, BOOST_OVER_V, 0, 2), 597 + INIT_REGMAP_IRQ(AXP717, VBUS_OVER_V, 0, 1), 598 + INIT_REGMAP_IRQ(AXP717, VBUS_FAULT, 0, 0), 599 + INIT_REGMAP_IRQ(AXP717, VBUS_PLUGIN, 1, 7), 600 + INIT_REGMAP_IRQ(AXP717, VBUS_REMOVAL, 1, 6), 601 + INIT_REGMAP_IRQ(AXP717, BATT_PLUGIN, 1, 5), 602 + INIT_REGMAP_IRQ(AXP717, BATT_REMOVAL, 1, 4), 603 + INIT_REGMAP_IRQ(AXP717, PEK_SHORT, 1, 3), 604 + INIT_REGMAP_IRQ(AXP717, PEK_LONG, 1, 2), 605 + INIT_REGMAP_IRQ(AXP717, PEK_FAL_EDGE, 1, 1), 606 + INIT_REGMAP_IRQ(AXP717, PEK_RIS_EDGE, 1, 0), 607 + INIT_REGMAP_IRQ(AXP717, WDOG_EXPIRE, 2, 7), 608 + INIT_REGMAP_IRQ(AXP717, LDO_OVER_CURR, 2, 6), 609 + INIT_REGMAP_IRQ(AXP717, BATT_OVER_CURR, 2, 5), 610 + INIT_REGMAP_IRQ(AXP717, CHARG_DONE, 2, 4), 611 + INIT_REGMAP_IRQ(AXP717, CHARG, 2, 3), 612 + INIT_REGMAP_IRQ(AXP717, DIE_TEMP_HIGH, 2, 2), 613 + INIT_REGMAP_IRQ(AXP717, CHARG_TIMER, 2, 1), 614 + INIT_REGMAP_IRQ(AXP717, BATT_OVER_V, 2, 0), 615 + INIT_REGMAP_IRQ(AXP717, BC_USB_DONE, 3, 7), 616 + INIT_REGMAP_IRQ(AXP717, BC_USB_CHNG, 3, 6), 617 + INIT_REGMAP_IRQ(AXP717, BATT_QUIT_TEMP_HIGH, 3, 4), 618 + INIT_REGMAP_IRQ(AXP717, BATT_CHG_TEMP_HIGH, 3, 3), 619 + INIT_REGMAP_IRQ(AXP717, BATT_CHG_TEMP_LOW, 3, 2), 620 + INIT_REGMAP_IRQ(AXP717, BATT_ACT_TEMP_HIGH, 3, 1), 621 + INIT_REGMAP_IRQ(AXP717, BATT_ACT_TEMP_LOW, 3, 0), 622 + INIT_REGMAP_IRQ(AXP717, TYPEC_REMOVE, 4, 6), 623 + INIT_REGMAP_IRQ(AXP717, TYPEC_PLUGIN, 4, 5), 624 + }; 625 + 626 626 static const struct regmap_irq axp803_regmap_irqs[] = { 627 627 INIT_REGMAP_IRQ(AXP803, ACIN_OVER_V, 0, 7), 628 628 INIT_REGMAP_IRQ(AXP803, ACIN_PLUGIN, 0, 6), ··· 844 776 .num_regs = 1, 845 777 }; 846 778 779 + static const struct regmap_irq_chip axp717_regmap_irq_chip = { 780 + .name = "axp717_irq_chip", 781 + .status_base = AXP717_IRQ0_STATE, 782 + .ack_base = AXP717_IRQ0_STATE, 783 + .unmask_base = AXP717_IRQ0_EN, 784 + .init_ack_masked = true, 785 + .irqs = axp717_regmap_irqs, 786 + .num_irqs = ARRAY_SIZE(axp717_regmap_irqs), 787 + .num_regs = 5, 788 + }; 789 + 847 790 static const struct regmap_irq_chip axp803_regmap_irq_chip = { 848 791 .name = "axp803", 849 792 .status_base = AXP20X_IRQ1_STATE, ··· 1018 939 static struct mfd_cell axp313a_cells[] = { 1019 940 MFD_CELL_NAME("axp20x-regulator"), 1020 941 MFD_CELL_RES("axp313a-pek", axp313a_pek_resources), 942 + }; 943 + 944 + static struct mfd_cell axp717_cells[] = { 945 + MFD_CELL_NAME("axp20x-regulator"), 946 + MFD_CELL_RES("axp20x-pek", axp717_pek_resources), 1021 947 }; 1022 948 1023 949 static const struct resource axp288_adc_resources[] = { ··· 1264 1180 axp20x->cells = axp313a_cells; 1265 1181 axp20x->regmap_cfg = &axp313a_regmap_config; 1266 1182 axp20x->regmap_irq_chip = &axp313a_regmap_irq_chip; 1183 + break; 1184 + case AXP717_ID: 1185 + axp20x->nr_cells = ARRAY_SIZE(axp717_cells); 1186 + axp20x->cells = axp717_cells; 1187 + axp20x->regmap_cfg = &axp717_regmap_config; 1188 + axp20x->regmap_irq_chip = &axp717_regmap_irq_chip; 1267 1189 break; 1268 1190 case AXP803_ID: 1269 1191 axp20x->nr_cells = ARRAY_SIZE(axp803_cells);
+8
drivers/regulator/Kconfig
··· 1415 1415 This driver supports the internal VMMC regulator in the STw481x 1416 1416 PMIC chips. 1417 1417 1418 + config REGULATOR_SUN20I 1419 + tristate "Allwinner D1 internal LDOs" 1420 + depends on ARCH_SUNXI || COMPILE_TEST 1421 + select MFD_SYSCON 1422 + default ARCH_SUNXI 1423 + help 1424 + This driver supports the internal LDOs in the Allwinner D1 SoC. 1425 + 1418 1426 config REGULATOR_SY7636A 1419 1427 tristate "Silergy SY7636A voltage regulator" 1420 1428 depends on MFD_SY7636A
+1
drivers/regulator/Makefile
··· 163 163 obj-$(CONFIG_REGULATOR_STM32_PWR) += stm32-pwr.o 164 164 obj-$(CONFIG_REGULATOR_STPMIC1) += stpmic1_regulator.o 165 165 obj-$(CONFIG_REGULATOR_STW481X_VMMC) += stw481x-vmmc.o 166 + obj-$(CONFIG_REGULATOR_SUN20I) += sun20i-regulator.o 166 167 obj-$(CONFIG_REGULATOR_SY7636A) += sy7636a-regulator.o 167 168 obj-$(CONFIG_REGULATOR_SY8106A) += sy8106a-regulator.o 168 169 obj-$(CONFIG_REGULATOR_SY8824X) += sy8824x.o
+89 -5
drivers/regulator/axp20x-regulator.c
··· 138 138 #define AXP313A_DCDC_V_OUT_MASK GENMASK(6, 0) 139 139 #define AXP313A_LDO_V_OUT_MASK GENMASK(4, 0) 140 140 141 + #define AXP717_DCDC1_NUM_VOLTAGES 88 142 + #define AXP717_DCDC2_NUM_VOLTAGES 107 143 + #define AXP717_DCDC3_NUM_VOLTAGES 104 144 + #define AXP717_DCDC_V_OUT_MASK GENMASK(6, 0) 145 + #define AXP717_LDO_V_OUT_MASK GENMASK(4, 0) 146 + 141 147 #define AXP803_PWR_OUT_DCDC1_MASK BIT_MASK(0) 142 148 #define AXP803_PWR_OUT_DCDC2_MASK BIT_MASK(1) 143 149 #define AXP803_PWR_OUT_DCDC3_MASK BIT_MASK(2) ··· 739 733 static const struct regulator_desc axp313a_regulators[] = { 740 734 AXP_DESC_RANGES(AXP313A, DCDC1, "dcdc1", "vin1", 741 735 axp313a_dcdc1_ranges, AXP313A_DCDC1_NUM_VOLTAGES, 742 - AXP313A_DCDC1_CONRTOL, AXP313A_DCDC_V_OUT_MASK, 736 + AXP313A_DCDC1_CONTROL, AXP313A_DCDC_V_OUT_MASK, 743 737 AXP313A_OUTPUT_CONTROL, BIT(0)), 744 738 AXP_DESC_RANGES(AXP313A, DCDC2, "dcdc2", "vin2", 745 739 axp313a_dcdc2_ranges, AXP313A_DCDC23_NUM_VOLTAGES, 746 - AXP313A_DCDC2_CONRTOL, AXP313A_DCDC_V_OUT_MASK, 740 + AXP313A_DCDC2_CONTROL, AXP313A_DCDC_V_OUT_MASK, 747 741 AXP313A_OUTPUT_CONTROL, BIT(1)), 748 742 AXP_DESC_RANGES(AXP313A, DCDC3, "dcdc3", "vin3", 749 743 axp313a_dcdc3_ranges, AXP313A_DCDC23_NUM_VOLTAGES, 750 - AXP313A_DCDC3_CONRTOL, AXP313A_DCDC_V_OUT_MASK, 744 + AXP313A_DCDC3_CONTROL, AXP313A_DCDC_V_OUT_MASK, 751 745 AXP313A_OUTPUT_CONTROL, BIT(2)), 752 746 AXP_DESC(AXP313A, ALDO1, "aldo1", "vin1", 500, 3500, 100, 753 - AXP313A_ALDO1_CONRTOL, AXP313A_LDO_V_OUT_MASK, 747 + AXP313A_ALDO1_CONTROL, AXP313A_LDO_V_OUT_MASK, 754 748 AXP313A_OUTPUT_CONTROL, BIT(3)), 755 749 AXP_DESC(AXP313A, DLDO1, "dldo1", "vin1", 500, 3500, 100, 756 - AXP313A_DLDO1_CONRTOL, AXP313A_LDO_V_OUT_MASK, 750 + AXP313A_DLDO1_CONTROL, AXP313A_LDO_V_OUT_MASK, 757 751 AXP313A_OUTPUT_CONTROL, BIT(4)), 758 752 AXP_DESC_FIXED(AXP313A, RTC_LDO, "rtc-ldo", "vin1", 1800), 753 + }; 754 + 755 + static const struct linear_range axp717_dcdc1_ranges[] = { 756 + REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), 757 + REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000), 758 + }; 759 + 760 + static const struct linear_range axp717_dcdc2_ranges[] = { 761 + REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), 762 + REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000), 763 + REGULATOR_LINEAR_RANGE(1600000, 88, 107, 100000), 764 + }; 765 + 766 + static const struct linear_range axp717_dcdc3_ranges[] = { 767 + REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), 768 + REGULATOR_LINEAR_RANGE(1220000, 71, 102, 20000), 769 + }; 770 + 771 + static const struct regulator_desc axp717_regulators[] = { 772 + AXP_DESC_RANGES(AXP717, DCDC1, "dcdc1", "vin1", 773 + axp717_dcdc1_ranges, AXP717_DCDC1_NUM_VOLTAGES, 774 + AXP717_DCDC1_CONTROL, AXP717_DCDC_V_OUT_MASK, 775 + AXP717_DCDC_OUTPUT_CONTROL, BIT(0)), 776 + AXP_DESC_RANGES(AXP717, DCDC2, "dcdc2", "vin2", 777 + axp717_dcdc2_ranges, AXP717_DCDC2_NUM_VOLTAGES, 778 + AXP717_DCDC2_CONTROL, AXP717_DCDC_V_OUT_MASK, 779 + AXP717_DCDC_OUTPUT_CONTROL, BIT(1)), 780 + AXP_DESC_RANGES(AXP717, DCDC3, "dcdc3", "vin3", 781 + axp717_dcdc3_ranges, AXP717_DCDC3_NUM_VOLTAGES, 782 + AXP717_DCDC3_CONTROL, AXP717_DCDC_V_OUT_MASK, 783 + AXP717_DCDC_OUTPUT_CONTROL, BIT(2)), 784 + AXP_DESC(AXP717, DCDC4, "dcdc4", "vin4", 1000, 3700, 100, 785 + AXP717_DCDC4_CONTROL, AXP717_DCDC_V_OUT_MASK, 786 + AXP717_DCDC_OUTPUT_CONTROL, BIT(3)), 787 + AXP_DESC(AXP717, ALDO1, "aldo1", "vin1", 500, 3500, 100, 788 + AXP717_ALDO1_CONTROL, AXP717_LDO_V_OUT_MASK, 789 + AXP717_LDO0_OUTPUT_CONTROL, BIT(0)), 790 + AXP_DESC(AXP717, ALDO2, "aldo2", "vin1", 500, 3500, 100, 791 + AXP717_ALDO2_CONTROL, AXP717_LDO_V_OUT_MASK, 792 + AXP717_LDO0_OUTPUT_CONTROL, BIT(1)), 793 + AXP_DESC(AXP717, ALDO3, "aldo3", "vin1", 500, 3500, 100, 794 + AXP717_ALDO3_CONTROL, AXP717_LDO_V_OUT_MASK, 795 + AXP717_LDO0_OUTPUT_CONTROL, BIT(2)), 796 + AXP_DESC(AXP717, ALDO4, "aldo4", "vin1", 500, 3500, 100, 797 + AXP717_ALDO4_CONTROL, AXP717_LDO_V_OUT_MASK, 798 + AXP717_LDO0_OUTPUT_CONTROL, BIT(3)), 799 + AXP_DESC(AXP717, BLDO1, "bldo1", "vin1", 500, 3500, 100, 800 + AXP717_BLDO1_CONTROL, AXP717_LDO_V_OUT_MASK, 801 + AXP717_LDO0_OUTPUT_CONTROL, BIT(4)), 802 + AXP_DESC(AXP717, BLDO2, "bldo2", "vin1", 500, 3500, 100, 803 + AXP717_BLDO2_CONTROL, AXP717_LDO_V_OUT_MASK, 804 + AXP717_LDO0_OUTPUT_CONTROL, BIT(5)), 805 + AXP_DESC(AXP717, BLDO3, "bldo3", "vin1", 500, 3500, 100, 806 + AXP717_BLDO3_CONTROL, AXP717_LDO_V_OUT_MASK, 807 + AXP717_LDO0_OUTPUT_CONTROL, BIT(6)), 808 + AXP_DESC(AXP717, BLDO4, "bldo4", "vin1", 500, 3500, 100, 809 + AXP717_BLDO4_CONTROL, AXP717_LDO_V_OUT_MASK, 810 + AXP717_LDO0_OUTPUT_CONTROL, BIT(7)), 811 + AXP_DESC(AXP717, CLDO1, "cldo1", "vin1", 500, 3500, 100, 812 + AXP717_CLDO1_CONTROL, AXP717_LDO_V_OUT_MASK, 813 + AXP717_LDO1_OUTPUT_CONTROL, BIT(0)), 814 + AXP_DESC(AXP717, CLDO2, "cldo2", "vin1", 500, 3500, 100, 815 + AXP717_CLDO2_CONTROL, AXP717_LDO_V_OUT_MASK, 816 + AXP717_LDO1_OUTPUT_CONTROL, BIT(1)), 817 + AXP_DESC(AXP717, CLDO3, "cldo3", "vin1", 500, 3500, 100, 818 + AXP717_CLDO3_CONTROL, AXP717_LDO_V_OUT_MASK, 819 + AXP717_LDO1_OUTPUT_CONTROL, BIT(2)), 820 + AXP_DESC(AXP717, CLDO4, "cldo4", "vin1", 500, 3500, 100, 821 + AXP717_CLDO4_CONTROL, AXP717_LDO_V_OUT_MASK, 822 + AXP717_LDO1_OUTPUT_CONTROL, BIT(3)), 823 + AXP_DESC(AXP717, CPUSLDO, "cpusldo", "vin1", 500, 1400, 50, 824 + AXP717_CPUSLDO_CONTROL, AXP717_LDO_V_OUT_MASK, 825 + AXP717_LDO1_OUTPUT_CONTROL, BIT(4)), 759 826 }; 760 827 761 828 /* DCDC ranges shared with AXP813 */ ··· 1332 1253 step = 150; 1333 1254 break; 1334 1255 case AXP313A_ID: 1256 + case AXP717_ID: 1335 1257 case AXP15060_ID: 1336 1258 /* The DCDC PWM frequency seems to be fixed to 3 MHz. */ 1337 1259 if (dcdcfreq != 0) { ··· 1558 1478 case AXP313A_ID: 1559 1479 regulators = axp313a_regulators; 1560 1480 nregulators = AXP313A_REG_ID_MAX; 1481 + break; 1482 + case AXP717_ID: 1483 + regulators = axp717_regulators; 1484 + nregulators = AXP717_REG_ID_MAX; 1561 1485 break; 1562 1486 case AXP803_ID: 1563 1487 regulators = axp803_regulators;
+2 -2
drivers/regulator/core.c
··· 2200 2200 2201 2201 if (!have_full_constraints()) { 2202 2202 dev_warn(dev, 2203 - "incomplete constraints, dummy supplies not allowed\n"); 2203 + "incomplete constraints, dummy supplies not allowed (id=%s)\n", id); 2204 2204 return ERR_PTR(-ENODEV); 2205 2205 } 2206 2206 ··· 2218 2218 2219 2219 case EXCLUSIVE_GET: 2220 2220 dev_warn(dev, 2221 - "dummy supplies not allowed for exclusive requests\n"); 2221 + "dummy supplies not allowed for exclusive requests (id=%s)\n", id); 2222 2222 fallthrough; 2223 2223 2224 2224 default:
+2 -2
drivers/regulator/da9121-regulator.c
··· 872 872 .rd_table = &da9121_1ch_readable_table, 873 873 .wr_table = &da9121_1ch_writeable_table, 874 874 .volatile_table = &da9121_volatile_table, 875 - .cache_type = REGCACHE_RBTREE, 875 + .cache_type = REGCACHE_MAPLE, 876 876 }; 877 877 878 878 /* DA9121 regmap config for 2 channel variants */ ··· 883 883 .rd_table = &da9121_2ch_readable_table, 884 884 .wr_table = &da9121_2ch_writeable_table, 885 885 .volatile_table = &da9121_volatile_table, 886 - .cache_type = REGCACHE_RBTREE, 886 + .cache_type = REGCACHE_MAPLE, 887 887 }; 888 888 889 889 static int da9121_check_device_type(struct i2c_client *i2c, struct da9121 *chip)
+1 -1
drivers/regulator/da9211-regulator.c
··· 68 68 .val_bits = 8, 69 69 .max_register = 5 * 128, 70 70 .volatile_reg = da9211_volatile_reg, 71 - .cache_type = REGCACHE_RBTREE, 71 + .cache_type = REGCACHE_MAPLE, 72 72 .ranges = da9211_regmap_range, 73 73 .num_ranges = ARRAY_SIZE(da9211_regmap_range), 74 74 };
+59
drivers/regulator/devres.c
··· 145 145 } 146 146 EXPORT_SYMBOL_GPL(devm_regulator_get_optional); 147 147 148 + /** 149 + * devm_regulator_get_enable_read_voltage - Resource managed regulator get and 150 + * enable that returns the voltage 151 + * @dev: device to supply 152 + * @id: supply name or regulator ID. 153 + * 154 + * Get and enable regulator for duration of the device life-time. 155 + * regulator_disable() and regulator_put() are automatically called on driver 156 + * detach. See regulator_get_optional(), regulator_enable(), and 157 + * regulator_get_voltage() for more information. 158 + * 159 + * This is a convenience function for supplies that provide a reference voltage 160 + * where the consumer driver just needs to know the voltage and keep the 161 + * regulator enabled. 162 + * 163 + * In cases where the supply is not strictly required, callers can check for 164 + * -ENODEV error and handle it accordingly. 165 + * 166 + * Returns: voltage in microvolts on success, or an error code on failure. 167 + */ 168 + int devm_regulator_get_enable_read_voltage(struct device *dev, const char *id) 169 + { 170 + struct regulator *r; 171 + int ret; 172 + 173 + /* 174 + * Since we need a real voltage, we use devm_regulator_get_optional() 175 + * rather than getting a dummy regulator with devm_regulator_get() and 176 + * then letting regulator_get_voltage() fail with -EINVAL. This way, the 177 + * caller can handle the -ENODEV error code if needed instead of the 178 + * ambiguous -EINVAL. 179 + */ 180 + r = devm_regulator_get_optional(dev, id); 181 + if (IS_ERR(r)) 182 + return PTR_ERR(r); 183 + 184 + ret = regulator_enable(r); 185 + if (ret) 186 + goto err_regulator_put; 187 + 188 + ret = devm_add_action_or_reset(dev, regulator_action_disable, r); 189 + if (ret) 190 + goto err_regulator_put; 191 + 192 + ret = regulator_get_voltage(r); 193 + if (ret < 0) 194 + goto err_release_action; 195 + 196 + return ret; 197 + 198 + err_release_action: 199 + devm_release_action(dev, regulator_action_disable, r); 200 + err_regulator_put: 201 + devm_regulator_put(r); 202 + 203 + return ret; 204 + } 205 + EXPORT_SYMBOL_GPL(devm_regulator_get_enable_read_voltage); 206 + 148 207 static int devm_regulator_match(struct device *dev, void *res, void *data) 149 208 { 150 209 struct regulator **r = res;
+1 -1
drivers/regulator/isl9305.c
··· 134 134 .val_bits = 8, 135 135 136 136 .max_register = ISL9305_MAX_REG, 137 - .cache_type = REGCACHE_RBTREE, 137 + .cache_type = REGCACHE_MAPLE, 138 138 }; 139 139 140 140 static int isl9305_i2c_probe(struct i2c_client *i2c)
+1 -1
drivers/regulator/max8973-regulator.c
··· 510 510 .reg_bits = 8, 511 511 .val_bits = 8, 512 512 .max_register = MAX8973_CHIPID2, 513 - .cache_type = REGCACHE_RBTREE, 513 + .cache_type = REGCACHE_MAPLE, 514 514 }; 515 515 516 516 static struct max8973_regulator_platform_data *max8973_parse_dt(
+1 -1
drivers/regulator/mt6311-regulator.c
··· 20 20 .reg_bits = 8, 21 21 .val_bits = 8, 22 22 .max_register = MT6311_FQMTR_CON4, 23 - .cache_type = REGCACHE_RBTREE, 23 + .cache_type = REGCACHE_MAPLE, 24 24 }; 25 25 26 26 /* Default limits measured in millivolts and milliamps */
+193 -3
drivers/regulator/pca9450-regulator.c
··· 53 53 .val_bits = 8, 54 54 .volatile_table = &pca9450_volatile_regs, 55 55 .max_register = PCA9450_MAX_REGISTER - 1, 56 - .cache_type = REGCACHE_RBTREE, 56 + .cache_type = REGCACHE_MAPLE, 57 57 }; 58 58 59 59 /* ··· 104 104 */ 105 105 static const struct linear_range pca9450_dvs_buck_volts[] = { 106 106 REGULATOR_LINEAR_RANGE(600000, 0x00, 0x7F, 12500), 107 + }; 108 + 109 + /* 110 + * BUCK1/3 111 + * 0.65 to 2.2375V (12.5mV step) 112 + */ 113 + static const struct linear_range pca9451a_dvs_buck_volts[] = { 114 + REGULATOR_LINEAR_RANGE(650000, 0x00, 0x7F, 12500), 107 115 }; 108 116 109 117 /* ··· 670 662 }, 671 663 }; 672 664 665 + static const struct pca9450_regulator_desc pca9451a_regulators[] = { 666 + { 667 + .desc = { 668 + .name = "buck1", 669 + .of_match = of_match_ptr("BUCK1"), 670 + .regulators_node = of_match_ptr("regulators"), 671 + .id = PCA9450_BUCK1, 672 + .ops = &pca9450_dvs_buck_regulator_ops, 673 + .type = REGULATOR_VOLTAGE, 674 + .n_voltages = PCA9450_BUCK1_VOLTAGE_NUM, 675 + .linear_ranges = pca9451a_dvs_buck_volts, 676 + .n_linear_ranges = ARRAY_SIZE(pca9451a_dvs_buck_volts), 677 + .vsel_reg = PCA9450_REG_BUCK1OUT_DVS0, 678 + .vsel_mask = BUCK1OUT_DVS0_MASK, 679 + .enable_reg = PCA9450_REG_BUCK1CTRL, 680 + .enable_mask = BUCK1_ENMODE_MASK, 681 + .enable_val = BUCK_ENMODE_ONREQ, 682 + .ramp_mask = BUCK1_RAMP_MASK, 683 + .ramp_delay_table = pca9450_dvs_buck_ramp_table, 684 + .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table), 685 + .owner = THIS_MODULE, 686 + .of_parse_cb = pca9450_set_dvs_levels, 687 + }, 688 + .dvs = { 689 + .run_reg = PCA9450_REG_BUCK1OUT_DVS0, 690 + .run_mask = BUCK1OUT_DVS0_MASK, 691 + .standby_reg = PCA9450_REG_BUCK1OUT_DVS1, 692 + .standby_mask = BUCK1OUT_DVS1_MASK, 693 + }, 694 + }, 695 + { 696 + .desc = { 697 + .name = "buck2", 698 + .of_match = of_match_ptr("BUCK2"), 699 + .regulators_node = of_match_ptr("regulators"), 700 + .id = PCA9450_BUCK2, 701 + .ops = &pca9450_dvs_buck_regulator_ops, 702 + .type = REGULATOR_VOLTAGE, 703 + .n_voltages = PCA9450_BUCK2_VOLTAGE_NUM, 704 + .linear_ranges = pca9450_dvs_buck_volts, 705 + .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts), 706 + .vsel_reg = PCA9450_REG_BUCK2OUT_DVS0, 707 + .vsel_mask = BUCK2OUT_DVS0_MASK, 708 + .enable_reg = PCA9450_REG_BUCK2CTRL, 709 + .enable_mask = BUCK2_ENMODE_MASK, 710 + .enable_val = BUCK_ENMODE_ONREQ_STBYREQ, 711 + .ramp_mask = BUCK2_RAMP_MASK, 712 + .ramp_delay_table = pca9450_dvs_buck_ramp_table, 713 + .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table), 714 + .owner = THIS_MODULE, 715 + .of_parse_cb = pca9450_set_dvs_levels, 716 + }, 717 + .dvs = { 718 + .run_reg = PCA9450_REG_BUCK2OUT_DVS0, 719 + .run_mask = BUCK2OUT_DVS0_MASK, 720 + .standby_reg = PCA9450_REG_BUCK2OUT_DVS1, 721 + .standby_mask = BUCK2OUT_DVS1_MASK, 722 + }, 723 + }, 724 + { 725 + .desc = { 726 + .name = "buck4", 727 + .of_match = of_match_ptr("BUCK4"), 728 + .regulators_node = of_match_ptr("regulators"), 729 + .id = PCA9450_BUCK4, 730 + .ops = &pca9450_buck_regulator_ops, 731 + .type = REGULATOR_VOLTAGE, 732 + .n_voltages = PCA9450_BUCK4_VOLTAGE_NUM, 733 + .linear_ranges = pca9450_buck_volts, 734 + .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts), 735 + .vsel_reg = PCA9450_REG_BUCK4OUT, 736 + .vsel_mask = BUCK4OUT_MASK, 737 + .enable_reg = PCA9450_REG_BUCK4CTRL, 738 + .enable_mask = BUCK4_ENMODE_MASK, 739 + .enable_val = BUCK_ENMODE_ONREQ, 740 + .owner = THIS_MODULE, 741 + }, 742 + }, 743 + { 744 + .desc = { 745 + .name = "buck5", 746 + .of_match = of_match_ptr("BUCK5"), 747 + .regulators_node = of_match_ptr("regulators"), 748 + .id = PCA9450_BUCK5, 749 + .ops = &pca9450_buck_regulator_ops, 750 + .type = REGULATOR_VOLTAGE, 751 + .n_voltages = PCA9450_BUCK5_VOLTAGE_NUM, 752 + .linear_ranges = pca9450_buck_volts, 753 + .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts), 754 + .vsel_reg = PCA9450_REG_BUCK5OUT, 755 + .vsel_mask = BUCK5OUT_MASK, 756 + .enable_reg = PCA9450_REG_BUCK5CTRL, 757 + .enable_mask = BUCK5_ENMODE_MASK, 758 + .enable_val = BUCK_ENMODE_ONREQ, 759 + .owner = THIS_MODULE, 760 + }, 761 + }, 762 + { 763 + .desc = { 764 + .name = "buck6", 765 + .of_match = of_match_ptr("BUCK6"), 766 + .regulators_node = of_match_ptr("regulators"), 767 + .id = PCA9450_BUCK6, 768 + .ops = &pca9450_buck_regulator_ops, 769 + .type = REGULATOR_VOLTAGE, 770 + .n_voltages = PCA9450_BUCK6_VOLTAGE_NUM, 771 + .linear_ranges = pca9450_buck_volts, 772 + .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts), 773 + .vsel_reg = PCA9450_REG_BUCK6OUT, 774 + .vsel_mask = BUCK6OUT_MASK, 775 + .enable_reg = PCA9450_REG_BUCK6CTRL, 776 + .enable_mask = BUCK6_ENMODE_MASK, 777 + .enable_val = BUCK_ENMODE_ONREQ, 778 + .owner = THIS_MODULE, 779 + }, 780 + }, 781 + { 782 + .desc = { 783 + .name = "ldo1", 784 + .of_match = of_match_ptr("LDO1"), 785 + .regulators_node = of_match_ptr("regulators"), 786 + .id = PCA9450_LDO1, 787 + .ops = &pca9450_ldo_regulator_ops, 788 + .type = REGULATOR_VOLTAGE, 789 + .n_voltages = PCA9450_LDO1_VOLTAGE_NUM, 790 + .linear_ranges = pca9450_ldo1_volts, 791 + .n_linear_ranges = ARRAY_SIZE(pca9450_ldo1_volts), 792 + .vsel_reg = PCA9450_REG_LDO1CTRL, 793 + .vsel_mask = LDO1OUT_MASK, 794 + .enable_reg = PCA9450_REG_LDO1CTRL, 795 + .enable_mask = LDO1_EN_MASK, 796 + .owner = THIS_MODULE, 797 + }, 798 + }, 799 + { 800 + .desc = { 801 + .name = "ldo4", 802 + .of_match = of_match_ptr("LDO4"), 803 + .regulators_node = of_match_ptr("regulators"), 804 + .id = PCA9450_LDO4, 805 + .ops = &pca9450_ldo_regulator_ops, 806 + .type = REGULATOR_VOLTAGE, 807 + .n_voltages = PCA9450_LDO4_VOLTAGE_NUM, 808 + .linear_ranges = pca9450_ldo34_volts, 809 + .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts), 810 + .vsel_reg = PCA9450_REG_LDO4CTRL, 811 + .vsel_mask = LDO4OUT_MASK, 812 + .enable_reg = PCA9450_REG_LDO4CTRL, 813 + .enable_mask = LDO4_EN_MASK, 814 + .owner = THIS_MODULE, 815 + }, 816 + }, 817 + { 818 + .desc = { 819 + .name = "ldo5", 820 + .of_match = of_match_ptr("LDO5"), 821 + .regulators_node = of_match_ptr("regulators"), 822 + .id = PCA9450_LDO5, 823 + .ops = &pca9450_ldo_regulator_ops, 824 + .type = REGULATOR_VOLTAGE, 825 + .n_voltages = PCA9450_LDO5_VOLTAGE_NUM, 826 + .linear_ranges = pca9450_ldo5_volts, 827 + .n_linear_ranges = ARRAY_SIZE(pca9450_ldo5_volts), 828 + .vsel_reg = PCA9450_REG_LDO5CTRL_H, 829 + .vsel_mask = LDO5HOUT_MASK, 830 + .enable_reg = PCA9450_REG_LDO5CTRL_H, 831 + .enable_mask = LDO5H_EN_MASK, 832 + .owner = THIS_MODULE, 833 + }, 834 + }, 835 + }; 836 + 673 837 static irqreturn_t pca9450_irq_handler(int irq, void *data) 674 838 { 675 839 struct pca9450 *pca9450 = data; ··· 909 729 regulator_desc = pca9450bc_regulators; 910 730 pca9450->rcnt = ARRAY_SIZE(pca9450bc_regulators); 911 731 break; 732 + case PCA9450_TYPE_PCA9451A: 733 + regulator_desc = pca9451a_regulators; 734 + pca9450->rcnt = ARRAY_SIZE(pca9451a_regulators); 735 + break; 912 736 default: 913 737 dev_err(&i2c->dev, "Unknown device type"); 914 738 return -EINVAL; ··· 939 755 940 756 /* Check your board and dts for match the right pmic */ 941 757 if (((device_id >> 4) != 0x1 && type == PCA9450_TYPE_PCA9450A) || 942 - ((device_id >> 4) != 0x3 && type == PCA9450_TYPE_PCA9450BC)) { 758 + ((device_id >> 4) != 0x3 && type == PCA9450_TYPE_PCA9450BC) || 759 + ((device_id >> 4) != 0x9 && type == PCA9450_TYPE_PCA9451A)) { 943 760 dev_err(&i2c->dev, "Device id(%x) mismatched\n", 944 761 device_id >> 4); 945 762 return -EINVAL; ··· 1031 846 } 1032 847 1033 848 dev_info(&i2c->dev, "%s probed.\n", 1034 - type == PCA9450_TYPE_PCA9450A ? "pca9450a" : "pca9450bc"); 849 + type == PCA9450_TYPE_PCA9450A ? "pca9450a" : 850 + (type == PCA9450_TYPE_PCA9451A ? "pca9451a" : "pca9450bc")); 1035 851 1036 852 return 0; 1037 853 } ··· 1049 863 { 1050 864 .compatible = "nxp,pca9450c", 1051 865 .data = (void *)PCA9450_TYPE_PCA9450BC, 866 + }, 867 + { 868 + .compatible = "nxp,pca9451a", 869 + .data = (void *)PCA9450_TYPE_PCA9451A, 1052 870 }, 1053 871 { } 1054 872 };
+1 -1
drivers/regulator/pf8x00-regulator.c
··· 142 142 .reg_bits = 8, 143 143 .val_bits = 8, 144 144 .max_register = PF8X00_PAGE_SELECT, 145 - .cache_type = REGCACHE_RBTREE, 145 + .cache_type = REGCACHE_MAPLE, 146 146 }; 147 147 148 148 /* VLDOx output: 1.5V to 5.0V */
+1 -1
drivers/regulator/pfuze100-regulator.c
··· 680 680 .reg_bits = 8, 681 681 .val_bits = 8, 682 682 .max_register = PFUZE_NUMREGS - 1, 683 - .cache_type = REGCACHE_RBTREE, 683 + .cache_type = REGCACHE_MAPLE, 684 684 }; 685 685 686 686 static int pfuze100_regulator_probe(struct i2c_client *client)
+1 -1
drivers/regulator/rpi-panel-attiny-regulator.c
··· 75 75 .val_bits = 8, 76 76 .disable_locking = 1, 77 77 .max_register = REG_WRITE_DATA_L, 78 - .cache_type = REGCACHE_RBTREE, 78 + .cache_type = REGCACHE_MAPLE, 79 79 }; 80 80 81 81 static int attiny_set_port_state(struct attiny_lcd *state, int reg, u8 val)
+1 -1
drivers/regulator/rtmv20-regulator.c
··· 312 312 static const struct regmap_config rtmv20_regmap_config = { 313 313 .reg_bits = 8, 314 314 .val_bits = 8, 315 - .cache_type = REGCACHE_RBTREE, 315 + .cache_type = REGCACHE_MAPLE, 316 316 .max_register = RTMV20_REG_LDMASK, 317 317 .num_reg_defaults_raw = RTMV20_MAX_REGS, 318 318
+61 -39
drivers/regulator/rtq2208-regulator.c
··· 26 26 #define RTQ2208_REG_BUCK_H_CFG0 0xA2 27 27 #define RTQ2208_REG_LDO1_CFG 0xB1 28 28 #define RTQ2208_REG_LDO2_CFG 0xC1 29 + #define RTQ2208_REG_LDO_DVS_CTRL 0xD0 29 30 30 31 /* Mask */ 31 32 #define RTQ2208_BUCK_NR_MTP_SEL_MASK GENMASK(7, 0) ··· 41 40 #define RTQ2208_EN_DIS_MASK BIT(0) 42 41 #define RTQ2208_BUCK_RAMP_SEL_MASK GENMASK(2, 0) 43 42 #define RTQ2208_HD_INT_MASK BIT(0) 43 + #define RTQ2208_LDO1_DISCHG_EN_MASK BIT(4) 44 + #define RTQ2208_LDO1_VOSEL_SD_MASK BIT(5) 45 + #define RTQ2208_LDO2_DISCHG_EN_MASK BIT(6) 46 + #define RTQ2208_LDO2_VOSEL_SD_MASK BIT(7) 44 47 45 48 /* Size */ 46 49 #define RTQ2208_VOUT_MAXNUM 256 ··· 322 317 return IRQ_HANDLED; 323 318 } 324 319 325 - #define RTQ2208_REGULATOR_INFO(_name, _base) \ 326 - { \ 327 - .name = #_name, \ 328 - .base = _base, \ 329 - } 330 - #define BUCK_RG_BASE(_id) RTQ2208_REG_BUCK_##_id##_CFG0 331 - #define BUCK_RG_SHIFT(_base, _shift) (_base + _shift) 332 - #define LDO_RG_BASE(_id) RTQ2208_REG_LDO##_id##_CFG 333 - #define LDO_RG_SHIFT(_base, _shift) (_base + _shift) 334 - #define VSEL_SHIFT(_sel) (_sel ? 3 : 1) 335 - #define MTP_SEL_MASK(_sel) RTQ2208_BUCK_EN_NR_MTP_SEL##_sel##_MASK 336 - 337 - static const struct linear_range rtq2208_vout_range[] = { 338 - REGULATOR_LINEAR_RANGE(400000, 0, 180, 5000), 339 - REGULATOR_LINEAR_RANGE(1310000, 181, 255, 10000), 340 - }; 341 - 342 320 static int rtq2208_of_get_fixed_voltage(struct device *dev, 343 321 struct of_regulator_match *rtq2208_ldo_match, int n_fixed) 344 322 { ··· 360 372 return 0; 361 373 } 362 374 375 + 376 + #define BUCK_INFO(_name, _id) \ 377 + { \ 378 + .name = _name, \ 379 + .base = RTQ2208_REG_BUCK_##_id##_CFG0, \ 380 + .enable_reg = BUCK_RG_SHIFT(RTQ2208_REG_BUCK_##_id##_CFG0, 2), \ 381 + .dis_reg = RTQ2208_REG_BUCK_##_id##_CFG0, \ 382 + } 383 + 384 + #define LDO_INFO(_name, _id) \ 385 + { \ 386 + .name = _name, \ 387 + .base = RTQ2208_REG_LDO##_id##_CFG, \ 388 + .enable_reg = RTQ2208_REG_LDO##_id##_CFG, \ 389 + .dis_mask = RTQ2208_LDO##_id##_DISCHG_EN_MASK, \ 390 + .dis_on = RTQ2208_LDO##_id##_DISCHG_EN_MASK, \ 391 + .vsel_mask = RTQ2208_LDO##_id##_VOSEL_SD_MASK, \ 392 + } 393 + 394 + #define BUCK_RG_SHIFT(_base, _shift) (_base + _shift) 395 + #define VSEL_SHIFT(_sel) (_sel ? 3 : 1) 396 + #define MTP_SEL_MASK(_sel) RTQ2208_BUCK_EN_NR_MTP_SEL##_sel##_MASK 397 + 398 + static const struct linear_range rtq2208_vout_range[] = { 399 + REGULATOR_LINEAR_RANGE(400000, 0, 180, 5000), 400 + REGULATOR_LINEAR_RANGE(1310000, 181, 255, 10000), 401 + }; 402 + 363 403 static void rtq2208_init_regulator_desc(struct rtq2208_regulator_desc *rdesc, int mtp_sel, 364 404 int idx, struct of_regulator_match *rtq2208_ldo_match, int *ldo_idx) 365 405 { ··· 395 379 static const struct { 396 380 char *name; 397 381 int base; 382 + int enable_reg; 383 + int dis_reg; 384 + int dis_mask; 385 + int dis_on; 386 + int vsel_mask; 398 387 } regulator_info[] = { 399 - RTQ2208_REGULATOR_INFO(buck-b, BUCK_RG_BASE(B)), 400 - RTQ2208_REGULATOR_INFO(buck-c, BUCK_RG_BASE(C)), 401 - RTQ2208_REGULATOR_INFO(buck-d, BUCK_RG_BASE(D)), 402 - RTQ2208_REGULATOR_INFO(buck-a, BUCK_RG_BASE(A)), 403 - RTQ2208_REGULATOR_INFO(buck-f, BUCK_RG_BASE(F)), 404 - RTQ2208_REGULATOR_INFO(buck-g, BUCK_RG_BASE(G)), 405 - RTQ2208_REGULATOR_INFO(buck-h, BUCK_RG_BASE(H)), 406 - RTQ2208_REGULATOR_INFO(buck-e, BUCK_RG_BASE(E)), 407 - RTQ2208_REGULATOR_INFO(ldo2, LDO_RG_BASE(2)), 408 - RTQ2208_REGULATOR_INFO(ldo1, LDO_RG_BASE(1)), 388 + BUCK_INFO("buck-b", B), 389 + BUCK_INFO("buck-c", C), 390 + BUCK_INFO("buck-d", D), 391 + BUCK_INFO("buck-a", A), 392 + BUCK_INFO("buck-f", F), 393 + BUCK_INFO("buck-g", G), 394 + BUCK_INFO("buck-h", H), 395 + BUCK_INFO("buck-e", E), 396 + LDO_INFO("ldo2", 2), 397 + LDO_INFO("ldo1", 1), 409 398 }, *curr_info; 410 399 411 400 curr_info = regulator_info + idx; ··· 422 401 desc->owner = THIS_MODULE; 423 402 desc->type = REGULATOR_VOLTAGE; 424 403 desc->enable_mask = mtp_sel ? MTP_SEL_MASK(1) : MTP_SEL_MASK(0); 425 - desc->active_discharge_on = RTQ2208_EN_DIS_MASK; 404 + desc->enable_reg = curr_info->enable_reg; 426 405 desc->active_discharge_off = 0; 427 - desc->active_discharge_mask = RTQ2208_EN_DIS_MASK; 428 406 429 407 rdesc->mode_mask = RTQ2208_BUCK_NRMODE_MASK; 430 408 431 409 if (idx >= RTQ2208_BUCK_B && idx <= RTQ2208_BUCK_E) { 432 410 /* init buck desc */ 433 - desc->enable_reg = BUCK_RG_SHIFT(curr_info->base, 2); 434 411 desc->ops = &rtq2208_regulator_buck_ops; 435 412 desc->vsel_reg = curr_info->base + VSEL_SHIFT(mtp_sel); 436 413 desc->vsel_mask = RTQ2208_BUCK_NR_MTP_SEL_MASK; ··· 436 417 desc->linear_ranges = rtq2208_vout_range; 437 418 desc->n_linear_ranges = ARRAY_SIZE(rtq2208_vout_range); 438 419 desc->ramp_reg = BUCK_RG_SHIFT(curr_info->base, 5); 439 - desc->active_discharge_reg = curr_info->base; 440 420 desc->of_map_mode = rtq2208_of_map_mode; 421 + desc->active_discharge_reg = curr_info->dis_reg; 422 + desc->active_discharge_on = RTQ2208_EN_DIS_MASK; 423 + desc->active_discharge_mask = RTQ2208_EN_DIS_MASK; 441 424 442 425 rdesc->mode_reg = BUCK_RG_SHIFT(curr_info->base, 2); 443 426 rdesc->suspend_config_reg = BUCK_RG_SHIFT(curr_info->base, 4); ··· 447 426 rdesc->suspend_mode_mask = RTQ2208_BUCK_STRMODE_MASK; 448 427 } else { 449 428 /* init ldo desc */ 450 - desc->enable_reg = curr_info->base; 451 - desc->ops = &rtq2208_regulator_ldo_ops; 452 - desc->n_voltages = 1; 453 - desc->active_discharge_reg = LDO_RG_SHIFT(curr_info->base, 2); 454 - 455 - rtq2208_ldo_match[*ldo_idx].name = desc->name; 456 - rtq2208_ldo_match[*ldo_idx].driver_data = rdesc; 457 - rtq2208_ldo_match[(*ldo_idx)++].desc = desc; 429 + desc->active_discharge_reg = RTQ2208_REG_LDO_DVS_CTRL; 430 + desc->active_discharge_on = curr_info->dis_on; 431 + desc->active_discharge_mask = curr_info->dis_mask; 432 + desc->vsel_reg = RTQ2208_REG_LDO_DVS_CTRL; 433 + desc->vsel_mask = curr_info->vsel_mask; 458 434 459 435 rdesc->suspend_config_reg = curr_info->base; 460 436 rdesc->suspend_enable_mask = RTQ2208_LDO_EN_STR_MASK; ··· 475 457 return -ENOMEM; 476 458 477 459 rtq2208_init_regulator_desc(rdesc[i], mtp_sel, idx, rtq2208_ldo_match, &ldo_idx); 460 + 461 + /* init ldo dvs ability */ 462 + if (idx >= RTQ2208_LDO2) 463 + rtq2208_ldo_match[idx - RTQ2208_LDO2].desc = &rdesc[i]->desc; 478 464 } 479 465 480 466 /* init ldo fixed_uV */
+1 -1
drivers/regulator/rtq6752-regulator.c
··· 209 209 static const struct regmap_config rtq6752_regmap_config = { 210 210 .reg_bits = 8, 211 211 .val_bits = 8, 212 - .cache_type = REGCACHE_RBTREE, 212 + .cache_type = REGCACHE_MAPLE, 213 213 .max_register = RTQ6752_REG_FAULT, 214 214 .reg_defaults = rtq6752_reg_defaults, 215 215 .num_reg_defaults = ARRAY_SIZE(rtq6752_reg_defaults),
+157
drivers/regulator/sun20i-regulator.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + // 3 + // Copyright (c) 2021-2022 Samuel Holland <samuel@sholland.org> 4 + // 5 + 6 + #include <linux/mfd/syscon.h> 7 + #include <linux/module.h> 8 + #include <linux/of.h> 9 + #include <linux/of_device.h> 10 + #include <linux/platform_device.h> 11 + #include <linux/regmap.h> 12 + #include <linux/regulator/driver.h> 13 + 14 + #define SUN20I_SYS_LDO_CTRL_REG 0x150 15 + 16 + struct sun20i_regulator_data { 17 + const struct regulator_desc *descs; 18 + unsigned int ndescs; 19 + }; 20 + 21 + /* regulator_list_voltage_linear() modified for the non-integral uV_step. */ 22 + static int sun20i_d1_system_ldo_list_voltage(struct regulator_dev *rdev, 23 + unsigned int selector) 24 + { 25 + const struct regulator_desc *desc = rdev->desc; 26 + unsigned int fraction, uV; 27 + 28 + if (selector >= desc->n_voltages) 29 + return -EINVAL; 30 + 31 + uV = desc->min_uV + (desc->uV_step * selector); 32 + fraction = selector + (desc->min_uV % 4); 33 + 34 + if (uV > 1606667) 35 + uV += 6667; 36 + else 37 + fraction++; 38 + 39 + /* Produce correctly-rounded absolute voltages. */ 40 + return uV + (fraction / 3); 41 + } 42 + 43 + static const struct regulator_ops sun20i_d1_system_ldo_ops = { 44 + .list_voltage = sun20i_d1_system_ldo_list_voltage, 45 + .map_voltage = regulator_map_voltage_ascend, 46 + .set_voltage_sel = regulator_set_voltage_sel_regmap, 47 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 48 + }; 49 + 50 + static const struct regulator_desc sun20i_d1_system_ldo_descs[] = { 51 + { 52 + .name = "ldoa", 53 + .supply_name = "ldo-in", 54 + .of_match = "ldoa", 55 + .ops = &sun20i_d1_system_ldo_ops, 56 + .type = REGULATOR_VOLTAGE, 57 + .owner = THIS_MODULE, 58 + .n_voltages = 32, 59 + .min_uV = 1593333, 60 + .uV_step = 13333, /* repeating */ 61 + .vsel_reg = SUN20I_SYS_LDO_CTRL_REG, 62 + .vsel_mask = GENMASK(7, 0), 63 + }, 64 + { 65 + .name = "ldob", 66 + .supply_name = "ldo-in", 67 + .of_match = "ldob", 68 + .ops = &sun20i_d1_system_ldo_ops, 69 + .type = REGULATOR_VOLTAGE, 70 + .owner = THIS_MODULE, 71 + .n_voltages = 64, 72 + .min_uV = 1166666, 73 + .uV_step = 13333, /* repeating */ 74 + .vsel_reg = SUN20I_SYS_LDO_CTRL_REG, 75 + .vsel_mask = GENMASK(15, 8), 76 + }, 77 + }; 78 + 79 + static const struct sun20i_regulator_data sun20i_d1_system_ldos = { 80 + .descs = sun20i_d1_system_ldo_descs, 81 + .ndescs = ARRAY_SIZE(sun20i_d1_system_ldo_descs), 82 + }; 83 + 84 + static struct regmap *sun20i_regulator_get_regmap(struct device *dev) 85 + { 86 + struct regmap *regmap; 87 + 88 + /* 89 + * First try the syscon interface. The system control device is not 90 + * compatible with "syscon", so fall back to getting the regmap from 91 + * its platform device. This is ugly, but required for devicetree 92 + * backward compatibility. 93 + */ 94 + regmap = syscon_node_to_regmap(dev->parent->of_node); 95 + if (!IS_ERR(regmap)) 96 + return regmap; 97 + 98 + regmap = dev_get_regmap(dev->parent, NULL); 99 + if (regmap) 100 + return regmap; 101 + 102 + return ERR_PTR(-EPROBE_DEFER); 103 + } 104 + 105 + static int sun20i_regulator_probe(struct platform_device *pdev) 106 + { 107 + const struct sun20i_regulator_data *data; 108 + struct device *dev = &pdev->dev; 109 + struct regulator_config config; 110 + struct regmap *regmap; 111 + 112 + data = of_device_get_match_data(dev); 113 + if (!data) 114 + return -EINVAL; 115 + 116 + regmap = sun20i_regulator_get_regmap(dev); 117 + if (IS_ERR(regmap)) 118 + return dev_err_probe(dev, PTR_ERR(regmap), "Failed to get regmap\n"); 119 + 120 + config = (struct regulator_config) { 121 + .dev = dev, 122 + .regmap = regmap, 123 + }; 124 + 125 + for (unsigned int i = 0; i < data->ndescs; ++i) { 126 + const struct regulator_desc *desc = &data->descs[i]; 127 + struct regulator_dev *rdev; 128 + 129 + rdev = devm_regulator_register(dev, desc, &config); 130 + if (IS_ERR(rdev)) 131 + return PTR_ERR(rdev); 132 + } 133 + 134 + return 0; 135 + } 136 + 137 + static const struct of_device_id sun20i_regulator_of_match[] = { 138 + { 139 + .compatible = "allwinner,sun20i-d1-system-ldos", 140 + .data = &sun20i_d1_system_ldos, 141 + }, 142 + { }, 143 + }; 144 + MODULE_DEVICE_TABLE(of, sun20i_regulator_of_match); 145 + 146 + static struct platform_driver sun20i_regulator_driver = { 147 + .probe = sun20i_regulator_probe, 148 + .driver = { 149 + .name = "sun20i-regulator", 150 + .of_match_table = sun20i_regulator_of_match, 151 + }, 152 + }; 153 + module_platform_driver(sun20i_regulator_driver); 154 + 155 + MODULE_AUTHOR("Samuel Holland <samuel@sholland.org>"); 156 + MODULE_DESCRIPTION("Allwinner D1 internal LDO driver"); 157 + MODULE_LICENSE("GPL");
+1 -1
drivers/regulator/tps51632-regulator.c
··· 199 199 .readable_reg = is_read_reg, 200 200 .volatile_reg = is_volatile_reg, 201 201 .max_register = TPS51632_MAX_REG - 1, 202 - .cache_type = REGCACHE_RBTREE, 202 + .cache_type = REGCACHE_MAPLE, 203 203 }; 204 204 205 205 #if defined(CONFIG_OF)
+1 -1
drivers/regulator/tps62360-regulator.c
··· 275 275 .reg_bits = 8, 276 276 .val_bits = 8, 277 277 .max_register = REG_CHIPID, 278 - .cache_type = REGCACHE_RBTREE, 278 + .cache_type = REGCACHE_MAPLE, 279 279 }; 280 280 281 281 static struct tps62360_regulator_platform_data *
+2 -24
drivers/staging/iio/impedance-analyzer/ad5933.c
··· 84 84 85 85 struct ad5933_state { 86 86 struct i2c_client *client; 87 - struct regulator *reg; 88 87 struct clk *mclk; 89 88 struct delayed_work work; 90 89 struct mutex lock; /* Protect sensor state */ ··· 659 660 } 660 661 } 661 662 662 - static void ad5933_reg_disable(void *data) 663 - { 664 - struct ad5933_state *st = data; 665 - 666 - regulator_disable(st->reg); 667 - } 668 - 669 663 static int ad5933_probe(struct i2c_client *client) 670 664 { 671 665 const struct i2c_device_id *id = i2c_client_get_device_id(client); ··· 677 685 678 686 mutex_init(&st->lock); 679 687 680 - st->reg = devm_regulator_get(&client->dev, "vdd"); 681 - if (IS_ERR(st->reg)) 682 - return PTR_ERR(st->reg); 683 - 684 - ret = regulator_enable(st->reg); 685 - if (ret) { 686 - dev_err(&client->dev, "Failed to enable specified VDD supply\n"); 687 - return ret; 688 - } 689 - 690 - ret = devm_add_action_or_reset(&client->dev, ad5933_reg_disable, st); 691 - if (ret) 692 - return ret; 693 - 694 - ret = regulator_get_voltage(st->reg); 688 + ret = devm_regulator_get_enable_read_voltage(&client->dev, "vdd"); 695 689 if (ret < 0) 696 - return ret; 690 + return dev_err_probe(&client->dev, ret, "failed to get vdd voltage\n"); 697 691 698 692 st->vref_mv = ret / 1000; 699 693
+93 -5
include/linux/mfd/axp20x.h
··· 19 19 AXP223_ID, 20 20 AXP288_ID, 21 21 AXP313A_ID, 22 + AXP717_ID, 22 23 AXP803_ID, 23 24 AXP806_ID, 24 25 AXP809_ID, ··· 105 104 106 105 #define AXP313A_ON_INDICATE 0x00 107 106 #define AXP313A_OUTPUT_CONTROL 0x10 108 - #define AXP313A_DCDC1_CONRTOL 0x13 109 - #define AXP313A_DCDC2_CONRTOL 0x14 110 - #define AXP313A_DCDC3_CONRTOL 0x15 111 - #define AXP313A_ALDO1_CONRTOL 0x16 112 - #define AXP313A_DLDO1_CONRTOL 0x17 107 + #define AXP313A_DCDC1_CONTROL 0x13 108 + #define AXP313A_DCDC2_CONTROL 0x14 109 + #define AXP313A_DCDC3_CONTROL 0x15 110 + #define AXP313A_ALDO1_CONTROL 0x16 111 + #define AXP313A_DLDO1_CONTROL 0x17 113 112 #define AXP313A_SHUTDOWN_CTRL 0x1a 114 113 #define AXP313A_IRQ_EN 0x20 115 114 #define AXP313A_IRQ_STATE 0x21 115 + 116 + #define AXP717_ON_INDICATE 0x00 117 + #define AXP717_IRQ0_EN 0x40 118 + #define AXP717_IRQ1_EN 0x41 119 + #define AXP717_IRQ2_EN 0x42 120 + #define AXP717_IRQ3_EN 0x43 121 + #define AXP717_IRQ4_EN 0x44 122 + #define AXP717_IRQ0_STATE 0x48 123 + #define AXP717_IRQ1_STATE 0x49 124 + #define AXP717_IRQ2_STATE 0x4a 125 + #define AXP717_IRQ3_STATE 0x4b 126 + #define AXP717_IRQ4_STATE 0x4c 127 + #define AXP717_DCDC_OUTPUT_CONTROL 0x80 128 + #define AXP717_DCDC1_CONTROL 0x83 129 + #define AXP717_DCDC2_CONTROL 0x84 130 + #define AXP717_DCDC3_CONTROL 0x85 131 + #define AXP717_DCDC4_CONTROL 0x86 132 + #define AXP717_LDO0_OUTPUT_CONTROL 0x90 133 + #define AXP717_LDO1_OUTPUT_CONTROL 0x91 134 + #define AXP717_ALDO1_CONTROL 0x93 135 + #define AXP717_ALDO2_CONTROL 0x94 136 + #define AXP717_ALDO3_CONTROL 0x95 137 + #define AXP717_ALDO4_CONTROL 0x96 138 + #define AXP717_BLDO1_CONTROL 0x97 139 + #define AXP717_BLDO2_CONTROL 0x98 140 + #define AXP717_BLDO3_CONTROL 0x99 141 + #define AXP717_BLDO4_CONTROL 0x9a 142 + #define AXP717_CLDO1_CONTROL 0x9b 143 + #define AXP717_CLDO2_CONTROL 0x9c 144 + #define AXP717_CLDO3_CONTROL 0x9d 145 + #define AXP717_CLDO4_CONTROL 0x9e 146 + #define AXP717_CPUSLDO_CONTROL 0x9f 116 147 117 148 #define AXP806_STARTUP_SRC 0x00 118 149 #define AXP806_CHIP_ID 0x03 ··· 467 434 }; 468 435 469 436 enum { 437 + AXP717_DCDC1 = 0, 438 + AXP717_DCDC2, 439 + AXP717_DCDC3, 440 + AXP717_DCDC4, 441 + AXP717_ALDO1, 442 + AXP717_ALDO2, 443 + AXP717_ALDO3, 444 + AXP717_ALDO4, 445 + AXP717_BLDO1, 446 + AXP717_BLDO2, 447 + AXP717_BLDO3, 448 + AXP717_BLDO4, 449 + AXP717_CLDO1, 450 + AXP717_CLDO2, 451 + AXP717_CLDO3, 452 + AXP717_CLDO4, 453 + AXP717_CPUSLDO, 454 + AXP717_REG_ID_MAX, 455 + }; 456 + 457 + enum { 470 458 AXP806_DCDCA = 0, 471 459 AXP806_DCDCB, 472 460 AXP806_DCDCC, ··· 784 730 AXP313A_IRQ_PEK_SHORT, 785 731 AXP313A_IRQ_PEK_FAL_EDGE, 786 732 AXP313A_IRQ_PEK_RIS_EDGE, 733 + }; 734 + 735 + enum axp717_irqs { 736 + AXP717_IRQ_VBUS_FAULT, 737 + AXP717_IRQ_VBUS_OVER_V, 738 + AXP717_IRQ_BOOST_OVER_V, 739 + AXP717_IRQ_GAUGE_NEW_SOC = 4, 740 + AXP717_IRQ_SOC_DROP_LVL1 = 6, 741 + AXP717_IRQ_SOC_DROP_LVL2, 742 + AXP717_IRQ_PEK_RIS_EDGE, 743 + AXP717_IRQ_PEK_FAL_EDGE, 744 + AXP717_IRQ_PEK_LONG, 745 + AXP717_IRQ_PEK_SHORT, 746 + AXP717_IRQ_BATT_REMOVAL, 747 + AXP717_IRQ_BATT_PLUGIN, 748 + AXP717_IRQ_VBUS_REMOVAL, 749 + AXP717_IRQ_VBUS_PLUGIN, 750 + AXP717_IRQ_BATT_OVER_V, 751 + AXP717_IRQ_CHARG_TIMER, 752 + AXP717_IRQ_DIE_TEMP_HIGH, 753 + AXP717_IRQ_CHARG, 754 + AXP717_IRQ_CHARG_DONE, 755 + AXP717_IRQ_BATT_OVER_CURR, 756 + AXP717_IRQ_LDO_OVER_CURR, 757 + AXP717_IRQ_WDOG_EXPIRE, 758 + AXP717_IRQ_BATT_ACT_TEMP_LOW, 759 + AXP717_IRQ_BATT_ACT_TEMP_HIGH, 760 + AXP717_IRQ_BATT_CHG_TEMP_LOW, 761 + AXP717_IRQ_BATT_CHG_TEMP_HIGH, 762 + AXP717_IRQ_BATT_QUIT_TEMP_HIGH, 763 + AXP717_IRQ_BC_USB_CHNG = 30, 764 + AXP717_IRQ_BC_USB_DONE, 765 + AXP717_IRQ_TYPEC_PLUGIN = 37, 766 + AXP717_IRQ_TYPEC_REMOVE, 787 767 }; 788 768 789 769 enum axp803_irqs {
+7
include/linux/regulator/consumer.h
··· 164 164 const char *id); 165 165 int devm_regulator_get_enable(struct device *dev, const char *id); 166 166 int devm_regulator_get_enable_optional(struct device *dev, const char *id); 167 + int devm_regulator_get_enable_read_voltage(struct device *dev, const char *id); 167 168 void regulator_put(struct regulator *regulator); 168 169 void devm_regulator_put(struct regulator *regulator); 169 170 ··· 328 327 const char *id) 329 328 { 330 329 return 0; 330 + } 331 + 332 + static inline int devm_regulator_get_enable_read_voltage(struct device *dev, 333 + const char *id) 334 + { 335 + return -ENODEV; 331 336 } 332 337 333 338 static inline struct regulator *__must_check
+1
include/linux/regulator/pca9450.h
··· 9 9 enum pca9450_chip_type { 10 10 PCA9450_TYPE_PCA9450A = 0, 11 11 PCA9450_TYPE_PCA9450BC, 12 + PCA9450_TYPE_PCA9451A, 12 13 PCA9450_TYPE_AMOUNT, 13 14 }; 14 15