1 // SPDX-License-Identifier: GPL-2.0-or-later 2 // 3 // helpers.c -- Voltage/Current Regulator framework helper functions. 4 // 5 // Copyright 2007, 2008 Wolfson Microelectronics PLC. 6 // Copyright 2008 SlimLogic Ltd. 7 8 #include <linux/kernel.h> 9 #include <linux/err.h> 10 #include <linux/delay.h> 11 #include <linux/regmap.h> 12 #include <linux/regulator/consumer.h> 13 #include <linux/regulator/driver.h> 14 #include <linux/module.h> 15 16 #include "internal.h" 17 18 /** 19 * regulator_is_enabled_regmap - standard is_enabled() for regmap users 20 * 21 * @rdev: regulator to operate on 22 * 23 * Regulators that use regmap for their register I/O can set the 24 * enable_reg and enable_mask fields in their descriptor and then use 25 * this as their is_enabled operation, saving some code. 26 */ 27 int regulator_is_enabled_regmap(struct regulator_dev *rdev) 28 { 29 unsigned int val; 30 int ret; 31 32 ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val); 33 if (ret != 0) 34 return ret; 35 36 val &= rdev->desc->enable_mask; 37 38 if (rdev->desc->enable_is_inverted) { 39 if (rdev->desc->enable_val) 40 return val != rdev->desc->enable_val; 41 return val == 0; 42 } else { 43 if (rdev->desc->enable_val) 44 return val == rdev->desc->enable_val; 45 return val != 0; 46 } 47 } 48 EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap); 49 50 /** 51 * regulator_enable_regmap - standard enable() for regmap users 52 * 53 * @rdev: regulator to operate on 54 * 55 * Regulators that use regmap for their register I/O can set the 56 * enable_reg and enable_mask fields in their descriptor and then use 57 * this as their enable() operation, saving some code. 58 */ 59 int regulator_enable_regmap(struct regulator_dev *rdev) 60 { 61 unsigned int val; 62 63 if (rdev->desc->enable_is_inverted) { 64 val = rdev->desc->disable_val; 65 } else { 66 val = rdev->desc->enable_val; 67 if (!val) 68 val = rdev->desc->enable_mask; 69 } 70 71 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 72 rdev->desc->enable_mask, val); 73 } 74 EXPORT_SYMBOL_GPL(regulator_enable_regmap); 75 76 /** 77 * regulator_disable_regmap - standard disable() for regmap users 78 * 79 * @rdev: regulator to operate on 80 * 81 * Regulators that use regmap for their register I/O can set the 82 * enable_reg and enable_mask fields in their descriptor and then use 83 * this as their disable() operation, saving some code. 84 */ 85 int regulator_disable_regmap(struct regulator_dev *rdev) 86 { 87 unsigned int val; 88 89 if (rdev->desc->enable_is_inverted) { 90 val = rdev->desc->enable_val; 91 if (!val) 92 val = rdev->desc->enable_mask; 93 } else { 94 val = rdev->desc->disable_val; 95 } 96 97 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 98 rdev->desc->enable_mask, val); 99 } 100 EXPORT_SYMBOL_GPL(regulator_disable_regmap); 101 102 static int regulator_range_selector_to_index(struct regulator_dev *rdev, 103 unsigned int rval) 104 { 105 int i; 106 107 if (!rdev->desc->linear_range_selectors) 108 return -EINVAL; 109 110 rval &= rdev->desc->vsel_range_mask; 111 112 for (i = 0; i < rdev->desc->n_linear_ranges; i++) { 113 if (rdev->desc->linear_range_selectors[i] == rval) 114 return i; 115 } 116 return -EINVAL; 117 } 118 119 /** 120 * regulator_get_voltage_sel_pickable_regmap - pickable range get_voltage_sel 121 * 122 * @rdev: regulator to operate on 123 * 124 * Regulators that use regmap for their register I/O and use pickable 125 * ranges can set the vsel_reg, vsel_mask, vsel_range_reg and vsel_range_mask 126 * fields in their descriptor and then use this as their get_voltage_vsel 127 * operation, saving some code. 128 */ 129 int regulator_get_voltage_sel_pickable_regmap(struct regulator_dev *rdev) 130 { 131 unsigned int r_val; 132 int range; 133 unsigned int val; 134 int ret; 135 unsigned int voltages = 0; 136 const struct linear_range *r = rdev->desc->linear_ranges; 137 138 if (!r) 139 return -EINVAL; 140 141 ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val); 142 if (ret != 0) 143 return ret; 144 145 ret = regmap_read(rdev->regmap, rdev->desc->vsel_range_reg, &r_val); 146 if (ret != 0) 147 return ret; 148 149 val &= rdev->desc->vsel_mask; 150 val >>= ffs(rdev->desc->vsel_mask) - 1; 151 152 range = regulator_range_selector_to_index(rdev, r_val); 153 if (range < 0) 154 return -EINVAL; 155 156 voltages = linear_range_values_in_range_array(r, range); 157 158 return val + voltages; 159 } 160 EXPORT_SYMBOL_GPL(regulator_get_voltage_sel_pickable_regmap); 161 162 /** 163 * regulator_set_voltage_sel_pickable_regmap - pickable range set_voltage_sel 164 * 165 * @rdev: regulator to operate on 166 * @sel: Selector to set 167 * 168 * Regulators that use regmap for their register I/O and use pickable 169 * ranges can set the vsel_reg, vsel_mask, vsel_range_reg and vsel_range_mask 170 * fields in their descriptor and then use this as their set_voltage_vsel 171 * operation, saving some code. 172 */ 173 int regulator_set_voltage_sel_pickable_regmap(struct regulator_dev *rdev, 174 unsigned int sel) 175 { 176 unsigned int range; 177 int ret, i; 178 unsigned int voltages_in_range = 0; 179 180 for (i = 0; i < rdev->desc->n_linear_ranges; i++) { 181 const struct linear_range *r; 182 183 r = &rdev->desc->linear_ranges[i]; 184 voltages_in_range = linear_range_values_in_range(r); 185 186 if (sel < voltages_in_range) 187 break; 188 sel -= voltages_in_range; 189 } 190 191 if (i == rdev->desc->n_linear_ranges) 192 return -EINVAL; 193 194 sel <<= ffs(rdev->desc->vsel_mask) - 1; 195 sel += rdev->desc->linear_ranges[i].min_sel; 196 197 range = rdev->desc->linear_range_selectors[i]; 198 199 if (rdev->desc->vsel_reg == rdev->desc->vsel_range_reg) { 200 ret = regmap_update_bits(rdev->regmap, 201 rdev->desc->vsel_reg, 202 rdev->desc->vsel_range_mask | 203 rdev->desc->vsel_mask, sel | range); 204 } else { 205 ret = regmap_update_bits(rdev->regmap, 206 rdev->desc->vsel_range_reg, 207 rdev->desc->vsel_range_mask, range); 208 if (ret) 209 return ret; 210 211 ret = regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, 212 rdev->desc->vsel_mask, sel); 213 } 214 215 if (ret) 216 return ret; 217 218 if (rdev->desc->apply_bit) 219 ret = regmap_update_bits(rdev->regmap, rdev->desc->apply_reg, 220 rdev->desc->apply_bit, 221 rdev->desc->apply_bit); 222 return ret; 223 } 224 EXPORT_SYMBOL_GPL(regulator_set_voltage_sel_pickable_regmap); 225 226 /** 227 * regulator_get_voltage_sel_regmap - standard get_voltage_sel for regmap users 228 * 229 * @rdev: regulator to operate on 230 * 231 * Regulators that use regmap for their register I/O can set the 232 * vsel_reg and vsel_mask fields in their descriptor and then use this 233 * as their get_voltage_vsel operation, saving some code. 234 */ 235 int regulator_get_voltage_sel_regmap(struct regulator_dev *rdev) 236 { 237 unsigned int val; 238 int ret; 239 240 ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val); 241 if (ret != 0) 242 return ret; 243 244 val &= rdev->desc->vsel_mask; 245 val >>= ffs(rdev->desc->vsel_mask) - 1; 246 247 return val; 248 } 249 EXPORT_SYMBOL_GPL(regulator_get_voltage_sel_regmap); 250 251 /** 252 * regulator_set_voltage_sel_regmap - standard set_voltage_sel for regmap users 253 * 254 * @rdev: regulator to operate on 255 * @sel: Selector to set 256 * 257 * Regulators that use regmap for their register I/O can set the 258 * vsel_reg and vsel_mask fields in their descriptor and then use this 259 * as their set_voltage_vsel operation, saving some code. 260 */ 261 int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel) 262 { 263 int ret; 264 265 sel <<= ffs(rdev->desc->vsel_mask) - 1; 266 267 ret = regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, 268 rdev->desc->vsel_mask, sel); 269 if (ret) 270 return ret; 271 272 if (rdev->desc->apply_bit) 273 ret = regmap_update_bits(rdev->regmap, rdev->desc->apply_reg, 274 rdev->desc->apply_bit, 275 rdev->desc->apply_bit); 276 return ret; 277 } 278 EXPORT_SYMBOL_GPL(regulator_set_voltage_sel_regmap); 279 280 /** 281 * regulator_map_voltage_iterate - map_voltage() based on list_voltage() 282 * 283 * @rdev: Regulator to operate on 284 * @min_uV: Lower bound for voltage 285 * @max_uV: Upper bound for voltage 286 * 287 * Drivers implementing set_voltage_sel() and list_voltage() can use 288 * this as their map_voltage() operation. It will find a suitable 289 * voltage by calling list_voltage() until it gets something in bounds 290 * for the requested voltages. 291 */ 292 int regulator_map_voltage_iterate(struct regulator_dev *rdev, 293 int min_uV, int max_uV) 294 { 295 int best_val = INT_MAX; 296 int selector = 0; 297 int i, ret; 298 299 /* Find the smallest voltage that falls within the specified 300 * range. 301 */ 302 for (i = 0; i < rdev->desc->n_voltages; i++) { 303 ret = rdev->desc->ops->list_voltage(rdev, i); 304 if (ret < 0) 305 continue; 306 307 if (ret < best_val && ret >= min_uV && ret <= max_uV) { 308 best_val = ret; 309 selector = i; 310 } 311 } 312 313 if (best_val != INT_MAX) 314 return selector; 315 else 316 return -EINVAL; 317 } 318 EXPORT_SYMBOL_GPL(regulator_map_voltage_iterate); 319 320 /** 321 * regulator_map_voltage_ascend - map_voltage() for ascendant voltage list 322 * 323 * @rdev: Regulator to operate on 324 * @min_uV: Lower bound for voltage 325 * @max_uV: Upper bound for voltage 326 * 327 * Drivers that have ascendant voltage list can use this as their 328 * map_voltage() operation. 329 */ 330 int regulator_map_voltage_ascend(struct regulator_dev *rdev, 331 int min_uV, int max_uV) 332 { 333 int i, ret; 334 335 for (i = 0; i < rdev->desc->n_voltages; i++) { 336 ret = rdev->desc->ops->list_voltage(rdev, i); 337 if (ret < 0) 338 continue; 339 340 if (ret > max_uV) 341 break; 342 343 if (ret >= min_uV && ret <= max_uV) 344 return i; 345 } 346 347 return -EINVAL; 348 } 349 EXPORT_SYMBOL_GPL(regulator_map_voltage_ascend); 350 351 /** 352 * regulator_map_voltage_linear - map_voltage() for simple linear mappings 353 * 354 * @rdev: Regulator to operate on 355 * @min_uV: Lower bound for voltage 356 * @max_uV: Upper bound for voltage 357 * 358 * Drivers providing min_uV and uV_step in their regulator_desc can 359 * use this as their map_voltage() operation. 360 */ 361 int regulator_map_voltage_linear(struct regulator_dev *rdev, 362 int min_uV, int max_uV) 363 { 364 int ret, voltage; 365 366 /* Allow uV_step to be 0 for fixed voltage */ 367 if (rdev->desc->n_voltages == 1 && rdev->desc->uV_step == 0) { 368 if (min_uV <= rdev->desc->min_uV && rdev->desc->min_uV <= max_uV) 369 return 0; 370 else 371 return -EINVAL; 372 } 373 374 if (!rdev->desc->uV_step) { 375 BUG_ON(!rdev->desc->uV_step); 376 return -EINVAL; 377 } 378 379 if (min_uV < rdev->desc->min_uV) 380 min_uV = rdev->desc->min_uV; 381 382 ret = DIV_ROUND_UP(min_uV - rdev->desc->min_uV, rdev->desc->uV_step); 383 if (ret < 0) 384 return ret; 385 386 ret += rdev->desc->linear_min_sel; 387 388 /* Map back into a voltage to verify we're still in bounds */ 389 voltage = rdev->desc->ops->list_voltage(rdev, ret); 390 if (voltage < min_uV || voltage > max_uV) 391 return -EINVAL; 392 393 return ret; 394 } 395 EXPORT_SYMBOL_GPL(regulator_map_voltage_linear); 396 397 /** 398 * regulator_map_voltage_linear_range - map_voltage() for multiple linear ranges 399 * 400 * @rdev: Regulator to operate on 401 * @min_uV: Lower bound for voltage 402 * @max_uV: Upper bound for voltage 403 * 404 * Drivers providing linear_ranges in their descriptor can use this as 405 * their map_voltage() callback. 406 */ 407 int regulator_map_voltage_linear_range(struct regulator_dev *rdev, 408 int min_uV, int max_uV) 409 { 410 const struct linear_range *range; 411 int ret = -EINVAL; 412 unsigned int sel; 413 bool found; 414 int voltage, i; 415 416 if (!rdev->desc->n_linear_ranges) { 417 BUG_ON(!rdev->desc->n_linear_ranges); 418 return -EINVAL; 419 } 420 421 for (i = 0; i < rdev->desc->n_linear_ranges; i++) { 422 range = &rdev->desc->linear_ranges[i]; 423 424 ret = linear_range_get_selector_high(range, min_uV, &sel, 425 &found); 426 if (ret) 427 continue; 428 ret = sel; 429 430 /* 431 * Map back into a voltage to verify we're still in bounds. 432 * If we are not, then continue checking rest of the ranges. 433 */ 434 voltage = rdev->desc->ops->list_voltage(rdev, sel); 435 if (voltage >= min_uV && voltage <= max_uV) 436 break; 437 } 438 439 if (i == rdev->desc->n_linear_ranges) 440 return -EINVAL; 441 442 return ret; 443 } 444 EXPORT_SYMBOL_GPL(regulator_map_voltage_linear_range); 445 446 /** 447 * regulator_map_voltage_pickable_linear_range - map_voltage, pickable ranges 448 * 449 * @rdev: Regulator to operate on 450 * @min_uV: Lower bound for voltage 451 * @max_uV: Upper bound for voltage 452 * 453 * Drivers providing pickable linear_ranges in their descriptor can use 454 * this as their map_voltage() callback. 455 */ 456 int regulator_map_voltage_pickable_linear_range(struct regulator_dev *rdev, 457 int min_uV, int max_uV) 458 { 459 const struct linear_range *range; 460 int ret = -EINVAL; 461 int voltage, i; 462 unsigned int selector = 0; 463 464 if (!rdev->desc->n_linear_ranges) { 465 BUG_ON(!rdev->desc->n_linear_ranges); 466 return -EINVAL; 467 } 468 469 for (i = 0; i < rdev->desc->n_linear_ranges; i++) { 470 int linear_max_uV; 471 bool found; 472 unsigned int sel; 473 474 range = &rdev->desc->linear_ranges[i]; 475 linear_max_uV = linear_range_get_max_value(range); 476 477 if (!(min_uV <= linear_max_uV && max_uV >= range->min)) { 478 selector += linear_range_values_in_range(range); 479 continue; 480 } 481 482 ret = linear_range_get_selector_high(range, min_uV, &sel, 483 &found); 484 if (ret) { 485 selector += linear_range_values_in_range(range); 486 continue; 487 } 488 489 ret = selector + sel - range->min_sel; 490 491 voltage = rdev->desc->ops->list_voltage(rdev, ret); 492 493 /* 494 * Map back into a voltage to verify we're still in bounds. 495 * We may have overlapping voltage ranges. Hence we don't 496 * exit but retry until we have checked all ranges. 497 */ 498 if (voltage < min_uV || voltage > max_uV) 499 selector += linear_range_values_in_range(range); 500 else 501 break; 502 } 503 504 if (i == rdev->desc->n_linear_ranges) 505 return -EINVAL; 506 507 return ret; 508 } 509 EXPORT_SYMBOL_GPL(regulator_map_voltage_pickable_linear_range); 510 511 /** 512 * regulator_list_voltage_linear - List voltages with simple calculation 513 * 514 * @rdev: Regulator device 515 * @selector: Selector to convert into a voltage 516 * 517 * Regulators with a simple linear mapping between voltages and 518 * selectors can set min_uV and uV_step in the regulator descriptor 519 * and then use this function as their list_voltage() operation, 520 */ 521 int regulator_list_voltage_linear(struct regulator_dev *rdev, 522 unsigned int selector) 523 { 524 if (selector >= rdev->desc->n_voltages) 525 return -EINVAL; 526 if (selector < rdev->desc->linear_min_sel) 527 return 0; 528 529 selector -= rdev->desc->linear_min_sel; 530 531 return rdev->desc->min_uV + (rdev->desc->uV_step * selector); 532 } 533 EXPORT_SYMBOL_GPL(regulator_list_voltage_linear); 534 535 /** 536 * regulator_list_voltage_pickable_linear_range - pickable range list voltages 537 * 538 * @rdev: Regulator device 539 * @selector: Selector to convert into a voltage 540 * 541 * list_voltage() operation, intended to be used by drivers utilizing pickable 542 * ranges helpers. 543 */ 544 int regulator_list_voltage_pickable_linear_range(struct regulator_dev *rdev, 545 unsigned int selector) 546 { 547 const struct linear_range *range; 548 int i; 549 unsigned int all_sels = 0; 550 551 if (!rdev->desc->n_linear_ranges) { 552 BUG_ON(!rdev->desc->n_linear_ranges); 553 return -EINVAL; 554 } 555 556 for (i = 0; i < rdev->desc->n_linear_ranges; i++) { 557 unsigned int sel_indexes; 558 559 range = &rdev->desc->linear_ranges[i]; 560 561 sel_indexes = linear_range_values_in_range(range) - 1; 562 563 if (all_sels + sel_indexes >= selector) { 564 selector -= all_sels; 565 /* 566 * As we see here, pickable ranges work only as 567 * long as the first selector for each pickable 568 * range is 0, and the each subsequent range for 569 * this 'pick' follow immediately at next unused 570 * selector (Eg. there is no gaps between ranges). 571 * I think this is fine but it probably should be 572 * documented. OTOH, whole pickable range stuff 573 * might benefit from some documentation 574 */ 575 return range->min + (range->step * selector); 576 } 577 578 all_sels += (sel_indexes + 1); 579 } 580 581 return -EINVAL; 582 } 583 EXPORT_SYMBOL_GPL(regulator_list_voltage_pickable_linear_range); 584 585 /** 586 * regulator_desc_list_voltage_linear_range - List voltages for linear ranges 587 * 588 * @desc: Regulator desc for regulator which volatges are to be listed 589 * @selector: Selector to convert into a voltage 590 * 591 * Regulators with a series of simple linear mappings between voltages 592 * and selectors who have set linear_ranges in the regulator descriptor 593 * can use this function prior regulator registration to list voltages. 594 * This is useful when voltages need to be listed during device-tree 595 * parsing. 596 */ 597 int regulator_desc_list_voltage_linear_range(const struct regulator_desc *desc, 598 unsigned int selector) 599 { 600 unsigned int val; 601 int ret; 602 603 BUG_ON(!desc->n_linear_ranges); 604 605 ret = linear_range_get_value_array(desc->linear_ranges, 606 desc->n_linear_ranges, selector, 607 &val); 608 if (ret) 609 return ret; 610 611 return val; 612 } 613 EXPORT_SYMBOL_GPL(regulator_desc_list_voltage_linear_range); 614 615 /** 616 * regulator_list_voltage_linear_range - List voltages for linear ranges 617 * 618 * @rdev: Regulator device 619 * @selector: Selector to convert into a voltage 620 * 621 * Regulators with a series of simple linear mappings between voltages 622 * and selectors can set linear_ranges in the regulator descriptor and 623 * then use this function as their list_voltage() operation, 624 */ 625 int regulator_list_voltage_linear_range(struct regulator_dev *rdev, 626 unsigned int selector) 627 { 628 return regulator_desc_list_voltage_linear_range(rdev->desc, selector); 629 } 630 EXPORT_SYMBOL_GPL(regulator_list_voltage_linear_range); 631 632 /** 633 * regulator_list_voltage_table - List voltages with table based mapping 634 * 635 * @rdev: Regulator device 636 * @selector: Selector to convert into a voltage 637 * 638 * Regulators with table based mapping between voltages and 639 * selectors can set volt_table in the regulator descriptor 640 * and then use this function as their list_voltage() operation. 641 */ 642 int regulator_list_voltage_table(struct regulator_dev *rdev, 643 unsigned int selector) 644 { 645 if (!rdev->desc->volt_table) { 646 BUG_ON(!rdev->desc->volt_table); 647 return -EINVAL; 648 } 649 650 if (selector >= rdev->desc->n_voltages) 651 return -EINVAL; 652 if (selector < rdev->desc->linear_min_sel) 653 return 0; 654 655 return rdev->desc->volt_table[selector]; 656 } 657 EXPORT_SYMBOL_GPL(regulator_list_voltage_table); 658 659 /** 660 * regulator_set_bypass_regmap - Default set_bypass() using regmap 661 * 662 * @rdev: device to operate on. 663 * @enable: state to set. 664 */ 665 int regulator_set_bypass_regmap(struct regulator_dev *rdev, bool enable) 666 { 667 unsigned int val; 668 669 if (enable) { 670 val = rdev->desc->bypass_val_on; 671 if (!val) 672 val = rdev->desc->bypass_mask; 673 } else { 674 val = rdev->desc->bypass_val_off; 675 } 676 677 return regmap_update_bits(rdev->regmap, rdev->desc->bypass_reg, 678 rdev->desc->bypass_mask, val); 679 } 680 EXPORT_SYMBOL_GPL(regulator_set_bypass_regmap); 681 682 /** 683 * regulator_set_soft_start_regmap - Default set_soft_start() using regmap 684 * 685 * @rdev: device to operate on. 686 */ 687 int regulator_set_soft_start_regmap(struct regulator_dev *rdev) 688 { 689 unsigned int val; 690 691 val = rdev->desc->soft_start_val_on; 692 if (!val) 693 val = rdev->desc->soft_start_mask; 694 695 return regmap_update_bits(rdev->regmap, rdev->desc->soft_start_reg, 696 rdev->desc->soft_start_mask, val); 697 } 698 EXPORT_SYMBOL_GPL(regulator_set_soft_start_regmap); 699 700 /** 701 * regulator_set_pull_down_regmap - Default set_pull_down() using regmap 702 * 703 * @rdev: device to operate on. 704 */ 705 int regulator_set_pull_down_regmap(struct regulator_dev *rdev) 706 { 707 unsigned int val; 708 709 val = rdev->desc->pull_down_val_on; 710 if (!val) 711 val = rdev->desc->pull_down_mask; 712 713 return regmap_update_bits(rdev->regmap, rdev->desc->pull_down_reg, 714 rdev->desc->pull_down_mask, val); 715 } 716 EXPORT_SYMBOL_GPL(regulator_set_pull_down_regmap); 717 718 /** 719 * regulator_get_bypass_regmap - Default get_bypass() using regmap 720 * 721 * @rdev: device to operate on. 722 * @enable: current state. 723 */ 724 int regulator_get_bypass_regmap(struct regulator_dev *rdev, bool *enable) 725 { 726 unsigned int val; 727 unsigned int val_on = rdev->desc->bypass_val_on; 728 int ret; 729 730 ret = regmap_read(rdev->regmap, rdev->desc->bypass_reg, &val); 731 if (ret != 0) 732 return ret; 733 734 if (!val_on) 735 val_on = rdev->desc->bypass_mask; 736 737 *enable = (val & rdev->desc->bypass_mask) == val_on; 738 739 return 0; 740 } 741 EXPORT_SYMBOL_GPL(regulator_get_bypass_regmap); 742 743 /** 744 * regulator_set_active_discharge_regmap - Default set_active_discharge() 745 * using regmap 746 * 747 * @rdev: device to operate on. 748 * @enable: state to set, 0 to disable and 1 to enable. 749 */ 750 int regulator_set_active_discharge_regmap(struct regulator_dev *rdev, 751 bool enable) 752 { 753 unsigned int val; 754 755 if (enable) 756 val = rdev->desc->active_discharge_on; 757 else 758 val = rdev->desc->active_discharge_off; 759 760 return regmap_update_bits(rdev->regmap, 761 rdev->desc->active_discharge_reg, 762 rdev->desc->active_discharge_mask, val); 763 } 764 EXPORT_SYMBOL_GPL(regulator_set_active_discharge_regmap); 765 766 /** 767 * regulator_set_current_limit_regmap - set_current_limit for regmap users 768 * 769 * @rdev: regulator to operate on 770 * @min_uA: Lower bound for current limit 771 * @max_uA: Upper bound for current limit 772 * 773 * Regulators that use regmap for their register I/O can set curr_table, 774 * csel_reg and csel_mask fields in their descriptor and then use this 775 * as their set_current_limit operation, saving some code. 776 */ 777 int regulator_set_current_limit_regmap(struct regulator_dev *rdev, 778 int min_uA, int max_uA) 779 { 780 unsigned int n_currents = rdev->desc->n_current_limits; 781 int i, sel = -1; 782 783 if (n_currents == 0) 784 return -EINVAL; 785 786 if (rdev->desc->curr_table) { 787 const unsigned int *curr_table = rdev->desc->curr_table; 788 bool ascend = curr_table[n_currents - 1] > curr_table[0]; 789 790 /* search for closest to maximum */ 791 if (ascend) { 792 for (i = n_currents - 1; i >= 0; i--) { 793 if (min_uA <= curr_table[i] && 794 curr_table[i] <= max_uA) { 795 sel = i; 796 break; 797 } 798 } 799 } else { 800 for (i = 0; i < n_currents; i++) { 801 if (min_uA <= curr_table[i] && 802 curr_table[i] <= max_uA) { 803 sel = i; 804 break; 805 } 806 } 807 } 808 } 809 810 if (sel < 0) 811 return -EINVAL; 812 813 sel <<= ffs(rdev->desc->csel_mask) - 1; 814 815 return regmap_update_bits(rdev->regmap, rdev->desc->csel_reg, 816 rdev->desc->csel_mask, sel); 817 } 818 EXPORT_SYMBOL_GPL(regulator_set_current_limit_regmap); 819 820 /** 821 * regulator_get_current_limit_regmap - get_current_limit for regmap users 822 * 823 * @rdev: regulator to operate on 824 * 825 * Regulators that use regmap for their register I/O can set the 826 * csel_reg and csel_mask fields in their descriptor and then use this 827 * as their get_current_limit operation, saving some code. 828 */ 829 int regulator_get_current_limit_regmap(struct regulator_dev *rdev) 830 { 831 unsigned int val; 832 int ret; 833 834 ret = regmap_read(rdev->regmap, rdev->desc->csel_reg, &val); 835 if (ret != 0) 836 return ret; 837 838 val &= rdev->desc->csel_mask; 839 val >>= ffs(rdev->desc->csel_mask) - 1; 840 841 if (rdev->desc->curr_table) { 842 if (val >= rdev->desc->n_current_limits) 843 return -EINVAL; 844 845 return rdev->desc->curr_table[val]; 846 } 847 848 return -EINVAL; 849 } 850 EXPORT_SYMBOL_GPL(regulator_get_current_limit_regmap); 851 852 /** 853 * regulator_bulk_set_supply_names - initialize the 'supply' fields in an array 854 * of regulator_bulk_data structs 855 * 856 * @consumers: array of regulator_bulk_data entries to initialize 857 * @supply_names: array of supply name strings 858 * @num_supplies: number of supply names to initialize 859 * 860 * Note: the 'consumers' array must be the size of 'num_supplies'. 861 */ 862 void regulator_bulk_set_supply_names(struct regulator_bulk_data *consumers, 863 const char *const *supply_names, 864 unsigned int num_supplies) 865 { 866 unsigned int i; 867 868 for (i = 0; i < num_supplies; i++) 869 consumers[i].supply = supply_names[i]; 870 } 871 EXPORT_SYMBOL_GPL(regulator_bulk_set_supply_names); 872 873 /** 874 * regulator_is_equal - test whether two regulators are the same 875 * 876 * @reg1: first regulator to operate on 877 * @reg2: second regulator to operate on 878 */ 879 bool regulator_is_equal(struct regulator *reg1, struct regulator *reg2) 880 { 881 return reg1->rdev == reg2->rdev; 882 } 883 EXPORT_SYMBOL_GPL(regulator_is_equal); 884