Commit d615416d authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: pcl818: introduce pcl818_ai_write_sample()

This driver can acquire analog input samples during the async command with
DMA, by using the FIFO, or sample-by-sample using the End-Of-Conversion
interrupt. All three methods do the following sequence:

  1) check for channel dropout
  2) add the sample to the async buffer
  3) advance the channel dropout detection and detect the end of the command

Merge this sequence into a new helper function.
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3e6cb74f
...@@ -454,11 +454,12 @@ static int pcl818_ai_eoc(struct comedi_device *dev, ...@@ -454,11 +454,12 @@ static int pcl818_ai_eoc(struct comedi_device *dev,
return -EBUSY; return -EBUSY;
} }
static bool pcl818_ai_dropout(struct comedi_device *dev, static bool pcl818_ai_write_sample(struct comedi_device *dev,
struct comedi_subdevice *s, struct comedi_subdevice *s,
unsigned int chan) unsigned int chan, unsigned int val)
{ {
struct pcl818_private *devpriv = dev->private; struct pcl818_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd;
unsigned int expected_chan; unsigned int expected_chan;
expected_chan = devpriv->act_chanlist[devpriv->act_chanlist_pos]; expected_chan = devpriv->act_chanlist[devpriv->act_chanlist_pos];
...@@ -469,16 +470,10 @@ static bool pcl818_ai_dropout(struct comedi_device *dev, ...@@ -469,16 +470,10 @@ static bool pcl818_ai_dropout(struct comedi_device *dev,
(devpriv->usefifo) ? "FIFO" : "IRQ", (devpriv->usefifo) ? "FIFO" : "IRQ",
chan, expected_chan); chan, expected_chan);
s->async->events |= COMEDI_CB_ERROR; s->async->events |= COMEDI_CB_ERROR;
return true; return false;
} }
return false;
}
static bool pcl818_ai_next_chan(struct comedi_device *dev, comedi_buf_write_samples(s, &val, 1);
struct comedi_subdevice *s)
{
struct pcl818_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd;
devpriv->act_chanlist_pos++; devpriv->act_chanlist_pos++;
if (devpriv->act_chanlist_pos >= devpriv->act_chanlist_len) if (devpriv->act_chanlist_pos >= devpriv->act_chanlist_len)
...@@ -506,13 +501,7 @@ static void pcl818_handle_eoc(struct comedi_device *dev, ...@@ -506,13 +501,7 @@ static void pcl818_handle_eoc(struct comedi_device *dev,
} }
val = pcl818_ai_get_sample(dev, s, &chan); val = pcl818_ai_get_sample(dev, s, &chan);
pcl818_ai_write_sample(dev, s, chan, val);
if (pcl818_ai_dropout(dev, s, chan))
return;
comedi_buf_write_samples(s, &val, 1);
pcl818_ai_next_chan(dev, s);
} }
static void pcl818_handle_dma(struct comedi_device *dev, static void pcl818_handle_dma(struct comedi_device *dev,
...@@ -535,13 +524,7 @@ static void pcl818_handle_dma(struct comedi_device *dev, ...@@ -535,13 +524,7 @@ static void pcl818_handle_dma(struct comedi_device *dev,
val = ptr[i]; val = ptr[i];
chan = val & 0xf; chan = val & 0xf;
val = (val >> 4) & s->maxdata; val = (val >> 4) & s->maxdata;
if (!pcl818_ai_write_sample(dev, s, chan, val))
if (pcl818_ai_dropout(dev, s, chan))
break;
comedi_buf_write_samples(s, &val, 1);
if (!pcl818_ai_next_chan(dev, s))
break; break;
} }
} }
...@@ -576,13 +559,7 @@ static void pcl818_handle_fifo(struct comedi_device *dev, ...@@ -576,13 +559,7 @@ static void pcl818_handle_fifo(struct comedi_device *dev,
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
val = pcl818_ai_get_fifo_sample(dev, s, &chan); val = pcl818_ai_get_fifo_sample(dev, s, &chan);
if (!pcl818_ai_write_sample(dev, s, chan, val))
if (pcl818_ai_dropout(dev, s, chan))
break;
comedi_buf_write_samples(s, &val, 1);
if (!pcl818_ai_next_chan(dev, s))
break; break;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment