xref: /linux/include/linux/linear_range.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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 
29*c2f2e2c3SChiaEn Wu #define LINEAR_RANGE(_min, _min_sel, _max_sel, _step)		\
30*c2f2e2c3SChiaEn Wu 	{							\
31*c2f2e2c3SChiaEn Wu 		.min = _min,					\
32*c2f2e2c3SChiaEn Wu 		.min_sel = _min_sel,				\
33*c2f2e2c3SChiaEn Wu 		.max_sel = _max_sel,				\
34*c2f2e2c3SChiaEn Wu 		.step = _step,					\
35*c2f2e2c3SChiaEn Wu 	}
36*c2f2e2c3SChiaEn Wu 
37*c2f2e2c3SChiaEn Wu #define LINEAR_RANGE_IDX(_idx, _min, _min_sel, _max_sel, _step)	\
38*c2f2e2c3SChiaEn Wu 	[_idx] = LINEAR_RANGE(_min, _min_sel, _max_sel, _step)
39*c2f2e2c3SChiaEn Wu 
40d2218d4eSMatti Vaittinen unsigned int linear_range_values_in_range(const struct linear_range *r);
41d2218d4eSMatti Vaittinen unsigned int linear_range_values_in_range_array(const struct linear_range *r,
42d2218d4eSMatti Vaittinen 						int ranges);
43d2218d4eSMatti Vaittinen unsigned int linear_range_get_max_value(const struct linear_range *r);
44d2218d4eSMatti Vaittinen 
45d2218d4eSMatti Vaittinen int linear_range_get_value(const struct linear_range *r, unsigned int selector,
46d2218d4eSMatti Vaittinen 			   unsigned int *val);
47d2218d4eSMatti Vaittinen int linear_range_get_value_array(const struct linear_range *r, int ranges,
48d2218d4eSMatti Vaittinen 				 unsigned int selector, unsigned int *val);
49d2218d4eSMatti Vaittinen int linear_range_get_selector_low(const struct linear_range *r,
50d2218d4eSMatti Vaittinen 				  unsigned int val, unsigned int *selector,
51d2218d4eSMatti Vaittinen 				  bool *found);
52d2218d4eSMatti Vaittinen int linear_range_get_selector_high(const struct linear_range *r,
53d2218d4eSMatti Vaittinen 				   unsigned int val, unsigned int *selector,
54d2218d4eSMatti Vaittinen 				   bool *found);
55e12ef7bfSGene Chen void linear_range_get_selector_within(const struct linear_range *r,
56e12ef7bfSGene Chen 				      unsigned int val, unsigned int *selector);
57d2218d4eSMatti Vaittinen int linear_range_get_selector_low_array(const struct linear_range *r,
58d2218d4eSMatti Vaittinen 					int ranges, unsigned int val,
59d2218d4eSMatti Vaittinen 					unsigned int *selector, bool *found);
60d2218d4eSMatti Vaittinen 
61d2218d4eSMatti Vaittinen #endif
62