diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c index 0167d7ee6d0d..42448d22ac9f 100644 --- a/drivers/staging/comedi/drivers/pcl818.c +++ b/drivers/staging/comedi/drivers/pcl818.c @@ -540,12 +540,41 @@ static int pcl818_do_insn_bits(struct comedi_device *dev, return insn->n; } +static bool pcl818_ai_next_chan(struct comedi_device *dev, + struct comedi_subdevice *s) +{ + struct pcl818_private *devpriv = dev->private; + struct comedi_cmd *cmd = &s->async->cmd; + + s->async->events |= COMEDI_CB_BLOCK; + + devpriv->act_chanlist_pos++; + if (devpriv->act_chanlist_pos >= devpriv->act_chanlist_len) + devpriv->act_chanlist_pos = 0; + + s->async->cur_chan++; + if (s->async->cur_chan >= cmd->chanlist_len) { + s->async->cur_chan = 0; + devpriv->ai_act_scan--; + s->async->events |= COMEDI_CB_EOS; + } + + if (cmd->stop_src == TRIG_COUNT && devpriv->ai_act_scan == 0) { + /* all data sampled */ + s->cancel(dev, s); + s->async->events |= COMEDI_CB_EOA; + comedi_event(dev, s); + return false; + } + + return true; +} + static irqreturn_t interrupt_pcl818_ai_mode13_int(int irq, void *d) { struct comedi_device *dev = d; struct pcl818_private *devpriv = dev->private; struct comedi_subdevice *s = dev->read_subdev; - struct comedi_cmd *cmd = &s->async->cmd; unsigned int chan; if (pcl818_ai_eoc(dev, s, NULL, 0)) { @@ -570,21 +599,10 @@ static irqreturn_t interrupt_pcl818_ai_mode13_int(int irq, void *d) comedi_event(dev, s); return IRQ_HANDLED; } - devpriv->act_chanlist_pos++; - if (devpriv->act_chanlist_pos >= devpriv->act_chanlist_len) - devpriv->act_chanlist_pos = 0; - s->async->cur_chan++; - if (s->async->cur_chan >= cmd->chanlist_len) { - s->async->cur_chan = 0; - devpriv->ai_act_scan--; - } + if (!pcl818_ai_next_chan(dev, s)) + return IRQ_HANDLED; - if (cmd->stop_src == TRIG_COUNT && devpriv->ai_act_scan == 0) { - /* all data sampled */ - s->cancel(dev, s); - s->async->events |= COMEDI_CB_EOA; - } comedi_event(dev, s); return IRQ_HANDLED; } @@ -594,7 +612,6 @@ static irqreturn_t interrupt_pcl818_ai_mode13_dma(int irq, void *d) struct comedi_device *dev = d; struct pcl818_private *devpriv = dev->private; struct comedi_subdevice *s = dev->read_subdev; - struct comedi_cmd *cmd = &s->async->cmd; int i, len, bufptr; unsigned short *ptr; @@ -621,23 +638,8 @@ static irqreturn_t interrupt_pcl818_ai_mode13_dma(int irq, void *d) comedi_buf_put(s->async, ptr[bufptr++] >> 4); /* get one sample */ - devpriv->act_chanlist_pos++; - if (devpriv->act_chanlist_pos >= devpriv->act_chanlist_len) - devpriv->act_chanlist_pos = 0; - - s->async->cur_chan++; - if (s->async->cur_chan >= cmd->chanlist_len) { - s->async->cur_chan = 0; - devpriv->ai_act_scan--; - } - - if (cmd->stop_src == TRIG_COUNT && devpriv->ai_act_scan == 0) { - /* all data sampled */ - s->cancel(dev, s); - s->async->events |= COMEDI_CB_EOA; - comedi_event(dev, s); + if (!pcl818_ai_next_chan(dev, s)) return IRQ_HANDLED; - } } if (len > 0) @@ -650,7 +652,6 @@ static irqreturn_t interrupt_pcl818_ai_mode13_fifo(int irq, void *d) struct comedi_device *dev = d; struct pcl818_private *devpriv = dev->private; struct comedi_subdevice *s = dev->read_subdev; - struct comedi_cmd *cmd = &s->async->cmd; int i, len; unsigned char lo; @@ -694,23 +695,8 @@ static irqreturn_t interrupt_pcl818_ai_mode13_fifo(int irq, void *d) comedi_buf_put(s->async, (lo >> 4) | (inb(dev->iobase + PCL818_FI_DATAHI) << 4)); /* get one sample */ - devpriv->act_chanlist_pos++; - if (devpriv->act_chanlist_pos >= devpriv->act_chanlist_len) - devpriv->act_chanlist_pos = 0; - - s->async->cur_chan++; - if (s->async->cur_chan >= cmd->chanlist_len) { - s->async->cur_chan = 0; - devpriv->ai_act_scan--; - } - - if (cmd->stop_src == TRIG_COUNT && devpriv->ai_act_scan == 0) { - /* all data sampled */ - s->cancel(dev, s); - s->async->events |= COMEDI_CB_EOA; - comedi_event(dev, s); + if (!pcl818_ai_next_chan(dev, s)) return IRQ_HANDLED; - } } if (len > 0)