[PATCH 3/6] mfd: mc13xxx-core: ADC conv: setup readout for single channel

Marc Reilly marc at cpdesign.com.au
Sun Jan 29 17:33:25 EST 2012


The ADC always does 8 conversions, for single channel mode one channel
is converted 8 times and the results are placed in the channels 0..7
This change resets the channel indexes to 0 and 4 so that the 8 individual
samples are read out correctly.

Signed-off-by: Marc Reilly <marc at cpdesign.com.au>
---
 drivers/mfd/mc13xxx-core.c |   15 ++++++++++++++-
 1 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
index afff892..56e09ea 100644
--- a/drivers/mfd/mc13xxx-core.c
+++ b/drivers/mfd/mc13xxx-core.c
@@ -583,13 +583,26 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
 
 	mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_ADCDONE, &adcdone_data);
 
-	if (!ret)
+	if (!ret) {
+		if (mode == MC13XXX_ADC_MODE_SINGLE_CHAN) {
+			/*
+			 * Set the channels for read back same as for multi
+			 * channel. Don't use adc1 var from above, or another
+			 * conversion would be started.
+			 */
+			u32 mask = (0x7 << MC13XXX_ADC1_CHAN0_SHIFT) |
+					(0x7 << MC13XXX_ADC1_CHAN1_SHIFT);
+			mc13xxx_reg_rmw(mc13xxx, MC13XXX_ADC1, mask,
+					4 << MC13XXX_ADC1_CHAN1_SHIFT);
+		}
+
 		for (i = 0; i < 4; ++i) {
 			ret = mc13xxx_reg_read(mc13xxx,
 					MC13XXX_ADC2, &sample[i]);
 			if (ret)
 				break;
 		}
+	}
 
 	if (mode == MC13XXX_ADC_MODE_TS)
 		/* restore TSMOD */
-- 
1.7.3.4




More information about the linux-arm-kernel mailing list