|
@@ -60,7 +60,6 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
|
|
|
{
|
|
|
unsigned int stepconfig;
|
|
|
int i, steps;
|
|
|
- u32 step_en;
|
|
|
|
|
|
/*
|
|
|
* There are 16 configurable steps and 8 analog input
|
|
@@ -86,8 +85,7 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
|
|
|
adc_dev->channel_step[i] = steps;
|
|
|
steps++;
|
|
|
}
|
|
|
- step_en = get_adc_step_mask(adc_dev);
|
|
|
- am335x_tsc_se_set(adc_dev->mfd_tscadc, step_en);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
static const char * const chan_name_ain[] = {
|
|
@@ -142,10 +140,22 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
|
|
|
int *val, int *val2, long mask)
|
|
|
{
|
|
|
struct tiadc_device *adc_dev = iio_priv(indio_dev);
|
|
|
- int i;
|
|
|
- unsigned int fifo1count, read;
|
|
|
+ int i, map_val;
|
|
|
+ unsigned int fifo1count, read, stepid;
|
|
|
u32 step = UINT_MAX;
|
|
|
bool found = false;
|
|
|
+ u32 step_en;
|
|
|
+ unsigned long timeout = jiffies + usecs_to_jiffies
|
|
|
+ (IDLE_TIMEOUT * adc_dev->channels);
|
|
|
+ step_en = get_adc_step_mask(adc_dev);
|
|
|
+ am335x_tsc_se_set(adc_dev->mfd_tscadc, step_en);
|
|
|
+
|
|
|
+ /* Wait for ADC sequencer to complete sampling */
|
|
|
+ while (tiadc_readl(adc_dev, REG_ADCFSM) & SEQ_STATUS) {
|
|
|
+ if (time_after(jiffies, timeout))
|
|
|
+ return -EAGAIN;
|
|
|
+ }
|
|
|
+ map_val = chan->channel + TOTAL_CHANNELS;
|
|
|
|
|
|
/*
|
|
|
* When the sub-system is first enabled,
|
|
@@ -170,12 +180,16 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
|
|
|
fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
|
|
|
for (i = 0; i < fifo1count; i++) {
|
|
|
read = tiadc_readl(adc_dev, REG_FIFO1);
|
|
|
- if (read >> 16 == step) {
|
|
|
- *val = read & 0xfff;
|
|
|
+ stepid = read & FIFOREAD_CHNLID_MASK;
|
|
|
+ stepid = stepid >> 0x10;
|
|
|
+
|
|
|
+ if (stepid == map_val) {
|
|
|
+ read = read & FIFOREAD_DATA_MASK;
|
|
|
found = true;
|
|
|
+ *val = read;
|
|
|
}
|
|
|
}
|
|
|
- am335x_tsc_se_update(adc_dev->mfd_tscadc);
|
|
|
+
|
|
|
if (found == false)
|
|
|
return -EBUSY;
|
|
|
return IIO_VAL_INT;
|