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