cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

helpers.c (25426B)


      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);