aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaidu Tellapati <naidu.tellapati@imgtec.com>2015-05-07 17:22:18 -0400
committerJonathan Cameron <jic23@kernel.org>2015-05-12 15:00:58 -0400
commit713276ea88a295a79aa6633ba639ed47692a8de4 (patch)
treed1399ad032b1dafa8fb21d012bd33de779ac65ec
parent13415a998adb1802b5bd6bd5a336331589e866a1 (diff)
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: 1664f6a5b0c8 ("iio: adc: Cosmic Circuits 10001 ADC driver") Signed-off-by: Naidu Tellapati <naidu.tellapati@imgtec.com> Signed-off-by: Ezequiel Garcia <ezequiel.garcia@imgtec.com> Cc: <Stable@vger.kernel.org> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/iio/adc/cc10001_adc.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/drivers/iio/adc/cc10001_adc.c b/drivers/iio/adc/cc10001_adc.c
index 357e6c213784..e7810ac8e295 100644
--- a/drivers/iio/adc/cc10001_adc.c
+++ b/drivers/iio/adc/cc10001_adc.c
@@ -35,8 +35,9 @@
35#define CC10001_ADC_EOC_SET BIT(0) 35#define CC10001_ADC_EOC_SET BIT(0)
36 36
37#define CC10001_ADC_CHSEL_SAMPLED 0x0c 37#define CC10001_ADC_CHSEL_SAMPLED 0x0c
38#define CC10001_ADC_POWER_UP 0x10 38#define CC10001_ADC_POWER_DOWN 0x10
39#define CC10001_ADC_POWER_UP_SET BIT(0) 39#define CC10001_ADC_POWER_DOWN_SET BIT(0)
40
40#define CC10001_ADC_DEBUG 0x14 41#define CC10001_ADC_DEBUG 0x14
41#define CC10001_ADC_DATA_COUNT 0x20 42#define CC10001_ADC_DATA_COUNT 0x20
42 43
@@ -78,6 +79,18 @@ static inline u32 cc10001_adc_read_reg(struct cc10001_adc_device *adc_dev,
78 return readl(adc_dev->reg_base + reg); 79 return readl(adc_dev->reg_base + reg);
79} 80}
80 81
82static void cc10001_adc_power_up(struct cc10001_adc_device *adc_dev)
83{
84 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_DOWN, 0);
85 ndelay(adc_dev->start_delay_ns);
86}
87
88static void cc10001_adc_power_down(struct cc10001_adc_device *adc_dev)
89{
90 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_DOWN,
91 CC10001_ADC_POWER_DOWN_SET);
92}
93
81static void cc10001_adc_start(struct cc10001_adc_device *adc_dev, 94static void cc10001_adc_start(struct cc10001_adc_device *adc_dev,
82 unsigned int channel) 95 unsigned int channel)
83{ 96{
@@ -139,11 +152,7 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p)
139 152
140 mutex_lock(&adc_dev->lock); 153 mutex_lock(&adc_dev->lock);
141 154
142 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 155 cc10001_adc_power_up(adc_dev);
143 CC10001_ADC_POWER_UP_SET);
144
145 /* Wait for 8 (6+2) clock cycles before activating START */
146 ndelay(adc_dev->start_delay_ns);
147 156
148 /* Calculate delay step for eoc and sampled data */ 157 /* Calculate delay step for eoc and sampled data */
149 delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT; 158 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)
167 } 176 }
168 177
169done: 178done:
170 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 0); 179 cc10001_adc_power_down(adc_dev);
171 180
172 mutex_unlock(&adc_dev->lock); 181 mutex_unlock(&adc_dev->lock);
173 182
@@ -186,11 +195,7 @@ static u16 cc10001_adc_read_raw_voltage(struct iio_dev *indio_dev,
186 unsigned int delay_ns; 195 unsigned int delay_ns;
187 u16 val; 196 u16 val;
188 197
189 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 198 cc10001_adc_power_up(adc_dev);
190 CC10001_ADC_POWER_UP_SET);
191
192 /* Wait for 8 (6+2) clock cycles before activating START */
193 ndelay(adc_dev->start_delay_ns);
194 199
195 /* Calculate delay step for eoc and sampled data */ 200 /* Calculate delay step for eoc and sampled data */
196 delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT; 201 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,
199 204
200 val = cc10001_adc_poll_done(indio_dev, chan->channel, delay_ns); 205 val = cc10001_adc_poll_done(indio_dev, chan->channel, delay_ns);
201 206
202 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 0); 207 cc10001_adc_power_down(adc_dev);
203 208
204 return val; 209 return val;
205} 210}