Skip to contentSkip to conversation

Patch "iio: adc: cc10001: Fix incorrect use of power-up/power-down register" has been added to the 4.0-stable tree

PATCH [email protected] 1 participant 1 message Jun 3, 2015

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

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

to the 4.0-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
iio-adc-cc10001-fix-incorrect-use-of-power-up-power-down-register.patch
and it can be found in the queue-4.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 713276ea88a295a79aa6633ba639ed47692a8de4 Mon Sep 17 00:00:00 2001

From: Naidu Tellapati <[email protected]>
Date: Thu, 7 May 2015 18:22:18 -0300
Subject: iio: adc: cc10001: Fix incorrect use of power-up/power-down register

From: Naidu Tellapati <[email protected]>

commit 713276ea88a295a79aa6633ba639ed47692a8de4 upstream.

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 1664f6a5b0c8 ("iio: adc: Cosmic Circuits 10001 ADC driver")
---
 drivers/iio/adc/cc10001_adc.c |   33 +++++++++++++++++++--------------
 1 file changed, 19 insertions(+), 14 deletions(-)
drivers/iio/adc/cc10001_adc.c +19 -14
@@ -35,8 +35,9 @@
 #define CC10001_ADC_EOC_SET		BIT(0)
 
 #define CC10001_ADC_CHSEL_SAMPLED	0x0c
-#define CC10001_ADC_POWER_UP		0x10
-#define CC10001_ADC_POWER_UP_SET	BIT(0)
+#define CC10001_ADC_POWER_DOWN		0x10
+#define CC10001_ADC_POWER_DOWN_SET	BIT(0)
+
 #define CC10001_ADC_DEBUG		0x14
 #define CC10001_ADC_DATA_COUNT		0x20
 
@@ -78,6 +79,18 @@ static inline u32 cc10001_adc_read_reg(s
 	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,
 			      unsigned int channel)
 {
@@ -139,11 +152,7 @@ static irqreturn_t cc10001_adc_trigger_h
 
 	mutex_lock(&adc_dev->lock);
 
-	cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP,
-			      CC10001_ADC_POWER_UP_SET);
-
-	/* Wait for 8 (6+2) clock cycles before activating START */
-	ndelay(adc_dev->start_delay_ns);
+	cc10001_adc_power_up(adc_dev);
 
 	/* Calculate delay step for eoc and sampled data */
 	delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT;
@@ -167,7 +176,7 @@ static irqreturn_t cc10001_adc_trigger_h
 	}
 
 done:
-	cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 0);
+	cc10001_adc_power_down(adc_dev);
 
 	mutex_unlock(&adc_dev->lock);
 
@@ -186,11 +195,7 @@ static u16 cc10001_adc_read_raw_voltage(
 	unsigned int delay_ns;
 	u16 val;
 
-	cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP,
-			      CC10001_ADC_POWER_UP_SET);
-
-	/* Wait for 8 (6+2) clock cycles before activating START */
-	ndelay(adc_dev->start_delay_ns);
+	cc10001_adc_power_up(adc_dev);
 
 	/* Calculate delay step for eoc and sampled data */
 	delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT;
@@ -199,7 +204,7 @@ static u16 cc10001_adc_read_raw_voltage(
 
 	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;
 }

Patches currently in stable-queue which might be from [email protected] are

queue-4.0/iio-adc-cc10001-fix-the-channel-number-mapping.patch queue-4.0/iio-adc-cc10001-fix-regulator_get_voltage-return-value-check.patch queue-4.0/iio-adc-cc10001-add-delay-before-setting-start-bit.patch queue-4.0/iio-adc-cc10001-fix-incorrect-use-of-power-up-power-down-register.patch