Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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