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

Commit 713276ea authored by Naidu Tellapati's avatar Naidu Tellapati Committed by Jonathan Cameron
Browse files

iio: adc: cc10001: Fix incorrect use of power-up/power-down register



At present we are incorrectly setting the register to 0x1 to power up
the ADC. Since it is an active high power down register, we need to set
the register to 0x0 to actually power up. Conversely, writing 0x1 to the
register powers it down.

This commit adds a couple of helpers to make the code clearer and then
use them to do the power-up/power-down properly.

Fixes: 1664f6a5 ("iio: adc: Cosmic Circuits 10001 ADC driver")
Signed-off-by: default avatarNaidu Tellapati <naidu.tellapati@imgtec.com>
Signed-off-by: default avatarEzequiel Garcia <ezequiel.garcia@imgtec.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 13415a99
Loading
Loading
Loading
Loading
+19 −14
Original line number Original line Diff line number Diff line
@@ -35,8 +35,9 @@
#define CC10001_ADC_EOC_SET		BIT(0)
#define CC10001_ADC_EOC_SET		BIT(0)


#define CC10001_ADC_CHSEL_SAMPLED	0x0c
#define CC10001_ADC_CHSEL_SAMPLED	0x0c
#define CC10001_ADC_POWER_UP		0x10
#define CC10001_ADC_POWER_DOWN		0x10
#define CC10001_ADC_POWER_UP_SET	BIT(0)
#define CC10001_ADC_POWER_DOWN_SET	BIT(0)

#define CC10001_ADC_DEBUG		0x14
#define CC10001_ADC_DEBUG		0x14
#define CC10001_ADC_DATA_COUNT		0x20
#define CC10001_ADC_DATA_COUNT		0x20


@@ -78,6 +79,18 @@ static inline u32 cc10001_adc_read_reg(struct cc10001_adc_device *adc_dev,
	return readl(adc_dev->reg_base + reg);
	return readl(adc_dev->reg_base + reg);
}
}


static void cc10001_adc_power_up(struct cc10001_adc_device *adc_dev)
{
	cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_DOWN, 0);
	ndelay(adc_dev->start_delay_ns);
}

static void cc10001_adc_power_down(struct cc10001_adc_device *adc_dev)
{
	cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_DOWN,
			      CC10001_ADC_POWER_DOWN_SET);
}

static void cc10001_adc_start(struct cc10001_adc_device *adc_dev,
static void cc10001_adc_start(struct cc10001_adc_device *adc_dev,
			      unsigned int channel)
			      unsigned int channel)
{
{
@@ -139,11 +152,7 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p)


	mutex_lock(&adc_dev->lock);
	mutex_lock(&adc_dev->lock);


	cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP,
	cc10001_adc_power_up(adc_dev);
			      CC10001_ADC_POWER_UP_SET);

	/* Wait for 8 (6+2) clock cycles before activating START */
	ndelay(adc_dev->start_delay_ns);


	/* Calculate delay step for eoc and sampled data */
	/* Calculate delay step for eoc and sampled data */
	delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT;
	delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT;
@@ -167,7 +176,7 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p)
	}
	}


done:
done:
	cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 0);
	cc10001_adc_power_down(adc_dev);


	mutex_unlock(&adc_dev->lock);
	mutex_unlock(&adc_dev->lock);


@@ -186,11 +195,7 @@ static u16 cc10001_adc_read_raw_voltage(struct iio_dev *indio_dev,
	unsigned int delay_ns;
	unsigned int delay_ns;
	u16 val;
	u16 val;


	cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP,
	cc10001_adc_power_up(adc_dev);
			      CC10001_ADC_POWER_UP_SET);

	/* Wait for 8 (6+2) clock cycles before activating START */
	ndelay(adc_dev->start_delay_ns);


	/* Calculate delay step for eoc and sampled data */
	/* Calculate delay step for eoc and sampled data */
	delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT;
	delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT;
@@ -199,7 +204,7 @@ static u16 cc10001_adc_read_raw_voltage(struct iio_dev *indio_dev,


	val = cc10001_adc_poll_done(indio_dev, chan->channel, delay_ns);
	val = cc10001_adc_poll_done(indio_dev, chan->channel, delay_ns);


	cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 0);
	cc10001_adc_power_down(adc_dev);


	return val;
	return val;
}
}