lib: add linear range get selector within

Add linear range get selector within for choose closest selector
between minimum and maximum selector.

Signed-off-by: Gene Chen <gene_chen@richtek.com>
Reviewed-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
This commit is contained in:
Gene Chen 2021-07-19 11:39:12 +08:00 committed by Sebastian Reichel
parent e73f0f0ee7
commit e12ef7bf34
2 changed files with 33 additions and 0 deletions

View File

@ -41,6 +41,8 @@ int linear_range_get_selector_low(const struct linear_range *r,
int linear_range_get_selector_high(const struct linear_range *r, int linear_range_get_selector_high(const struct linear_range *r,
unsigned int val, unsigned int *selector, unsigned int val, unsigned int *selector,
bool *found); bool *found);
void linear_range_get_selector_within(const struct linear_range *r,
unsigned int val, unsigned int *selector);
int linear_range_get_selector_low_array(const struct linear_range *r, int linear_range_get_selector_low_array(const struct linear_range *r,
int ranges, unsigned int val, int ranges, unsigned int val,
unsigned int *selector, bool *found); unsigned int *selector, bool *found);

View File

@ -241,5 +241,36 @@ int linear_range_get_selector_high(const struct linear_range *r,
} }
EXPORT_SYMBOL_GPL(linear_range_get_selector_high); EXPORT_SYMBOL_GPL(linear_range_get_selector_high);
/**
* linear_range_get_selector_within - return linear range selector for value
* @r: pointer to linear range where selector is looked from
* @val: value for which the selector is searched
* @selector: address where found selector value is updated
*
* Return selector for which range value is closest match for given
* input value. Value is matching if it is equal or lower than given
* value. But return maximum selector if given value is higher than
* maximum value.
*/
void linear_range_get_selector_within(const struct linear_range *r,
unsigned int val, unsigned int *selector)
{
if (r->min > val) {
*selector = r->min_sel;
return;
}
if (linear_range_get_max_value(r) < val) {
*selector = r->max_sel;
return;
}
if (r->step == 0)
*selector = r->min_sel;
else
*selector = (val - r->min) / r->step + r->min_sel;
}
EXPORT_SYMBOL_GPL(linear_range_get_selector_within);
MODULE_DESCRIPTION("linear-ranges helper"); MODULE_DESCRIPTION("linear-ranges helper");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");