linux/drivers/regulator/helpers.c
<<
>>
Prefs
   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 */
  27int 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}
  48EXPORT_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 */
  59int 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}
  74EXPORT_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 */
  85int 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}
 100EXPORT_SYMBOL_GPL(regulator_disable_regmap);
 101
 102static 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 */
 129int 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}
 160EXPORT_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 */
 173int 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}
 224EXPORT_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 */
 235int 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}
 249EXPORT_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 */
 261int 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}
 278EXPORT_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 */
 292int 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}
 318EXPORT_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 */
 330int 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}
 349EXPORT_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 */
 361int 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}
 395EXPORT_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 */
 407int 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}
 444EXPORT_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 */
 456int 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}
 509EXPORT_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 */
 523int 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}
 536EXPORT_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 */
 548int regulator_list_voltage_linear(struct regulator_dev *rdev,
 549                                  unsigned int selector)
 550{
 551        return regulator_desc_list_voltage_linear(rdev->desc, selector);
 552}
 553EXPORT_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 */
 564int 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}
 603EXPORT_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 */
 617int 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}
 633EXPORT_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 */
 645int 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}
 650EXPORT_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 */
 662int 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}
 677EXPORT_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 */
 685int 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}
 700EXPORT_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 */
 707int 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}
 718EXPORT_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 */
 725int 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}
 736EXPORT_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 */
 744int 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}
 761EXPORT_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 */
 770int 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}
 784EXPORT_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 */
 797int 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}
 838EXPORT_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 */
 849int 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}
 870EXPORT_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 */
 882void 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}
 891EXPORT_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 */
 899bool regulator_is_equal(struct regulator *reg1, struct regulator *reg2)
 900{
 901        return reg1->rdev == reg2->rdev;
 902}
 903EXPORT_SYMBOL_GPL(regulator_is_equal);
 904
 905static int find_closest_bigger(unsigned int target, const unsigned int *table,
 906                               unsigned int num_sel, unsigned int *sel)
 907{
 908        unsigned int s, tmp, max, maxsel = 0;
 909        bool found = false;
 910
 911        max = table[0];
 912
 913        for (s = 0; s < num_sel; s++) {
 914                if (table[s] > max) {
 915                        max = table[s];
 916                        maxsel = s;
 917                }
 918                if (table[s] >= target) {
 919                        if (!found || table[s] - target < tmp - target) {
 920                                tmp = table[s];
 921                                *sel = s;
 922                                found = true;
 923                                if (tmp == target)
 924                                        break;
 925                        }
 926                }
 927        }
 928
 929        if (!found) {
 930                *sel = maxsel;
 931                return -EINVAL;
 932        }
 933
 934        return 0;
 935}
 936
 937/**
 938 * regulator_set_ramp_delay_regmap - set_ramp_delay() helper
 939 *
 940 * @rdev: regulator to operate on
 941 *
 942 * Regulators that use regmap for their register I/O can set the ramp_reg
 943 * and ramp_mask fields in their descriptor and then use this as their
 944 * set_ramp_delay operation, saving some code.
 945 */
 946int regulator_set_ramp_delay_regmap(struct regulator_dev *rdev, int ramp_delay)
 947{
 948        int ret;
 949        unsigned int sel;
 950
 951        if (WARN_ON(!rdev->desc->n_ramp_values || !rdev->desc->ramp_delay_table))
 952                return -EINVAL;
 953
 954        ret = find_closest_bigger(ramp_delay, rdev->desc->ramp_delay_table,
 955                                  rdev->desc->n_ramp_values, &sel);
 956
 957        if (ret) {
 958                dev_warn(rdev_get_dev(rdev),
 959                         "Can't set ramp-delay %u, setting %u\n", ramp_delay,
 960                         rdev->desc->ramp_delay_table[sel]);
 961        }
 962
 963        sel <<= ffs(rdev->desc->ramp_mask) - 1;
 964
 965        return regmap_update_bits(rdev->regmap, rdev->desc->ramp_reg,
 966                                  rdev->desc->ramp_mask, sel);
 967}
 968EXPORT_SYMBOL_GPL(regulator_set_ramp_delay_regmap);
 969