lib/linear_ranges: Add linear_range_get_selector_high_array

Add a helper function to find the selector for a given value in a linear
range array. The selector should be such that the value it represents
should be higher or equal to the given value.

Signed-off-by: Amit Sunil Dhamne <amitsd@google.com>
Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com>
Acked-by: Mark Brown <broonie@kernel.org>
Link: https://patch.msgid.link/20260325-max77759-charger-v9-4-4486dd297adc@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Amit Sunil Dhamne
2026-03-25 22:22:25 +00:00
committed by Greg Kroah-Hartman
parent b422f7c072
commit f23388d0f6
2 changed files with 39 additions and 0 deletions

View File

@@ -57,5 +57,8 @@ void linear_range_get_selector_within(const struct linear_range *r,
int linear_range_get_selector_low_array(const struct linear_range *r,
int ranges, unsigned int val,
unsigned int *selector, bool *found);
int linear_range_get_selector_high_array(const struct linear_range *r,
int ranges, unsigned int val,
unsigned int *selector, bool *found);
#endif

View File

@@ -241,6 +241,42 @@ int linear_range_get_selector_high(const struct linear_range *r,
}
EXPORT_SYMBOL_GPL(linear_range_get_selector_high);
/**
* linear_range_get_selector_high_array - return linear range selector for value
* @r: pointer to array of linear ranges where selector is looked from
* @ranges: amount of ranges to scan from array
* @val: value for which the selector is searched
* @selector: address where found selector value is updated
* @found: flag to indicate that given value was in the range
*
* Scan array of ranges for selector for which range value matches given
* input value. Value is matching if it is equal or higher than given value
* If given value is found to be in a range scanning is stopped and @found is
* set true. If a range with values greater than given value is found
* but the range min is being greater than given value, then the range's
* lowest selector is updated to @selector and scanning is stopped.
*
* Return: 0 on success, -EINVAL if range array is invalid or does not contain
* range with a value greater or equal to given value
*/
int linear_range_get_selector_high_array(const struct linear_range *r,
int ranges, unsigned int val,
unsigned int *selector, bool *found)
{
int i;
int ret;
for (i = 0; i < ranges; i++) {
ret = linear_range_get_selector_high(&r[i], val, selector,
found);
if (!ret)
return 0;
}
return -EINVAL;
}
EXPORT_SYMBOL_GPL(linear_range_get_selector_high_array);
/**
* linear_range_get_selector_within - return linear range selector for value
* @r: pointer to linear range where selector is looked from