Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6e00e46 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "defconfig: monaco: Enable ADC5 Gen3 for monaco"

parents 25953335 bd39223b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -159,7 +159,7 @@ CONFIG_QCOM_SPMI_TEMP_ALARM=y
CONFIG_IIO=y
CONFIG_PINCTRL_QCOM_SPMI_PMIC=y
CONFIG_INPUT_QPNP_POWER_ON=y
CONFIG_QCOM_SPMI_ADC5=y
CONFIG_QCOM_SPMI_ADC5_GEN3=y
CONFIG_NVMEM_SPMI_SDAM=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_PM8XXX=y
+6 −2
Original line number Diff line number Diff line
@@ -1322,12 +1322,16 @@ static const struct adc5_channels adc5_chans_pmic[ADC5_MAX_CHANNEL] = {
					SCALE_HW_CALIB_DEFAULT)
	[ADC5_GEN3_VPH_PWR]		= ADC5_CHAN_VOLT("vph_pwr", 1,
					SCALE_HW_CALIB_DEFAULT)
	[ADC5_GEN3_VBAT_SNS_QBG]		= ADC5_CHAN_VOLT("vbat_sns", 3,
	[ADC5_GEN3_VBAT_SNS_QBG]		= ADC5_CHAN_VOLT("vbat_sns", 1,
					SCALE_HW_CALIB_DEFAULT)
	[ADC5_GEN3_AMUX3_THM]	= ADC5_CHAN_TEMP("smb_temp", 0,
					SCALE_HW_CALIB_PM7_SMB_TEMP)
	[ADC5_GEN3_CHG_TEMP]		= ADC5_CHAN_TEMP("chg_temp", 0,
					SCALE_HW_CALIB_PM7_CHG_TEMP)
	[ADC5_GEN3_USB_SNS_V_16]	= ADC5_CHAN_TEMP("usb_sns_v_div_16", 3,
					SCALE_HW_CALIB_DEFAULT)
	[ADC5_GEN3_VIN_DIV16_MUX]	= ADC5_CHAN_TEMP("vin_div_16", 3,
					SCALE_HW_CALIB_DEFAULT)
	[ADC5_GEN3_IIN_FB]		= ADC5_CHAN_CUR("iin_fb", 4,
					SCALE_HW_CALIB_CUR)
	[ADC5_GEN3_ICHG_SMB]		= ADC5_CHAN_CUR("ichg_smb", 5,
@@ -1510,7 +1514,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc,
static const struct adc5_data adc5_gen3_data_pmic = {
	.name = "pm-adc5-gen3",
	.full_scale_code_volt = 0x70e4,
	.full_scale_code_cur = 0x2710,
	.full_scale_code_cur = 0x2ee0,
	.adc_chans = adc5_chans_pmic,
	.decimation = (unsigned int [ADC5_DECIMATION_SAMPLES_MAX])
				{85, 340, 1360},
+160 −0
Original line number Diff line number Diff line
@@ -508,6 +508,82 @@ static const struct vadc_map_pt adcmap7_100k[] = {
	{ 2420, 130048 }
};

/*
 * Resistance to temperature table for batt_therm.
 */
static const struct vadc_map_pt adcmap_gen3_batt_therm_100k[] = {
	{ 5319890, -400 },
	{ 4555860, -380 },
	{ 3911780, -360 },
	{ 3367320, -340 },
	{ 2905860, -320 },
	{ 2513730, -300 },
	{ 2179660, -280 },
	{ 1894360, -260 },
	{ 1650110, -240 },
	{ 1440520, -220 },
	{ 1260250, -200 },
	{ 1104850, -180 },
	{ 970600,  -160 },
	{ 854370,  -140 },
	{ 753530,  -120 },
	{ 665860,  -100 },
	{ 589490,  -80 },
	{ 522830,  -60 },
	{ 464540,  -40 },
	{ 413470,  -20 },
	{ 368640,  0 },
	{ 329220,  20 },
	{ 294490,  40 },
	{ 263850,  60 },
	{ 236770,  80 },
	{ 212790,  100 },
	{ 191530,  120 },
	{ 172640,  140 },
	{ 155840,  160 },
	{ 140880,  180 },
	{ 127520,  200 },
	{ 115590,  220 },
	{ 104910,  240 },
	{ 95350,   260 },
	{ 86760,   280 },
	{ 79050,   300 },
	{ 72110,   320 },
	{ 65860,   340 },
	{ 60220,   360 },
	{ 55130,   380 },
	{ 50520,   400 },
	{ 46350,   420 },
	{ 42570,   440 },
	{ 39140,   460 },
	{ 36030,   480 },
	{ 33190,   500 },
	{ 30620,   520 },
	{ 28260,   540 },
	{ 26120,   560 },
	{ 24160,   580 },
	{ 22370,   600 },
	{ 20730,   620 },
	{ 19230,   640 },
	{ 17850,   660 },
	{ 16580,   680 },
	{ 15420,   700 },
	{ 14350,   720 },
	{ 13370,   740 },
	{ 12470,   760 },
	{ 11630,   780 },
	{ 10860,   800 },
	{ 10150,   820 },
	{ 9490,    840 },
	{ 8880,    860 },
	{ 8320,    880 },
	{ 7800,    900 },
	{ 7310,    920 },
	{ 6860,    940 },
	{ 6450,    960 },
	{ 6060,    980 }
};

static int qcom_vadc_scale_hw_calib_volt(
				const struct vadc_prescale_ratio *prescale,
				const struct adc5_data *data,
@@ -563,6 +639,18 @@ static int qcom_vadc_scale_hw_pm2250_s3_die_temp(
				const struct vadc_prescale_ratio *prescale,
				const struct adc5_data *data,
				u16 adc_code, int *result_mdec);
static int qcom_adc5_gen3_scale_hw_calib_batt_therm_100(
				const struct vadc_prescale_ratio *prescale,
				const struct adc5_data *data,
				u16 adc_code, int *result_mdec);
static int qcom_adc5_gen3_scale_hw_calib_batt_id_100(
				const struct vadc_prescale_ratio *prescale,
				const struct adc5_data *data,
				u16 adc_code, int *result_mdec);
static int qcom_adc5_gen3_scale_hw_calib_usb_in_current(
				const struct vadc_prescale_ratio *prescale,
				const struct adc5_data *data,
				u16 adc_code, int *result_mdec);
static int qcom_vadc_scale_hw_chg5_temp(
				const struct vadc_prescale_ratio *prescale,
				const struct adc5_data *data,
@@ -602,6 +690,9 @@ static struct qcom_adc5_scale_type scale_adc5_fn[] = {
	[SCALE_HW_CALIB_PM5_SMB_TEMP] = {qcom_vadc_scale_hw_smb_temp},
	[SCALE_HW_CALIB_PM5_SMB1398_TEMP] = {qcom_vadc_scale_hw_smb1398_temp},
	[SCALE_HW_CALIB_PM2250_S3_DIE_TEMP] = {qcom_vadc_scale_hw_pm2250_s3_die_temp},
	[SCALE_HW_CALIB_PM5_GEN3_BATT_THERM_100K] = {qcom_adc5_gen3_scale_hw_calib_batt_therm_100},
	[SCALE_HW_CALIB_PM5_GEN3_BATT_ID_100K] = {qcom_adc5_gen3_scale_hw_calib_batt_id_100},
	[SCALE_HW_CALIB_PM5_GEN3_USB_IN_I] = {qcom_adc5_gen3_scale_hw_calib_usb_in_current},
	[SCALE_HW_CALIB_PM7_SMB_TEMP] = {qcom_vadc_scale_hw_pm7_smb_temp},
	[SCALE_HW_CALIB_PM7_CHG_TEMP] = {qcom_vadc_scale_hw_pm7_chg_temp},
};
@@ -1147,6 +1238,75 @@ static int qcom_vadc_scale_hw_pm2250_s3_die_temp(
	return 0;
}

static int qcom_adc5_gen3_scale_hw_calib_batt_therm_100(
				const struct vadc_prescale_ratio *prescale,
				const struct adc5_data *data,
				u16 adc_code, int *result_mdec)
{
	s64 resistance = 0;
	int ret, result = 0;

	if (adc_code >= RATIO_MAX_ADC7)
		return -EINVAL;

	/* (ADC code * R_PULLUP (100Kohm)) / (full_scale_code - ADC code)*/
	resistance = (s64) adc_code * R_PU_100K;
	resistance = div64_s64(resistance, (RATIO_MAX_ADC7 - adc_code));

	ret = qcom_vadc_map_voltage_temp(adcmap_gen3_batt_therm_100k,
				 ARRAY_SIZE(adcmap_gen3_batt_therm_100k),
				 resistance, &result);
	if (ret)
		return ret;

	*result_mdec = result;

	return 0;
}

static int qcom_adc5_gen3_scale_hw_calib_batt_id_100(
				const struct vadc_prescale_ratio *prescale,
				const struct adc5_data *data,
				u16 adc_code, int *result_mdec)
{
	s64 resistance = 0;

	if (adc_code >= RATIO_MAX_ADC7)
		return -EINVAL;

	/* (ADC code * R_PULLUP (100Kohm)) / (full_scale_code - ADC code)*/
	resistance = (s64) adc_code * R_PU_100K;
	resistance = div64_s64(resistance, (RATIO_MAX_ADC7 - adc_code));

	*result_mdec = (int)resistance;

	return 0;
};

static int qcom_adc5_gen3_scale_hw_calib_usb_in_current(
				const struct vadc_prescale_ratio *prescale,
				const struct adc5_data *data,
				u16 adc_code, int *result_ua)
{
	s64 voltage = 0, result = 0;
	bool positive = true;

	if (adc_code & ADC5_USR_DATA_CHECK) {
		adc_code = ~adc_code + 1;
		positive = false;
	}

	voltage = (s64)(s16) adc_code * 1000000;
	voltage = div64_s64(voltage, PMIC5_GEN3_USB_IN_I_SCALE_FACTOR);
	result = div64_s64(voltage * prescale->den, prescale->num);
	*result_ua = (int)result;

	if (!positive)
		*result_ua = -(int)result;

	return 0;
};

static int qcom_vadc_scale_hw_chg5_temp(
				const struct vadc_prescale_ratio *prescale,
				const struct adc5_data *data,
+14 −3
Original line number Diff line number Diff line
@@ -65,6 +65,8 @@
#define DIE_TEMP_ADC7_SCALE_FACTOR			1000
#define DIE_TEMP_ADC7_MAX				160000

#define PMIC5_GEN3_USB_IN_I_SCALE_FACTOR		9248

#define ADC_VDD_REF			1875000

/**
@@ -184,13 +186,13 @@ struct adc_tm_client_info {
 *	charger temperature.
 * SCALE_HW_CALIB_PM5_SMB_TEMP: Returns result in millidegrees for PMIC5
 *	SMB1390 temperature.
 * SCALE_HW_CALIB_BATT_THERM_100K: Returns battery thermistor voltage in
 * SCALE_HW_CALIB_BATT_THERM_100K: Returns battery thermistor temperature in
 *	decidegC using 100k pullup. The hardware applies offset/slope to adc
 *	code.
 * SCALE_HW_CALIB_BATT_THERM_30K: Returns battery thermistor voltage in
 * SCALE_HW_CALIB_BATT_THERM_30K: Returns battery thermistor temperature in
 *	decidegC using 30k pullup. The hardware applies offset/slope to adc
 *	code.
 * SCALE_HW_CALIB_BATT_THERM_400K: Returns battery thermistor voltage in
 * SCALE_HW_CALIB_BATT_THERM_400K: Returns battery thermistor temperature in
 *	decidegC using 400k pullup. The hardware applies offset/slope to adc
 *	code.
 * SCALE_HW_CALIB_PM5_SMB1398_TEMP: Returns result in millidegrees for PMIC5
@@ -207,6 +209,12 @@ struct adc_tm_client_info {
 *	that uses raw ADC code.
 * SCALE_HW_CALIB_PM2250_S3_DIE_TEMP: Returns result in millidegrees for
 *	S3 die temperature channel on PM2250.
 * SCALE_HW_CALIB_PM5_GEN3_BATT_THERM_100K: Returns battery thermistor
 * temperature in decidegC using 100k pullup. The hardware applies
 * offset/slope to adc code.
 * SCALE_HW_CALIB_PM5_GEN3_BATT_ID_100K: Returns battery ID resistance
 * in ohms using 100k pullup. The hardware applies offset/slope to adc code.
 * SCALE_HW_CALIB_PM5_GEN3_USB_IN_I: Returns USB input current in microamperes.
 */
enum vadc_scale_fn_type {
	SCALE_DEFAULT = 0,
@@ -232,6 +240,9 @@ enum vadc_scale_fn_type {
	SCALE_HW_CALIB_CUR_RAW,
	SCALE_HW_CALIB_PM2250_S3_DIE_TEMP,
	SCALE_HW_CALIB_PM5_CUR,
	SCALE_HW_CALIB_PM5_GEN3_BATT_THERM_100K,
	SCALE_HW_CALIB_PM5_GEN3_BATT_ID_100K,
	SCALE_HW_CALIB_PM5_GEN3_USB_IN_I,
	SCALE_HW_CALIB_INVALID,
};

+10 −14
Original line number Diff line number Diff line
@@ -17,8 +17,8 @@
#define PM5100_ADC5_GEN3_DIE_TEMP			(PM5100_SID << 8 | 0x03)

#define PM5100_ADC5_GEN3_AMUX1_THM			(PM5100_SID << 8 | 0x04)
#define PM5100_ADC5_GEN3_AMUX2_THM			(PM5100_SID << 8 | 0x05)
#define PM5100_ADC5_GEN3_AMUX3_THM			(PM5100_SID << 8 | 0x06)
#define PM5100_ADC5_GEN3_BAT_ID				(PM5100_SID << 8 | 0x05)
#define PM5100_ADC5_GEN3_BATT_THM			(PM5100_SID << 8 | 0x06)
#define PM5100_ADC5_GEN3_AMUX4_THM			(PM5100_SID << 8 | 0x07)
#define PM5100_ADC5_GEN3_AMUX5_THM			(PM5100_SID << 8 | 0x08)
#define PM5100_ADC5_GEN3_AMUX6_THM			(PM5100_SID << 8 | 0x09)
@@ -30,13 +30,13 @@
#define PM5100_ADC5_GEN3_CHG_TEMP			(PM5100_SID << 8 | 0x10)
#define PM5100_ADC5_GEN3_USB_SNS_V_16			(PM5100_SID << 8 | 0x11)
#define PM5100_ADC5_GEN3_VIN_DIV16_MUX			(PM5100_SID << 8 | 0x12)
#define PM5100_ADC5_GEN3_IIN_FB			(PM5100_SID << 8 | 0x17)
#define PM5100_ADC5_GEN3_USB_IN_I			(PM5100_SID << 8 | 0x17)
#define PM5100_ADC5_GEN3_ICHG_FB			(PM5100_SID << 8 | 0xa1)

/* 30k pull-up1 */
#define PM5100_ADC5_GEN3_AMUX1_THM_30K_PU		(PM5100_SID << 8 | 0x24)
#define PM5100_ADC5_GEN3_AMUX2_THM_30K_PU		(PM5100_SID << 8 | 0x25)
#define PM5100_ADC5_GEN3_AMUX3_THM_30K_PU		(PM5100_SID << 8 | 0x26)
#define PM5100_ADC5_GEN3_BAT_ID_30K_PU			(PM5100_SID << 8 | 0x25)
#define PM5100_ADC5_GEN3_BATT_THM_30K_PU		(PM5100_SID << 8 | 0x26)
#define PM5100_ADC5_GEN3_AMUX4_THM_30K_PU		(PM5100_SID << 8 | 0x27)
#define PM5100_ADC5_GEN3_AMUX5_THM_30K_PU		(PM5100_SID << 8 | 0x28)
#define PM5100_ADC5_GEN3_AMUX6_THM_30K_PU		(PM5100_SID << 8 | 0x29)
@@ -45,14 +45,10 @@
#define PM5100_ADC5_GEN3_AMUX3_GPIO_30K_PU		(PM5100_SID << 8 | 0x2c)
#define PM5100_ADC5_GEN3_AMUX4_GPIO_30K_PU		(PM5100_SID << 8 | 0x2d)


#define ADC5_GEN3_AMUX2_GPIO_100K_PU			0x4b


/* 100k pull-up2 */
#define PM5100_ADC5_GEN3_AMUX1_THM_100K_PU		(PM5100_SID << 8 | 0x44)
#define PM5100_ADC5_GEN3_AMUX2_THM_100K_PU		(PM5100_SID << 8 | 0x45)
#define PM5100_ADC5_GEN3_AMUX3_THM_100K_PU		(PM5100_SID << 8 | 0x46)
#define PM5100_ADC5_GEN3_BAT_ID_100K_PU			(PM5100_SID << 8 | 0x45)
#define PM5100_ADC5_GEN3_BATT_THM_100K_PU		(PM5100_SID << 8 | 0x46)
#define PM5100_ADC5_GEN3_AMUX4_THM_100K_PU		(PM5100_SID << 8 | 0x47)
#define PM5100_ADC5_GEN3_AMUX5_THM_100K_PU		(PM5100_SID << 8 | 0x48)
#define PM5100_ADC5_GEN3_AMUX6_THM_100K_PU		(PM5100_SID << 8 | 0x49)
@@ -63,8 +59,8 @@

/* 400k pull-up3 */
#define PM5100_ADC5_GEN3_AMUX1_THM_400K_PU		(PM5100_SID << 8 | 0x64)
#define PM5100_ADC5_GEN3_AMUX2_THM_400K_PU		(PM5100_SID << 8 | 0x65)
#define PM5100_ADC5_GEN3_AMUX3_THM_400K_PU		(PM5100_SID << 8 | 0x66)
#define PM5100_ADC5_GEN3_BAT_ID_400K_PU			(PM5100_SID << 8 | 0x65)
#define PM5100_ADC5_GEN3_BATT_THM_400K_PU		(PM5100_SID << 8 | 0x66)
#define PM5100_ADC5_GEN3_AMUX4_THM_400K_PU		(PM5100_SID << 8 | 0x67)
#define PM5100_ADC5_GEN3_AMUX5_THM_400K_PU		(PM5100_SID << 8 | 0x68)
#define PM5100_ADC5_GEN3_AMUX6_THM_400K_PU		(PM5100_SID << 8 | 0x69)
Loading