Commit e12ef7bf authored by Gene Chen's avatar Gene Chen Committed by Sebastian Reichel
Browse files

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: default avatarGene Chen <gene_chen@richtek.com>
Reviewed-by: default avatarMatti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent e73f0f0e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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,
				   unsigned int val, unsigned int *selector,
				   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 ranges, unsigned int val,
					unsigned int *selector, bool *found);
+31 −0
Original line number Diff line number Diff line
@@ -241,5 +241,36 @@ int linear_range_get_selector_high(const struct linear_range *r,
}
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_LICENSE("GPL");