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_desc_list_voltage_linear - List voltages with simple calculation 513 * 514 * @desc: Regulator desc for regulator which volatges are to be listed 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 prior regulator registration to list 520 * the voltages. This is useful when voltages need to be listed during 521 * device-tree parsing. 522 */ 523 int regulator_desc_list_voltage_linear(const struct regulator_desc *desc, 524 unsigned int selector) 525 { 526 if (selector >= desc->n_voltages) 527 return -EINVAL; 528 529 if (selector < desc->linear_min_sel) 530 return 0; 531 532 selector -= desc->linear_min_sel; 533 534 return desc->min_uV + (desc->uV_step * selector); 535 } 536 EXPORT_SYMBOL_GPL(regulator_desc_list_voltage_linear); 537 538 /** 539 * regulator_list_voltage_linear - List voltages with simple calculation 540 * 541 * @rdev: Regulator device 542 * @selector: Selector to convert into a voltage 543 * 544 * Regulators with a simple linear mapping between voltages and 545 * selectors can set min_uV and uV_step in the regulator descriptor 546 * and then use this function as their list_voltage() operation, 547 */ 548 int regulator_list_voltage_linear(struct regulator_dev *rdev, 549 unsigned int selector) 550 { 551 return regulator_desc_list_voltage_linear(rdev->desc, selector); 552 } 553 EXPORT_SYMBOL_GPL(regulator_list_voltage_linear); 554 555 /** 556 * regulator_list_voltage_pickable_linear_range - pickable range list voltages 557 * 558 * @rdev: Regulator device 559 * @selector: Selector to convert into a voltage 560 * 561 * list_voltage() operation, intended to be used by drivers utilizing pickable 562 * ranges helpers. 563 */ 564 int regulator_list_voltage_pickable_linear_range(struct regulator_dev *rdev, 565 unsigned int selector) 566 { 567 const struct linear_range *range; 568 int i; 569 unsigned int all_sels = 0; 570 571 if (!rdev->desc->n_linear_ranges) { 572 BUG_ON(!rdev->desc->n_linear_ranges); 573 return -EINVAL; 574 } 575 576 for (i = 0; i < rdev->desc->n_linear_ranges; i++) { 577 unsigned int sel_indexes; 578 579 range = &rdev->desc->linear_ranges[i]; 580 581 sel_indexes = linear_range_values_in_range(range) - 1; 582 583 if (all_sels + sel_indexes >= selector) { 584 selector -= all_sels; 585 /* 586 * As we see here, pickable ranges work only as 587 * long as the first selector for each pickable 588 * range is 0, and the each subsequent range for 589 * this 'pick' follow immediately at next unused 590 * selector (Eg. there is no gaps between ranges). 591 * I think this is fine but it probably should be 592 * documented. OTOH, whole pickable range stuff 593 * might benefit from some documentation 594 */ 595 return range->min + (range->step * selector); 596 } 597 598 all_sels += (sel_indexes + 1); 599 } 600 601 return -EINVAL; 602 } 603 EXPORT_SYMBOL_GPL(regulator_list_voltage_pickable_linear_range); 604 605 /** 606 * regulator_desc_list_voltage_linear_range - List voltages for linear ranges 607 * 608 * @desc: Regulator desc for regulator which volatges are to be listed 609 * @selector: Selector to convert into a voltage 610 * 611 * Regulators with a series of simple linear mappings between voltages 612 * and selectors who have set linear_ranges in the regulator descriptor 613 * can use this function prior regulator registration to list voltages. 614 * This is useful when voltages need to be listed during device-tree 615 * parsing. 616 */ 617 int regulator_desc_list_voltage_linear_range(const struct regulator_desc *desc, 618 unsigned int selector) 619 { 620 unsigned int val; 621 int ret; 622 623 BUG_ON(!desc->n_linear_ranges); 624 625 ret = linear_range_get_value_array(desc->linear_ranges, 626 desc->n_linear_ranges, selector, 627 &val); 628 if (ret) 629 return ret; 630 631 return val; 632 } 633 EXPORT_SYMBOL_GPL(regulator_desc_list_voltage_linear_range); 634 635 /** 636 * regulator_list_voltage_linear_range - List voltages for linear ranges 637 * 638 * @rdev: Regulator device 639 * @selector: Selector to convert into a voltage 640 * 641 * Regulators with a series of simple linear mappings between voltages 642 * and selectors can set linear_ranges in the regulator descriptor and 643 * then use this function as their list_voltage() operation, 644 */ 645 int regulator_list_voltage_linear_range(struct regulator_dev *rdev, 646 unsigned int selector) 647 { 648 return regulator_desc_list_voltage_linear_range(rdev->desc, selector); 649 } 650 EXPORT_SYMBOL_GPL(regulator_list_voltage_linear_range); 651 652 /** 653 * regulator_list_voltage_table - List voltages with table based mapping 654 * 655 * @rdev: Regulator device 656 * @selector: Selector to convert into a voltage 657 * 658 * Regulators with table based mapping between voltages and 659 * selectors can set volt_table in the regulator descriptor 660 * and then use this function as their list_voltage() operation. 661 */ 662 int regulator_list_voltage_table(struct regulator_dev *rdev, 663 unsigned int selector) 664 { 665 if (!rdev->desc->volt_table) { 666 BUG_ON(!rdev->desc->volt_table); 667 return -EINVAL; 668 } 669 670 if (selector >= rdev->desc->n_voltages) 671 return -EINVAL; 672 if (selector < rdev->desc->linear_min_sel) 673 return 0; 674 675 return rdev->desc->volt_table[selector]; 676 } 677 EXPORT_SYMBOL_GPL(regulator_list_voltage_table); 678 679 /** 680 * regulator_set_bypass_regmap - Default set_bypass() using regmap 681 * 682 * @rdev: device to operate on. 683 * @enable: state to set. 684 */ 685 int regulator_set_bypass_regmap(struct regulator_dev *rdev, bool enable) 686 { 687 unsigned int val; 688 689 if (enable) { 690 val = rdev->desc->bypass_val_on; 691 if (!val) 692 val = rdev->desc->bypass_mask; 693 } else { 694 val = rdev->desc->bypass_val_off; 695 } 696 697 return regmap_update_bits(rdev->regmap, rdev->desc->bypass_reg, 698 rdev->desc->bypass_mask, val); 699 } 700 EXPORT_SYMBOL_GPL(regulator_set_bypass_regmap); 701 702 /** 703 * regulator_set_soft_start_regmap - Default set_soft_start() using regmap 704 * 705 * @rdev: device to operate on. 706 */ 707 int regulator_set_soft_start_regmap(struct regulator_dev *rdev) 708 { 709 unsigned int val; 710 711 val = rdev->desc->soft_start_val_on; 712 if (!val) 713 val = rdev->desc->soft_start_mask; 714 715 return regmap_update_bits(rdev->regmap, rdev->desc->soft_start_reg, 716 rdev->desc->soft_start_mask, val); 717 } 718 EXPORT_SYMBOL_GPL(regulator_set_soft_start_regmap); 719 720 /** 721 * regulator_set_pull_down_regmap - Default set_pull_down() using regmap 722 * 723 * @rdev: device to operate on. 724 */ 725 int regulator_set_pull_down_regmap(struct regulator_dev *rdev) 726 { 727 unsigned int val; 728 729 val = rdev->desc->pull_down_val_on; 730 if (!val) 731 val = rdev->desc->pull_down_mask; 732 733 return regmap_update_bits(rdev->regmap, rdev->desc->pull_down_reg, 734 rdev->desc->pull_down_mask, val); 735 } 736 EXPORT_SYMBOL_GPL(regulator_set_pull_down_regmap); 737 738 /** 739 * regulator_get_bypass_regmap - Default get_bypass() using regmap 740 * 741 * @rdev: device to operate on. 742 * @enable: current state. 743 */ 744 int regulator_get_bypass_regmap(struct regulator_dev *rdev, bool *enable) 745 { 746 unsigned int val; 747 unsigned int val_on = rdev->desc->bypass_val_on; 748 int ret; 749 750 ret = regmap_read(rdev->regmap, rdev->desc->bypass_reg, &val); 751 if (ret != 0) 752 return ret; 753 754 if (!val_on) 755 val_on = rdev->desc->bypass_mask; 756 757 *enable = (val & rdev->desc->bypass_mask) == val_on; 758 759 return 0; 760 } 761 EXPORT_SYMBOL_GPL(regulator_get_bypass_regmap); 762 763 /** 764 * regulator_set_active_discharge_regmap - Default set_active_discharge() 765 * using regmap 766 * 767 * @rdev: device to operate on. 768 * @enable: state to set, 0 to disable and 1 to enable. 769 */ 770 int regulator_set_active_discharge_regmap(struct regulator_dev *rdev, 771 bool enable) 772 { 773 unsigned int val; 774 775 if (enable) 776 val = rdev->desc->active_discharge_on; 777 else 778 val = rdev->desc->active_discharge_off; 779 780 return regmap_update_bits(rdev->regmap, 781 rdev->desc->active_discharge_reg, 782 rdev->desc->active_discharge_mask, val); 783 } 784 EXPORT_SYMBOL_GPL(regulator_set_active_discharge_regmap); 785 786 /** 787 * regulator_set_current_limit_regmap - set_current_limit for regmap users 788 * 789 * @rdev: regulator to operate on 790 * @min_uA: Lower bound for current limit 791 * @max_uA: Upper bound for current limit 792 * 793 * Regulators that use regmap for their register I/O can set curr_table, 794 * csel_reg and csel_mask fields in their descriptor and then use this 795 * as their set_current_limit operation, saving some code. 796 */ 797 int regulator_set_current_limit_regmap(struct regulator_dev *rdev, 798 int min_uA, int max_uA) 799 { 800 unsigned int n_currents = rdev->desc->n_current_limits; 801 int i, sel = -1; 802 803 if (n_currents == 0) 804 return -EINVAL; 805 806 if (rdev->desc->curr_table) { 807 const unsigned int *curr_table = rdev->desc->curr_table; 808 bool ascend = curr_table[n_currents - 1] > curr_table[0]; 809 810 /* search for closest to maximum */ 811 if (ascend) { 812 for (i = n_currents - 1; i >= 0; i--) { 813 if (min_uA <= curr_table[i] && 814 curr_table[i] <= max_uA) { 815 sel = i; 816 break; 817 } 818 } 819 } else { 820 for (i = 0; i < n_currents; i++) { 821 if (min_uA <= curr_table[i] && 822 curr_table[i] <= max_uA) { 823 sel = i; 824 break; 825 } 826 } 827 } 828 } 829 830 if (sel < 0) 831 return -EINVAL; 832 833 sel <<= ffs(rdev->desc->csel_mask) - 1; 834 835 return regmap_update_bits(rdev->regmap, rdev->desc->csel_reg, 836 rdev->desc->csel_mask, sel); 837 } 838 EXPORT_SYMBOL_GPL(regulator_set_current_limit_regmap); 839 840 /** 841 * regulator_get_current_limit_regmap - get_current_limit for regmap users 842 * 843 * @rdev: regulator to operate on 844 * 845 * Regulators that use regmap for their register I/O can set the 846 * csel_reg and csel_mask fields in their descriptor and then use this 847 * as their get_current_limit operation, saving some code. 848 */ 849 int regulator_get_current_limit_regmap(struct regulator_dev *rdev) 850 { 851 unsigned int val; 852 int ret; 853 854 ret = regmap_read(rdev->regmap, rdev->desc->csel_reg, &val); 855 if (ret != 0) 856 return ret; 857 858 val &= rdev->desc->csel_mask; 859 val >>= ffs(rdev->desc->csel_mask) - 1; 860 861 if (rdev->desc->curr_table) { 862 if (val >= rdev->desc->n_current_limits) 863 return -EINVAL; 864 865 return rdev->desc->curr_table[val]; 866 } 867 868 return -EINVAL; 869 } 870 EXPORT_SYMBOL_GPL(regulator_get_current_limit_regmap); 871 872 /** 873 * regulator_bulk_set_supply_names - initialize the 'supply' fields in an array 874 * of regulator_bulk_data structs 875 * 876 * @consumers: array of regulator_bulk_data entries to initialize 877 * @supply_names: array of supply name strings 878 * @num_supplies: number of supply names to initialize 879 * 880 * Note: the 'consumers' array must be the size of 'num_supplies'. 881 */ 882 void regulator_bulk_set_supply_names(struct regulator_bulk_data *consumers, 883 const char *const *supply_names, 884 unsigned int num_supplies) 885 { 886 unsigned int i; 887 888 for (i = 0; i < num_supplies; i++) 889 consumers[i].supply = supply_names[i]; 890 } 891 EXPORT_SYMBOL_GPL(regulator_bulk_set_supply_names); 892 893 /** 894 * regulator_is_equal - test whether two regulators are the same 895 * 896 * @reg1: first regulator to operate on 897 * @reg2: second regulator to operate on 898 */ 899 bool regulator_is_equal(struct regulator *reg1, struct regulator *reg2) 900 { 901 return reg1->rdev == reg2->rdev; 902 } 903 EXPORT_SYMBOL_GPL(regulator_is_equal); 904 905 /** 906 * regulator_find_closest_bigger - helper to find offset in ramp delay table 907 * 908 * @target: targeted ramp_delay 909 * @table: table with supported ramp delays 910 * @num_sel: number of entries in the table 911 * @sel: Pointer to store table offset 912 * 913 * This is the internal helper used by regulator_set_ramp_delay_regmap to 914 * map ramp delay to register value. It should only be used directly if 915 * regulator_set_ramp_delay_regmap cannot handle a specific device setup 916 * (e.g. because the value is split over multiple registers). 917 */ 918 int regulator_find_closest_bigger(unsigned int target, const unsigned int *table, 919 unsigned int num_sel, unsigned int *sel) 920 { 921 unsigned int s, tmp, max, maxsel = 0; 922 bool found = false; 923 924 max = table[0]; 925 926 for (s = 0; s < num_sel; s++) { 927 if (table[s] > max) { 928 max = table[s]; 929 maxsel = s; 930 } 931 if (table[s] >= target) { 932 if (!found || table[s] - target < tmp - target) { 933 tmp = table[s]; 934 *sel = s; 935 found = true; 936 if (tmp == target) 937 break; 938 } 939 } 940 } 941 942 if (!found) { 943 *sel = maxsel; 944 return -EINVAL; 945 } 946 947 return 0; 948 } 949 EXPORT_SYMBOL_GPL(regulator_find_closest_bigger); 950 951 /** 952 * regulator_set_ramp_delay_regmap - set_ramp_delay() helper 953 * 954 * @rdev: regulator to operate on 955 * @ramp_delay: ramp-rate value given in units V/S (uV/uS) 956 * 957 * Regulators that use regmap for their register I/O can set the ramp_reg 958 * and ramp_mask fields in their descriptor and then use this as their 959 * set_ramp_delay operation, saving some code. 960 */ 961 int regulator_set_ramp_delay_regmap(struct regulator_dev *rdev, int ramp_delay) 962 { 963 int ret; 964 unsigned int sel; 965 966 if (WARN_ON(!rdev->desc->n_ramp_values || !rdev->desc->ramp_delay_table)) 967 return -EINVAL; 968 969 ret = regulator_find_closest_bigger(ramp_delay, rdev->desc->ramp_delay_table, 970 rdev->desc->n_ramp_values, &sel); 971 972 if (ret) { 973 dev_warn(rdev_get_dev(rdev), 974 "Can't set ramp-delay %u, setting %u\n", ramp_delay, 975 rdev->desc->ramp_delay_table[sel]); 976 } 977 978 sel <<= ffs(rdev->desc->ramp_mask) - 1; 979 980 return regmap_update_bits(rdev->regmap, rdev->desc->ramp_reg, 981 rdev->desc->ramp_mask, sel); 982 } 983 EXPORT_SYMBOL_GPL(regulator_set_ramp_delay_regmap); 984