forked from Minki/linux
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:
parent
e73f0f0ee7
commit
e12ef7bf34
@ -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);
|
||||||
|
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user