xref: /OK3568_Linux_fs/kernel/drivers/iio/adc/qcom-vadc-common.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Code shared between the different Qualcomm PMIC voltage ADCs
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef QCOM_VADC_COMMON_H
7*4882a593Smuzhiyun #define QCOM_VADC_COMMON_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #define VADC_CONV_TIME_MIN_US			2000
10*4882a593Smuzhiyun #define VADC_CONV_TIME_MAX_US			2100
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /* Min ADC code represents 0V */
13*4882a593Smuzhiyun #define VADC_MIN_ADC_CODE			0x6000
14*4882a593Smuzhiyun /* Max ADC code represents full-scale range of 1.8V */
15*4882a593Smuzhiyun #define VADC_MAX_ADC_CODE			0xa800
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define VADC_ABSOLUTE_RANGE_UV			625000
18*4882a593Smuzhiyun #define VADC_RATIOMETRIC_RANGE			1800
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define VADC_DEF_PRESCALING			0 /* 1:1 */
21*4882a593Smuzhiyun #define VADC_DEF_DECIMATION			0 /* 512 */
22*4882a593Smuzhiyun #define VADC_DEF_HW_SETTLE_TIME			0 /* 0 us */
23*4882a593Smuzhiyun #define VADC_DEF_AVG_SAMPLES			0 /* 1 sample */
24*4882a593Smuzhiyun #define VADC_DEF_CALIB_TYPE			VADC_CALIB_ABSOLUTE
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define VADC_DECIMATION_MIN			512
27*4882a593Smuzhiyun #define VADC_DECIMATION_MAX			4096
28*4882a593Smuzhiyun #define ADC5_DEF_VBAT_PRESCALING		1 /* 1:3 */
29*4882a593Smuzhiyun #define ADC5_DECIMATION_SHORT			250
30*4882a593Smuzhiyun #define ADC5_DECIMATION_MEDIUM			420
31*4882a593Smuzhiyun #define ADC5_DECIMATION_LONG			840
32*4882a593Smuzhiyun /* Default decimation - 1024 for rev2, 840 for pmic5 */
33*4882a593Smuzhiyun #define ADC5_DECIMATION_DEFAULT			2
34*4882a593Smuzhiyun #define ADC5_DECIMATION_SAMPLES_MAX		3
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define VADC_HW_SETTLE_DELAY_MAX		10000
37*4882a593Smuzhiyun #define VADC_HW_SETTLE_SAMPLES_MAX		16
38*4882a593Smuzhiyun #define VADC_AVG_SAMPLES_MAX			512
39*4882a593Smuzhiyun #define ADC5_AVG_SAMPLES_MAX			16
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #define PMIC5_CHG_TEMP_SCALE_FACTOR		377500
42*4882a593Smuzhiyun #define PMIC5_SMB_TEMP_CONSTANT			419400
43*4882a593Smuzhiyun #define PMIC5_SMB_TEMP_SCALE_FACTOR		356
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define PMI_CHG_SCALE_1				-138890
46*4882a593Smuzhiyun #define PMI_CHG_SCALE_2				391750000000LL
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define VADC5_MAX_CODE				0x7fff
49*4882a593Smuzhiyun #define ADC5_FULL_SCALE_CODE			0x70e4
50*4882a593Smuzhiyun #define ADC5_USR_DATA_CHECK			0x8000
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define R_PU_100K				100000
53*4882a593Smuzhiyun #define RATIO_MAX_ADC7				BIT(14)
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define DIE_TEMP_ADC7_SCALE_1			-60000
56*4882a593Smuzhiyun #define DIE_TEMP_ADC7_SCALE_2			20000
57*4882a593Smuzhiyun #define DIE_TEMP_ADC7_SCALE_FACTOR		1000
58*4882a593Smuzhiyun #define DIE_TEMP_ADC7_MAX			160000
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /**
61*4882a593Smuzhiyun  * struct vadc_map_pt - Map the graph representation for ADC channel
62*4882a593Smuzhiyun  * @x: Represent the ADC digitized code.
63*4882a593Smuzhiyun  * @y: Represent the physical data which can be temperature, voltage,
64*4882a593Smuzhiyun  *     resistance.
65*4882a593Smuzhiyun  */
66*4882a593Smuzhiyun struct vadc_map_pt {
67*4882a593Smuzhiyun 	s32 x;
68*4882a593Smuzhiyun 	s32 y;
69*4882a593Smuzhiyun };
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /*
72*4882a593Smuzhiyun  * VADC_CALIB_ABSOLUTE: uses the 625mV and 1.25V as reference channels.
73*4882a593Smuzhiyun  * VADC_CALIB_RATIOMETRIC: uses the reference voltage (1.8V) and GND for
74*4882a593Smuzhiyun  * calibration.
75*4882a593Smuzhiyun  */
76*4882a593Smuzhiyun enum vadc_calibration {
77*4882a593Smuzhiyun 	VADC_CALIB_ABSOLUTE = 0,
78*4882a593Smuzhiyun 	VADC_CALIB_RATIOMETRIC
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /**
82*4882a593Smuzhiyun  * struct vadc_linear_graph - Represent ADC characteristics.
83*4882a593Smuzhiyun  * @dy: numerator slope to calculate the gain.
84*4882a593Smuzhiyun  * @dx: denominator slope to calculate the gain.
85*4882a593Smuzhiyun  * @gnd: A/D word of the ground reference used for the channel.
86*4882a593Smuzhiyun  *
87*4882a593Smuzhiyun  * Each ADC device has different offset and gain parameters which are
88*4882a593Smuzhiyun  * computed to calibrate the device.
89*4882a593Smuzhiyun  */
90*4882a593Smuzhiyun struct vadc_linear_graph {
91*4882a593Smuzhiyun 	s32 dy;
92*4882a593Smuzhiyun 	s32 dx;
93*4882a593Smuzhiyun 	s32 gnd;
94*4882a593Smuzhiyun };
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /**
97*4882a593Smuzhiyun  * struct vadc_prescale_ratio - Represent scaling ratio for ADC input.
98*4882a593Smuzhiyun  * @num: the inverse numerator of the gain applied to the input channel.
99*4882a593Smuzhiyun  * @den: the inverse denominator of the gain applied to the input channel.
100*4882a593Smuzhiyun  */
101*4882a593Smuzhiyun struct vadc_prescale_ratio {
102*4882a593Smuzhiyun 	u32 num;
103*4882a593Smuzhiyun 	u32 den;
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /**
107*4882a593Smuzhiyun  * enum vadc_scale_fn_type - Scaling function to convert ADC code to
108*4882a593Smuzhiyun  *				physical scaled units for the channel.
109*4882a593Smuzhiyun  * SCALE_DEFAULT: Default scaling to convert raw adc code to voltage (uV).
110*4882a593Smuzhiyun  * SCALE_THERM_100K_PULLUP: Returns temperature in millidegC.
111*4882a593Smuzhiyun  *				 Uses a mapping table with 100K pullup.
112*4882a593Smuzhiyun  * SCALE_PMIC_THERM: Returns result in milli degree's Centigrade.
113*4882a593Smuzhiyun  * SCALE_XOTHERM: Returns XO thermistor voltage in millidegC.
114*4882a593Smuzhiyun  * SCALE_PMI_CHG_TEMP: Conversion for PMI CHG temp
115*4882a593Smuzhiyun  * SCALE_HW_CALIB_DEFAULT: Default scaling to convert raw adc code to
116*4882a593Smuzhiyun  *	voltage (uV) with hardware applied offset/slope values to adc code.
117*4882a593Smuzhiyun  * SCALE_HW_CALIB_THERM_100K_PULLUP: Returns temperature in millidegC using
118*4882a593Smuzhiyun  *	lookup table. The hardware applies offset/slope to adc code.
119*4882a593Smuzhiyun  * SCALE_HW_CALIB_XOTHERM: Returns XO thermistor voltage in millidegC using
120*4882a593Smuzhiyun  *	100k pullup. The hardware applies offset/slope to adc code.
121*4882a593Smuzhiyun  * SCALE_HW_CALIB_THERM_100K_PU_PM7: Returns temperature in millidegC using
122*4882a593Smuzhiyun  *	lookup table for PMIC7. The hardware applies offset/slope to adc code.
123*4882a593Smuzhiyun  * SCALE_HW_CALIB_PMIC_THERM: Returns result in milli degree's Centigrade.
124*4882a593Smuzhiyun  *	The hardware applies offset/slope to adc code.
125*4882a593Smuzhiyun  * SCALE_HW_CALIB_PMIC_THERM: Returns result in milli degree's Centigrade.
126*4882a593Smuzhiyun  *	The hardware applies offset/slope to adc code. This is for PMIC7.
127*4882a593Smuzhiyun  * SCALE_HW_CALIB_PM5_CHG_TEMP: Returns result in millidegrees for PMIC5
128*4882a593Smuzhiyun  *	charger temperature.
129*4882a593Smuzhiyun  * SCALE_HW_CALIB_PM5_SMB_TEMP: Returns result in millidegrees for PMIC5
130*4882a593Smuzhiyun  *	SMB1390 temperature.
131*4882a593Smuzhiyun  */
132*4882a593Smuzhiyun enum vadc_scale_fn_type {
133*4882a593Smuzhiyun 	SCALE_DEFAULT = 0,
134*4882a593Smuzhiyun 	SCALE_THERM_100K_PULLUP,
135*4882a593Smuzhiyun 	SCALE_PMIC_THERM,
136*4882a593Smuzhiyun 	SCALE_XOTHERM,
137*4882a593Smuzhiyun 	SCALE_PMI_CHG_TEMP,
138*4882a593Smuzhiyun 	SCALE_HW_CALIB_DEFAULT,
139*4882a593Smuzhiyun 	SCALE_HW_CALIB_THERM_100K_PULLUP,
140*4882a593Smuzhiyun 	SCALE_HW_CALIB_XOTHERM,
141*4882a593Smuzhiyun 	SCALE_HW_CALIB_THERM_100K_PU_PM7,
142*4882a593Smuzhiyun 	SCALE_HW_CALIB_PMIC_THERM,
143*4882a593Smuzhiyun 	SCALE_HW_CALIB_PMIC_THERM_PM7,
144*4882a593Smuzhiyun 	SCALE_HW_CALIB_PM5_CHG_TEMP,
145*4882a593Smuzhiyun 	SCALE_HW_CALIB_PM5_SMB_TEMP,
146*4882a593Smuzhiyun 	SCALE_HW_CALIB_INVALID,
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun struct adc5_data {
150*4882a593Smuzhiyun 	const u32	full_scale_code_volt;
151*4882a593Smuzhiyun 	const u32	full_scale_code_cur;
152*4882a593Smuzhiyun 	const struct adc5_channels *adc_chans;
153*4882a593Smuzhiyun 	const struct iio_info *info;
154*4882a593Smuzhiyun 	unsigned int	*decimation;
155*4882a593Smuzhiyun 	unsigned int	*hw_settle_1;
156*4882a593Smuzhiyun 	unsigned int	*hw_settle_2;
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun int qcom_vadc_scale(enum vadc_scale_fn_type scaletype,
160*4882a593Smuzhiyun 		    const struct vadc_linear_graph *calib_graph,
161*4882a593Smuzhiyun 		    const struct vadc_prescale_ratio *prescale,
162*4882a593Smuzhiyun 		    bool absolute,
163*4882a593Smuzhiyun 		    u16 adc_code, int *result_mdec);
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun struct qcom_adc5_scale_type {
166*4882a593Smuzhiyun 	int (*scale_fn)(const struct vadc_prescale_ratio *prescale,
167*4882a593Smuzhiyun 		const struct adc5_data *data, u16 adc_code, int *result);
168*4882a593Smuzhiyun };
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun int qcom_adc5_hw_scale(enum vadc_scale_fn_type scaletype,
171*4882a593Smuzhiyun 		    const struct vadc_prescale_ratio *prescale,
172*4882a593Smuzhiyun 		    const struct adc5_data *data,
173*4882a593Smuzhiyun 		    u16 adc_code, int *result_mdec);
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun int qcom_vadc_decimation_from_dt(u32 value);
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun #endif /* QCOM_VADC_COMMON_H */
178