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