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

Commit 76e8f7ff authored by Jishnu Prakash's avatar Jishnu Prakash
Browse files

iio: qcom-spmi-adc5-gen3 : Update conversion and IRQ handling logic



Fix timer value for immediate conversion to the right constant
to avoid TM conversions for immediate conversion requests.
Correct TM channel offsets checked from status and data registers
in TM interrupt handler.

Change-Id: I43a9a5cf33d31029fe306e61c4bf2e80966b9b7e
Signed-off-by: default avatarJishnu Prakash <jprakash@codeaurora.org>
parent 70adcc28
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ static LIST_HEAD(adc_tm_device_list);
#define ADC5_GEN3_CHAN_CONV_REQ			BIT(7)

#define ADC5_GEN3_TIMER_SEL			0x51
#define ADC5_GEN3_TIME_IMMEDIATE		0x1

#define ADC5_GEN3_DIG_PARAM			0x52
#define ADC5_GEN3_DIG_PARAM_CAL_SEL_MASK	GENMASK(5, 4)
@@ -379,7 +380,7 @@ static int adc5_gen3_configure(struct adc5_chip *adc,
	 */
	buf[1] = ADC5_GEN3_CHAN_CONV_REQ | 0;

	buf[2] = prop->timer;
	buf[2] = ADC5_GEN3_TIME_IMMEDIATE;

	/* Digital param selection */
	adc5_gen3_update_dig_param(adc, prop, &buf[3]);
@@ -575,7 +576,7 @@ static void tm_handler_work(struct work_struct *work)
	struct adc5_chip *adc = container_of(work, struct adc5_chip,
						tm_handler_work);
	struct adc5_channel_prop *chan_prop;
	u8 tm_status[2], buf[14], val;
	u8 tm_status[2], buf[16], val;
	int ret, i;

	mutex_lock(&adc->lock);
@@ -603,7 +604,7 @@ static void tm_handler_work(struct work_struct *work)
		goto work_unlock;
	}

	ret = adc5_read(adc, ADC5_GEN3_CH1_DATA0, buf, sizeof(buf));
	ret = adc5_read(adc, ADC5_GEN3_CH0_DATA0, buf, sizeof(buf));
	if (ret < 0) {
		pr_err("adc read data failed with %d\n", ret);
		goto work_unlock;
@@ -615,28 +616,27 @@ static void tm_handler_work(struct work_struct *work)
		bool upper_set = false, lower_set = false;
		u8 data_low = 0, data_high = 0;
		u16 code = 0;
		int temp;
		int temp, offset;

		chan_prop = &adc->chan_props[i];
		offset = chan_prop->tm_chan_index;
		if (!chan_prop->adc_tm)
			continue;

		mutex_lock(&adc->lock);
		if ((tm_status[0] & 0x1) && (chan_prop->high_thr_en))
		if ((tm_status[0] & BIT(offset)) && (chan_prop->high_thr_en))
			upper_set = true;

		if ((tm_status[1] & 0x1) && (chan_prop->low_thr_en))
		if ((tm_status[1] & BIT(offset)) && (chan_prop->low_thr_en))
			lower_set = true;

		tm_status[0] >>= 1;
		tm_status[1] >>= 1;
		mutex_unlock(&adc->lock);

		if (!(upper_set || lower_set))
			continue;

		data_low = buf[2 * i];
		data_high = buf[2 * i + 1];
		data_low = buf[2 * offset];
		data_high = buf[2 * offset + 1];
		code = ((data_high << 8) | data_low);
		pr_debug("ADC_TM threshold code:0x%x\n", code);