xref: /linux-6.15/include/linux/linear_range.h (revision e12ef7bf)
1d2218d4eSMatti Vaittinen /* SPDX-License-Identifier: GPL-2.0 */
2d2218d4eSMatti Vaittinen /* Copyright (C) 2020 ROHM Semiconductors */
3d2218d4eSMatti Vaittinen 
4d2218d4eSMatti Vaittinen #ifndef LINEAR_RANGE_H
5d2218d4eSMatti Vaittinen #define LINEAR_RANGE_H
6d2218d4eSMatti Vaittinen 
7d2218d4eSMatti Vaittinen #include <linux/types.h>
8d2218d4eSMatti Vaittinen 
9d2218d4eSMatti Vaittinen /**
10d2218d4eSMatti Vaittinen  * struct linear_range - table of selector - value pairs
11d2218d4eSMatti Vaittinen  *
12d2218d4eSMatti Vaittinen  * Define a lookup-table for range of values. Intended to help when looking
13d2218d4eSMatti Vaittinen  * for a register value matching certaing physical measure (like voltage).
14d2218d4eSMatti Vaittinen  * Usable when increment of one in register always results a constant increment
15d2218d4eSMatti Vaittinen  * of the physical measure (like voltage).
16d2218d4eSMatti Vaittinen  *
17d2218d4eSMatti Vaittinen  * @min:  Lowest value in range
18d2218d4eSMatti Vaittinen  * @min_sel: Lowest selector for range
19d2218d4eSMatti Vaittinen  * @max_sel: Highest selector for range
20d2218d4eSMatti Vaittinen  * @step: Value step size
21d2218d4eSMatti Vaittinen  */
22d2218d4eSMatti Vaittinen struct linear_range {
23d2218d4eSMatti Vaittinen 	unsigned int min;
24d2218d4eSMatti Vaittinen 	unsigned int min_sel;
25d2218d4eSMatti Vaittinen 	unsigned int max_sel;
26d2218d4eSMatti Vaittinen 	unsigned int step;
27d2218d4eSMatti Vaittinen };
28d2218d4eSMatti Vaittinen 
29d2218d4eSMatti Vaittinen unsigned int linear_range_values_in_range(const struct linear_range *r);
30d2218d4eSMatti Vaittinen unsigned int linear_range_values_in_range_array(const struct linear_range *r,
31d2218d4eSMatti Vaittinen 						int ranges);
32d2218d4eSMatti Vaittinen unsigned int linear_range_get_max_value(const struct linear_range *r);
33d2218d4eSMatti Vaittinen 
34d2218d4eSMatti Vaittinen int linear_range_get_value(const struct linear_range *r, unsigned int selector,
35d2218d4eSMatti Vaittinen 			   unsigned int *val);
36d2218d4eSMatti Vaittinen int linear_range_get_value_array(const struct linear_range *r, int ranges,
37d2218d4eSMatti Vaittinen 				 unsigned int selector, unsigned int *val);
38d2218d4eSMatti Vaittinen int linear_range_get_selector_low(const struct linear_range *r,
39d2218d4eSMatti Vaittinen 				  unsigned int val, unsigned int *selector,
40d2218d4eSMatti Vaittinen 				  bool *found);
41d2218d4eSMatti Vaittinen int linear_range_get_selector_high(const struct linear_range *r,
42d2218d4eSMatti Vaittinen 				   unsigned int val, unsigned int *selector,
43d2218d4eSMatti Vaittinen 				   bool *found);
44*e12ef7bfSGene Chen void linear_range_get_selector_within(const struct linear_range *r,
45*e12ef7bfSGene Chen 				      unsigned int val, unsigned int *selector);
46d2218d4eSMatti Vaittinen int linear_range_get_selector_low_array(const struct linear_range *r,
47d2218d4eSMatti Vaittinen 					int ranges, unsigned int val,
48d2218d4eSMatti Vaittinen 					unsigned int *selector, bool *found);
49d2218d4eSMatti Vaittinen 
50d2218d4eSMatti Vaittinen #endif
51