mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
regulator: Add regmap helper for ramp-delay setting
Quite a few regulator ICs do support setting ramp-delay by writing a value matching the delay to a ramp-delay register. Provide a simple helper for table-based delay setting. Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> Link: https://lore.kernel.org/r/f101f1db564cf32cb58719c77af0b00d7236bb89.1617020713.git.matti.vaittinen@fi.rohmeurope.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
e3baacf542
commit
fb8fee9efd
@ -901,3 +901,68 @@ bool regulator_is_equal(struct regulator *reg1, struct regulator *reg2)
|
|||||||
return reg1->rdev == reg2->rdev;
|
return reg1->rdev == reg2->rdev;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(regulator_is_equal);
|
EXPORT_SYMBOL_GPL(regulator_is_equal);
|
||||||
|
|
||||||
|
static int find_closest_bigger(unsigned int target, const unsigned int *table,
|
||||||
|
unsigned int num_sel, unsigned int *sel)
|
||||||
|
{
|
||||||
|
unsigned int s, tmp, max, maxsel = 0;
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
max = table[0];
|
||||||
|
|
||||||
|
for (s = 0; s < num_sel; s++) {
|
||||||
|
if (table[s] > max) {
|
||||||
|
max = table[s];
|
||||||
|
maxsel = s;
|
||||||
|
}
|
||||||
|
if (table[s] >= target) {
|
||||||
|
if (!found || table[s] - target < tmp - target) {
|
||||||
|
tmp = table[s];
|
||||||
|
*sel = s;
|
||||||
|
found = true;
|
||||||
|
if (tmp == target)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
*sel = maxsel;
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* regulator_set_ramp_delay_regmap - set_ramp_delay() helper
|
||||||
|
*
|
||||||
|
* @rdev: regulator to operate on
|
||||||
|
*
|
||||||
|
* Regulators that use regmap for their register I/O can set the ramp_reg
|
||||||
|
* and ramp_mask fields in their descriptor and then use this as their
|
||||||
|
* set_ramp_delay operation, saving some code.
|
||||||
|
*/
|
||||||
|
int regulator_set_ramp_delay_regmap(struct regulator_dev *rdev, int ramp_delay)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
unsigned int sel;
|
||||||
|
|
||||||
|
if (!rdev->desc->n_ramp_values)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
ret = find_closest_bigger(ramp_delay, rdev->desc->ramp_delay_table,
|
||||||
|
rdev->desc->n_ramp_values, &sel);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
dev_warn(rdev_get_dev(rdev),
|
||||||
|
"Can't set ramp-delay %u, setting %u\n", ramp_delay,
|
||||||
|
rdev->desc->ramp_delay_table[sel]);
|
||||||
|
}
|
||||||
|
|
||||||
|
sel <<= ffs(rdev->desc->ramp_mask) - 1;
|
||||||
|
|
||||||
|
return regmap_update_bits(rdev->regmap, rdev->desc->ramp_reg,
|
||||||
|
rdev->desc->ramp_mask, sel);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(regulator_set_ramp_delay_regmap);
|
||||||
|
@ -373,6 +373,10 @@ struct regulator_desc {
|
|||||||
unsigned int pull_down_reg;
|
unsigned int pull_down_reg;
|
||||||
unsigned int pull_down_mask;
|
unsigned int pull_down_mask;
|
||||||
unsigned int pull_down_val_on;
|
unsigned int pull_down_val_on;
|
||||||
|
unsigned int ramp_reg;
|
||||||
|
unsigned int ramp_mask;
|
||||||
|
const unsigned int *ramp_delay_table;
|
||||||
|
unsigned int n_ramp_values;
|
||||||
|
|
||||||
unsigned int enable_time;
|
unsigned int enable_time;
|
||||||
|
|
||||||
@ -535,6 +539,7 @@ int regulator_set_current_limit_regmap(struct regulator_dev *rdev,
|
|||||||
int min_uA, int max_uA);
|
int min_uA, int max_uA);
|
||||||
int regulator_get_current_limit_regmap(struct regulator_dev *rdev);
|
int regulator_get_current_limit_regmap(struct regulator_dev *rdev);
|
||||||
void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data);
|
void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data);
|
||||||
|
int regulator_set_ramp_delay_regmap(struct regulator_dev *rdev, int ramp_delay);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Helper functions intended to be used by regulator drivers prior registering
|
* Helper functions intended to be used by regulator drivers prior registering
|
||||||
|
Loading…
Reference in New Issue
Block a user