| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Voltage regulator support for AMS AS3722 PMIC |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 5 | 6 | * |
|---|
| 6 | 7 | * Author: Florian Lobmaier <florian.lobmaier@ams.com> |
|---|
| 7 | 8 | * Author: Laxman Dewangan <ldewangan@nvidia.com> |
|---|
| 8 | | - * |
|---|
| 9 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 10 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 11 | | - * the Free Software Foundation; either version 2 of the License, or |
|---|
| 12 | | - * (at your option) any later version. |
|---|
| 13 | | - * |
|---|
| 14 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 15 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 16 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 17 | | - * GNU General Public License for more details. |
|---|
| 18 | | - * |
|---|
| 19 | | - * You should have received a copy of the GNU General Public License |
|---|
| 20 | | - * along with this program; if not, write to the Free Software |
|---|
| 21 | | - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|---|
| 22 | | - * |
|---|
| 23 | 9 | */ |
|---|
| 24 | 10 | |
|---|
| 25 | 11 | #include <linux/err.h> |
|---|
| .. | .. |
|---|
| 81 | 67 | struct as3722_regulators { |
|---|
| 82 | 68 | struct device *dev; |
|---|
| 83 | 69 | struct as3722 *as3722; |
|---|
| 84 | | - struct regulator_dev *rdevs[AS3722_REGULATOR_ID_MAX]; |
|---|
| 85 | 70 | struct regulator_desc desc[AS3722_REGULATOR_ID_MAX]; |
|---|
| 86 | 71 | struct as3722_regulator_config_data |
|---|
| 87 | 72 | reg_config_data[AS3722_REGULATOR_ID_MAX]; |
|---|
| .. | .. |
|---|
| 314 | 299 | }, |
|---|
| 315 | 300 | }; |
|---|
| 316 | 301 | |
|---|
| 317 | | - |
|---|
| 318 | | -static const int as3722_ldo_current[] = { 150000, 300000 }; |
|---|
| 319 | | -static const int as3722_sd016_current[] = { 2500000, 3000000, 3500000 }; |
|---|
| 320 | | - |
|---|
| 321 | | -static int as3722_current_to_index(int min_uA, int max_uA, |
|---|
| 322 | | - const int *curr_table, int n_currents) |
|---|
| 323 | | -{ |
|---|
| 324 | | - int i; |
|---|
| 325 | | - |
|---|
| 326 | | - for (i = n_currents - 1; i >= 0; i--) { |
|---|
| 327 | | - if ((min_uA <= curr_table[i]) && (curr_table[i] <= max_uA)) |
|---|
| 328 | | - return i; |
|---|
| 329 | | - } |
|---|
| 330 | | - return -EINVAL; |
|---|
| 331 | | -} |
|---|
| 332 | | - |
|---|
| 333 | | -static int as3722_ldo_get_current_limit(struct regulator_dev *rdev) |
|---|
| 334 | | -{ |
|---|
| 335 | | - struct as3722_regulators *as3722_regs = rdev_get_drvdata(rdev); |
|---|
| 336 | | - struct as3722 *as3722 = as3722_regs->as3722; |
|---|
| 337 | | - int id = rdev_get_id(rdev); |
|---|
| 338 | | - u32 val; |
|---|
| 339 | | - int ret; |
|---|
| 340 | | - |
|---|
| 341 | | - ret = as3722_read(as3722, as3722_reg_lookup[id].vsel_reg, &val); |
|---|
| 342 | | - if (ret < 0) { |
|---|
| 343 | | - dev_err(as3722_regs->dev, "Reg 0x%02x read failed: %d\n", |
|---|
| 344 | | - as3722_reg_lookup[id].vsel_reg, ret); |
|---|
| 345 | | - return ret; |
|---|
| 346 | | - } |
|---|
| 347 | | - if (val & AS3722_LDO_ILIMIT_MASK) |
|---|
| 348 | | - return 300000; |
|---|
| 349 | | - return 150000; |
|---|
| 350 | | -} |
|---|
| 351 | | - |
|---|
| 352 | | -static int as3722_ldo_set_current_limit(struct regulator_dev *rdev, |
|---|
| 353 | | - int min_uA, int max_uA) |
|---|
| 354 | | -{ |
|---|
| 355 | | - struct as3722_regulators *as3722_regs = rdev_get_drvdata(rdev); |
|---|
| 356 | | - struct as3722 *as3722 = as3722_regs->as3722; |
|---|
| 357 | | - int id = rdev_get_id(rdev); |
|---|
| 358 | | - int ret; |
|---|
| 359 | | - u32 reg = 0; |
|---|
| 360 | | - |
|---|
| 361 | | - ret = as3722_current_to_index(min_uA, max_uA, as3722_ldo_current, |
|---|
| 362 | | - ARRAY_SIZE(as3722_ldo_current)); |
|---|
| 363 | | - if (ret < 0) { |
|---|
| 364 | | - dev_err(as3722_regs->dev, |
|---|
| 365 | | - "Current range min:max = %d:%d does not support\n", |
|---|
| 366 | | - min_uA, max_uA); |
|---|
| 367 | | - return ret; |
|---|
| 368 | | - } |
|---|
| 369 | | - if (ret) |
|---|
| 370 | | - reg = AS3722_LDO_ILIMIT_BIT; |
|---|
| 371 | | - return as3722_update_bits(as3722, as3722_reg_lookup[id].vsel_reg, |
|---|
| 372 | | - AS3722_LDO_ILIMIT_MASK, reg); |
|---|
| 373 | | -} |
|---|
| 302 | +static const unsigned int as3722_ldo_current[] = { 150000, 300000 }; |
|---|
| 303 | +static const unsigned int as3722_sd016_current[] = { |
|---|
| 304 | + 2500000, 3000000, 3500000 |
|---|
| 305 | +}; |
|---|
| 374 | 306 | |
|---|
| 375 | 307 | static const struct regulator_ops as3722_ldo0_ops = { |
|---|
| 376 | 308 | .is_enabled = regulator_is_enabled_regmap, |
|---|
| .. | .. |
|---|
| 379 | 311 | .list_voltage = regulator_list_voltage_linear, |
|---|
| 380 | 312 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
|---|
| 381 | 313 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
|---|
| 382 | | - .get_current_limit = as3722_ldo_get_current_limit, |
|---|
| 383 | | - .set_current_limit = as3722_ldo_set_current_limit, |
|---|
| 314 | + .get_current_limit = regulator_get_current_limit_regmap, |
|---|
| 315 | + .set_current_limit = regulator_set_current_limit_regmap, |
|---|
| 384 | 316 | }; |
|---|
| 385 | 317 | |
|---|
| 386 | 318 | static const struct regulator_ops as3722_ldo0_extcntrl_ops = { |
|---|
| 387 | 319 | .list_voltage = regulator_list_voltage_linear, |
|---|
| 388 | 320 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
|---|
| 389 | 321 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
|---|
| 390 | | - .get_current_limit = as3722_ldo_get_current_limit, |
|---|
| 391 | | - .set_current_limit = as3722_ldo_set_current_limit, |
|---|
| 322 | + .get_current_limit = regulator_get_current_limit_regmap, |
|---|
| 323 | + .set_current_limit = regulator_set_current_limit_regmap, |
|---|
| 392 | 324 | }; |
|---|
| 393 | 325 | |
|---|
| 394 | 326 | static int as3722_ldo3_set_tracking_mode(struct as3722_regulators *as3722_reg, |
|---|
| .. | .. |
|---|
| 440 | 372 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
|---|
| 441 | 373 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
|---|
| 442 | 374 | .list_voltage = regulator_list_voltage_linear_range, |
|---|
| 443 | | - .get_current_limit = as3722_ldo_get_current_limit, |
|---|
| 444 | | - .set_current_limit = as3722_ldo_set_current_limit, |
|---|
| 375 | + .get_current_limit = regulator_get_current_limit_regmap, |
|---|
| 376 | + .set_current_limit = regulator_set_current_limit_regmap, |
|---|
| 445 | 377 | .get_bypass = regulator_get_bypass_regmap, |
|---|
| 446 | 378 | .set_bypass = regulator_set_bypass_regmap, |
|---|
| 447 | 379 | }; |
|---|
| .. | .. |
|---|
| 451 | 383 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
|---|
| 452 | 384 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
|---|
| 453 | 385 | .list_voltage = regulator_list_voltage_linear_range, |
|---|
| 454 | | - .get_current_limit = as3722_ldo_get_current_limit, |
|---|
| 455 | | - .set_current_limit = as3722_ldo_set_current_limit, |
|---|
| 386 | + .get_current_limit = regulator_get_current_limit_regmap, |
|---|
| 387 | + .set_current_limit = regulator_set_current_limit_regmap, |
|---|
| 456 | 388 | .get_bypass = regulator_get_bypass_regmap, |
|---|
| 457 | 389 | .set_bypass = regulator_set_bypass_regmap, |
|---|
| 458 | 390 | }; |
|---|
| 459 | 391 | |
|---|
| 460 | | -static const struct regulator_linear_range as3722_ldo_ranges[] = { |
|---|
| 392 | +static const struct linear_range as3722_ldo_ranges[] = { |
|---|
| 461 | 393 | REGULATOR_LINEAR_RANGE(0, 0x00, 0x00, 0), |
|---|
| 462 | 394 | REGULATOR_LINEAR_RANGE(825000, 0x01, 0x24, 25000), |
|---|
| 463 | 395 | REGULATOR_LINEAR_RANGE(1725000, 0x40, 0x7F, 25000), |
|---|
| .. | .. |
|---|
| 471 | 403 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
|---|
| 472 | 404 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
|---|
| 473 | 405 | .list_voltage = regulator_list_voltage_linear_range, |
|---|
| 474 | | - .get_current_limit = as3722_ldo_get_current_limit, |
|---|
| 475 | | - .set_current_limit = as3722_ldo_set_current_limit, |
|---|
| 406 | + .get_current_limit = regulator_get_current_limit_regmap, |
|---|
| 407 | + .set_current_limit = regulator_set_current_limit_regmap, |
|---|
| 476 | 408 | }; |
|---|
| 477 | 409 | |
|---|
| 478 | 410 | static const struct regulator_ops as3722_ldo_extcntrl_ops = { |
|---|
| .. | .. |
|---|
| 480 | 412 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
|---|
| 481 | 413 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
|---|
| 482 | 414 | .list_voltage = regulator_list_voltage_linear_range, |
|---|
| 483 | | - .get_current_limit = as3722_ldo_get_current_limit, |
|---|
| 484 | | - .set_current_limit = as3722_ldo_set_current_limit, |
|---|
| 415 | + .get_current_limit = regulator_get_current_limit_regmap, |
|---|
| 416 | + .set_current_limit = regulator_set_current_limit_regmap, |
|---|
| 485 | 417 | }; |
|---|
| 486 | 418 | |
|---|
| 487 | 419 | static unsigned int as3722_sd_get_mode(struct regulator_dev *rdev) |
|---|
| .. | .. |
|---|
| 539 | 471 | return ret; |
|---|
| 540 | 472 | } |
|---|
| 541 | 473 | |
|---|
| 542 | | -static int as3722_sd016_get_current_limit(struct regulator_dev *rdev) |
|---|
| 543 | | -{ |
|---|
| 544 | | - struct as3722_regulators *as3722_regs = rdev_get_drvdata(rdev); |
|---|
| 545 | | - struct as3722 *as3722 = as3722_regs->as3722; |
|---|
| 546 | | - int id = rdev_get_id(rdev); |
|---|
| 547 | | - u32 val, reg; |
|---|
| 548 | | - int mask; |
|---|
| 549 | | - int ret; |
|---|
| 550 | | - |
|---|
| 551 | | - switch (id) { |
|---|
| 552 | | - case AS3722_REGULATOR_ID_SD0: |
|---|
| 553 | | - reg = AS3722_OVCURRENT_REG; |
|---|
| 554 | | - mask = AS3722_OVCURRENT_SD0_TRIP_MASK; |
|---|
| 555 | | - break; |
|---|
| 556 | | - case AS3722_REGULATOR_ID_SD1: |
|---|
| 557 | | - reg = AS3722_OVCURRENT_REG; |
|---|
| 558 | | - mask = AS3722_OVCURRENT_SD1_TRIP_MASK; |
|---|
| 559 | | - break; |
|---|
| 560 | | - case AS3722_REGULATOR_ID_SD6: |
|---|
| 561 | | - reg = AS3722_OVCURRENT_DEB_REG; |
|---|
| 562 | | - mask = AS3722_OVCURRENT_SD6_TRIP_MASK; |
|---|
| 563 | | - break; |
|---|
| 564 | | - default: |
|---|
| 565 | | - return -EINVAL; |
|---|
| 566 | | - } |
|---|
| 567 | | - ret = as3722_read(as3722, reg, &val); |
|---|
| 568 | | - if (ret < 0) { |
|---|
| 569 | | - dev_err(as3722_regs->dev, "Reg 0x%02x read failed: %d\n", |
|---|
| 570 | | - reg, ret); |
|---|
| 571 | | - return ret; |
|---|
| 572 | | - } |
|---|
| 573 | | - val &= mask; |
|---|
| 574 | | - val >>= ffs(mask) - 1; |
|---|
| 575 | | - if (val == 3) |
|---|
| 576 | | - return -EINVAL; |
|---|
| 577 | | - return as3722_sd016_current[val]; |
|---|
| 578 | | -} |
|---|
| 579 | | - |
|---|
| 580 | | -static int as3722_sd016_set_current_limit(struct regulator_dev *rdev, |
|---|
| 581 | | - int min_uA, int max_uA) |
|---|
| 582 | | -{ |
|---|
| 583 | | - struct as3722_regulators *as3722_regs = rdev_get_drvdata(rdev); |
|---|
| 584 | | - struct as3722 *as3722 = as3722_regs->as3722; |
|---|
| 585 | | - int id = rdev_get_id(rdev); |
|---|
| 586 | | - int ret; |
|---|
| 587 | | - int val; |
|---|
| 588 | | - int mask; |
|---|
| 589 | | - u32 reg; |
|---|
| 590 | | - |
|---|
| 591 | | - ret = as3722_current_to_index(min_uA, max_uA, as3722_sd016_current, |
|---|
| 592 | | - ARRAY_SIZE(as3722_sd016_current)); |
|---|
| 593 | | - if (ret < 0) { |
|---|
| 594 | | - dev_err(as3722_regs->dev, |
|---|
| 595 | | - "Current range min:max = %d:%d does not support\n", |
|---|
| 596 | | - min_uA, max_uA); |
|---|
| 597 | | - return ret; |
|---|
| 598 | | - } |
|---|
| 599 | | - |
|---|
| 600 | | - switch (id) { |
|---|
| 601 | | - case AS3722_REGULATOR_ID_SD0: |
|---|
| 602 | | - reg = AS3722_OVCURRENT_REG; |
|---|
| 603 | | - mask = AS3722_OVCURRENT_SD0_TRIP_MASK; |
|---|
| 604 | | - break; |
|---|
| 605 | | - case AS3722_REGULATOR_ID_SD1: |
|---|
| 606 | | - reg = AS3722_OVCURRENT_REG; |
|---|
| 607 | | - mask = AS3722_OVCURRENT_SD1_TRIP_MASK; |
|---|
| 608 | | - break; |
|---|
| 609 | | - case AS3722_REGULATOR_ID_SD6: |
|---|
| 610 | | - reg = AS3722_OVCURRENT_DEB_REG; |
|---|
| 611 | | - mask = AS3722_OVCURRENT_SD6_TRIP_MASK; |
|---|
| 612 | | - break; |
|---|
| 613 | | - default: |
|---|
| 614 | | - return -EINVAL; |
|---|
| 615 | | - } |
|---|
| 616 | | - ret <<= ffs(mask) - 1; |
|---|
| 617 | | - val = ret & mask; |
|---|
| 618 | | - return as3722_update_bits(as3722, reg, mask, val); |
|---|
| 619 | | -} |
|---|
| 620 | | - |
|---|
| 621 | 474 | static bool as3722_sd0_is_low_voltage(struct as3722_regulators *as3722_regs) |
|---|
| 622 | 475 | { |
|---|
| 623 | 476 | int err; |
|---|
| .. | .. |
|---|
| 634 | 487 | return false; |
|---|
| 635 | 488 | } |
|---|
| 636 | 489 | |
|---|
| 637 | | -static const struct regulator_linear_range as3722_sd2345_ranges[] = { |
|---|
| 490 | +static const struct linear_range as3722_sd2345_ranges[] = { |
|---|
| 638 | 491 | REGULATOR_LINEAR_RANGE(0, 0x00, 0x00, 0), |
|---|
| 639 | 492 | REGULATOR_LINEAR_RANGE(612500, 0x01, 0x40, 12500), |
|---|
| 640 | 493 | REGULATOR_LINEAR_RANGE(1425000, 0x41, 0x70, 25000), |
|---|
| .. | .. |
|---|
| 649 | 502 | .map_voltage = regulator_map_voltage_linear, |
|---|
| 650 | 503 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
|---|
| 651 | 504 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
|---|
| 652 | | - .get_current_limit = as3722_sd016_get_current_limit, |
|---|
| 653 | | - .set_current_limit = as3722_sd016_set_current_limit, |
|---|
| 505 | + .get_current_limit = regulator_get_current_limit_regmap, |
|---|
| 506 | + .set_current_limit = regulator_set_current_limit_regmap, |
|---|
| 654 | 507 | .get_mode = as3722_sd_get_mode, |
|---|
| 655 | 508 | .set_mode = as3722_sd_set_mode, |
|---|
| 656 | 509 | }; |
|---|
| .. | .. |
|---|
| 660 | 513 | .map_voltage = regulator_map_voltage_linear, |
|---|
| 661 | 514 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
|---|
| 662 | 515 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
|---|
| 663 | | - .get_current_limit = as3722_sd016_get_current_limit, |
|---|
| 664 | | - .set_current_limit = as3722_sd016_set_current_limit, |
|---|
| 516 | + .get_current_limit = regulator_get_current_limit_regmap, |
|---|
| 517 | + .set_current_limit = regulator_set_current_limit_regmap, |
|---|
| 665 | 518 | .get_mode = as3722_sd_get_mode, |
|---|
| 666 | 519 | .set_mode = as3722_sd_set_mode, |
|---|
| 667 | 520 | }; |
|---|
| .. | .. |
|---|
| 807 | 660 | config.regmap = as3722->regmap; |
|---|
| 808 | 661 | |
|---|
| 809 | 662 | for (id = 0; id < AS3722_REGULATOR_ID_MAX; id++) { |
|---|
| 663 | + struct regulator_desc *desc; |
|---|
| 664 | + |
|---|
| 665 | + desc = &as3722_regs->desc[id]; |
|---|
| 810 | 666 | reg_config = &as3722_regs->reg_config_data[id]; |
|---|
| 811 | 667 | |
|---|
| 812 | | - as3722_regs->desc[id].name = as3722_reg_lookup[id].name; |
|---|
| 813 | | - as3722_regs->desc[id].supply_name = as3722_reg_lookup[id].sname; |
|---|
| 814 | | - as3722_regs->desc[id].id = as3722_reg_lookup[id].regulator_id; |
|---|
| 815 | | - as3722_regs->desc[id].n_voltages = |
|---|
| 816 | | - as3722_reg_lookup[id].n_voltages; |
|---|
| 817 | | - as3722_regs->desc[id].type = REGULATOR_VOLTAGE; |
|---|
| 818 | | - as3722_regs->desc[id].owner = THIS_MODULE; |
|---|
| 819 | | - as3722_regs->desc[id].enable_reg = |
|---|
| 820 | | - as3722_reg_lookup[id].enable_reg; |
|---|
| 821 | | - as3722_regs->desc[id].enable_mask = |
|---|
| 822 | | - as3722_reg_lookup[id].enable_mask; |
|---|
| 823 | | - as3722_regs->desc[id].vsel_reg = as3722_reg_lookup[id].vsel_reg; |
|---|
| 824 | | - as3722_regs->desc[id].vsel_mask = |
|---|
| 825 | | - as3722_reg_lookup[id].vsel_mask; |
|---|
| 668 | + desc->name = as3722_reg_lookup[id].name; |
|---|
| 669 | + desc->supply_name = as3722_reg_lookup[id].sname; |
|---|
| 670 | + desc->id = as3722_reg_lookup[id].regulator_id; |
|---|
| 671 | + desc->n_voltages = as3722_reg_lookup[id].n_voltages; |
|---|
| 672 | + desc->type = REGULATOR_VOLTAGE; |
|---|
| 673 | + desc->owner = THIS_MODULE; |
|---|
| 674 | + desc->enable_reg = as3722_reg_lookup[id].enable_reg; |
|---|
| 675 | + desc->enable_mask = as3722_reg_lookup[id].enable_mask; |
|---|
| 676 | + desc->vsel_reg = as3722_reg_lookup[id].vsel_reg; |
|---|
| 677 | + desc->vsel_mask = as3722_reg_lookup[id].vsel_mask; |
|---|
| 826 | 678 | switch (id) { |
|---|
| 827 | 679 | case AS3722_REGULATOR_ID_LDO0: |
|---|
| 828 | 680 | if (reg_config->ext_control) |
|---|
| 829 | 681 | ops = &as3722_ldo0_extcntrl_ops; |
|---|
| 830 | 682 | else |
|---|
| 831 | 683 | ops = &as3722_ldo0_ops; |
|---|
| 832 | | - as3722_regs->desc[id].min_uV = 825000; |
|---|
| 833 | | - as3722_regs->desc[id].uV_step = 25000; |
|---|
| 834 | | - as3722_regs->desc[id].linear_min_sel = 1; |
|---|
| 835 | | - as3722_regs->desc[id].enable_time = 500; |
|---|
| 684 | + desc->min_uV = 825000; |
|---|
| 685 | + desc->uV_step = 25000; |
|---|
| 686 | + desc->linear_min_sel = 1; |
|---|
| 687 | + desc->enable_time = 500; |
|---|
| 688 | + desc->curr_table = as3722_ldo_current; |
|---|
| 689 | + desc->n_current_limits = ARRAY_SIZE(as3722_ldo_current); |
|---|
| 690 | + desc->csel_reg = as3722_reg_lookup[id].vsel_reg; |
|---|
| 691 | + desc->csel_mask = AS3722_LDO_ILIMIT_MASK; |
|---|
| 836 | 692 | break; |
|---|
| 837 | 693 | case AS3722_REGULATOR_ID_LDO3: |
|---|
| 838 | 694 | if (reg_config->ext_control) |
|---|
| 839 | 695 | ops = &as3722_ldo3_extcntrl_ops; |
|---|
| 840 | 696 | else |
|---|
| 841 | 697 | ops = &as3722_ldo3_ops; |
|---|
| 842 | | - as3722_regs->desc[id].min_uV = 620000; |
|---|
| 843 | | - as3722_regs->desc[id].uV_step = 20000; |
|---|
| 844 | | - as3722_regs->desc[id].linear_min_sel = 1; |
|---|
| 845 | | - as3722_regs->desc[id].enable_time = 500; |
|---|
| 698 | + desc->min_uV = 620000; |
|---|
| 699 | + desc->uV_step = 20000; |
|---|
| 700 | + desc->linear_min_sel = 1; |
|---|
| 701 | + desc->enable_time = 500; |
|---|
| 846 | 702 | if (reg_config->enable_tracking) { |
|---|
| 847 | 703 | ret = as3722_ldo3_set_tracking_mode(as3722_regs, |
|---|
| 848 | 704 | id, AS3722_LDO3_MODE_PMOS_TRACKING); |
|---|
| .. | .. |
|---|
| 859 | 715 | ops = &as3722_ldo6_extcntrl_ops; |
|---|
| 860 | 716 | else |
|---|
| 861 | 717 | ops = &as3722_ldo6_ops; |
|---|
| 862 | | - as3722_regs->desc[id].enable_time = 500; |
|---|
| 863 | | - as3722_regs->desc[id].bypass_reg = |
|---|
| 864 | | - AS3722_LDO6_VOLTAGE_REG; |
|---|
| 865 | | - as3722_regs->desc[id].bypass_mask = |
|---|
| 866 | | - AS3722_LDO_VSEL_MASK; |
|---|
| 867 | | - as3722_regs->desc[id].bypass_val_on = |
|---|
| 868 | | - AS3722_LDO6_VSEL_BYPASS; |
|---|
| 869 | | - as3722_regs->desc[id].bypass_val_off = |
|---|
| 870 | | - AS3722_LDO6_VSEL_BYPASS; |
|---|
| 871 | | - as3722_regs->desc[id].linear_ranges = as3722_ldo_ranges; |
|---|
| 872 | | - as3722_regs->desc[id].n_linear_ranges = |
|---|
| 873 | | - ARRAY_SIZE(as3722_ldo_ranges); |
|---|
| 718 | + desc->enable_time = 500; |
|---|
| 719 | + desc->bypass_reg = AS3722_LDO6_VOLTAGE_REG; |
|---|
| 720 | + desc->bypass_mask = AS3722_LDO_VSEL_MASK; |
|---|
| 721 | + desc->bypass_val_on = AS3722_LDO6_VSEL_BYPASS; |
|---|
| 722 | + desc->bypass_val_off = AS3722_LDO6_VSEL_BYPASS; |
|---|
| 723 | + desc->linear_ranges = as3722_ldo_ranges; |
|---|
| 724 | + desc->n_linear_ranges = ARRAY_SIZE(as3722_ldo_ranges); |
|---|
| 725 | + desc->curr_table = as3722_ldo_current; |
|---|
| 726 | + desc->n_current_limits = ARRAY_SIZE(as3722_ldo_current); |
|---|
| 727 | + desc->csel_reg = as3722_reg_lookup[id].vsel_reg; |
|---|
| 728 | + desc->csel_mask = AS3722_LDO_ILIMIT_MASK; |
|---|
| 874 | 729 | break; |
|---|
| 875 | 730 | case AS3722_REGULATOR_ID_SD0: |
|---|
| 876 | 731 | case AS3722_REGULATOR_ID_SD1: |
|---|
| .. | .. |
|---|
| 886 | 741 | as3722_regs->desc[id].min_uV = 410000; |
|---|
| 887 | 742 | } else { |
|---|
| 888 | 743 | as3722_regs->desc[id].n_voltages = |
|---|
| 889 | | - AS3722_SD0_VSEL_MAX + 1, |
|---|
| 744 | + AS3722_SD0_VSEL_MAX + 1; |
|---|
| 890 | 745 | as3722_regs->desc[id].min_uV = 610000; |
|---|
| 891 | 746 | } |
|---|
| 892 | | - as3722_regs->desc[id].uV_step = 10000; |
|---|
| 893 | | - as3722_regs->desc[id].linear_min_sel = 1; |
|---|
| 894 | | - as3722_regs->desc[id].enable_time = 600; |
|---|
| 747 | + desc->uV_step = 10000; |
|---|
| 748 | + desc->linear_min_sel = 1; |
|---|
| 749 | + desc->enable_time = 600; |
|---|
| 750 | + desc->curr_table = as3722_sd016_current; |
|---|
| 751 | + desc->n_current_limits = |
|---|
| 752 | + ARRAY_SIZE(as3722_sd016_current); |
|---|
| 753 | + if (id == AS3722_REGULATOR_ID_SD0) { |
|---|
| 754 | + desc->csel_reg = AS3722_OVCURRENT_REG; |
|---|
| 755 | + desc->csel_mask = |
|---|
| 756 | + AS3722_OVCURRENT_SD0_TRIP_MASK; |
|---|
| 757 | + } else if (id == AS3722_REGULATOR_ID_SD1) { |
|---|
| 758 | + desc->csel_reg = AS3722_OVCURRENT_REG; |
|---|
| 759 | + desc->csel_mask = |
|---|
| 760 | + AS3722_OVCURRENT_SD1_TRIP_MASK; |
|---|
| 761 | + } else if (id == AS3722_REGULATOR_ID_SD6) { |
|---|
| 762 | + desc->csel_reg = AS3722_OVCURRENT_DEB_REG; |
|---|
| 763 | + desc->csel_mask = |
|---|
| 764 | + AS3722_OVCURRENT_SD6_TRIP_MASK; |
|---|
| 765 | + } |
|---|
| 895 | 766 | break; |
|---|
| 896 | 767 | case AS3722_REGULATOR_ID_SD2: |
|---|
| 897 | 768 | case AS3722_REGULATOR_ID_SD3: |
|---|
| .. | .. |
|---|
| 901 | 772 | ops = &as3722_sd2345_extcntrl_ops; |
|---|
| 902 | 773 | else |
|---|
| 903 | 774 | ops = &as3722_sd2345_ops; |
|---|
| 904 | | - as3722_regs->desc[id].linear_ranges = |
|---|
| 905 | | - as3722_sd2345_ranges; |
|---|
| 906 | | - as3722_regs->desc[id].n_linear_ranges = |
|---|
| 775 | + desc->linear_ranges = as3722_sd2345_ranges; |
|---|
| 776 | + desc->n_linear_ranges = |
|---|
| 907 | 777 | ARRAY_SIZE(as3722_sd2345_ranges); |
|---|
| 908 | 778 | break; |
|---|
| 909 | 779 | default: |
|---|
| .. | .. |
|---|
| 911 | 781 | ops = &as3722_ldo_extcntrl_ops; |
|---|
| 912 | 782 | else |
|---|
| 913 | 783 | ops = &as3722_ldo_ops; |
|---|
| 914 | | - as3722_regs->desc[id].enable_time = 500; |
|---|
| 915 | | - as3722_regs->desc[id].linear_ranges = as3722_ldo_ranges; |
|---|
| 916 | | - as3722_regs->desc[id].n_linear_ranges = |
|---|
| 917 | | - ARRAY_SIZE(as3722_ldo_ranges); |
|---|
| 784 | + desc->enable_time = 500; |
|---|
| 785 | + desc->linear_ranges = as3722_ldo_ranges; |
|---|
| 786 | + desc->n_linear_ranges = ARRAY_SIZE(as3722_ldo_ranges); |
|---|
| 787 | + desc->curr_table = as3722_ldo_current; |
|---|
| 788 | + desc->n_current_limits = ARRAY_SIZE(as3722_ldo_current); |
|---|
| 789 | + desc->csel_reg = as3722_reg_lookup[id].vsel_reg; |
|---|
| 790 | + desc->csel_mask = AS3722_LDO_ILIMIT_MASK; |
|---|
| 918 | 791 | break; |
|---|
| 919 | 792 | } |
|---|
| 920 | | - as3722_regs->desc[id].ops = ops; |
|---|
| 793 | + desc->ops = ops; |
|---|
| 921 | 794 | config.init_data = reg_config->reg_init; |
|---|
| 922 | 795 | config.of_node = as3722_regulator_matches[id].of_node; |
|---|
| 923 | | - rdev = devm_regulator_register(&pdev->dev, |
|---|
| 924 | | - &as3722_regs->desc[id], &config); |
|---|
| 796 | + rdev = devm_regulator_register(&pdev->dev, desc, &config); |
|---|
| 925 | 797 | if (IS_ERR(rdev)) { |
|---|
| 926 | 798 | ret = PTR_ERR(rdev); |
|---|
| 927 | 799 | dev_err(&pdev->dev, "regulator %d register failed %d\n", |
|---|
| .. | .. |
|---|
| 929 | 801 | return ret; |
|---|
| 930 | 802 | } |
|---|
| 931 | 803 | |
|---|
| 932 | | - as3722_regs->rdevs[id] = rdev; |
|---|
| 933 | 804 | if (reg_config->ext_control) { |
|---|
| 934 | 805 | ret = regulator_enable_regmap(rdev); |
|---|
| 935 | 806 | if (ret < 0) { |
|---|