staging: comedi: drivers: move comedi_async 'cur_chan' tracking into the core

The commedi_async 'cur_chan' member is used to track the current position
in the chanlist for a scan. Currently only a couple comedi drivers use
this member.

For aeshtetics, move the 'cur_chan' tracking into the core for non-SDF_PACKED
subdevices. The 'cur_chan' will be updated after reading or writing samples
to the async buffer by comedi_inc_scan_progress(). All non-SDF_PACKED subdevices
will then automatiaclly track the 'cur_chan'.

Some of the drivers use the 'cur_chan' to detect the end of scan event when
counting scans. The COMEDI_CB_EOS event is automatically added by the core
when the end of scan is detected. The drivers just need to check if the
'cur_chan' is 0 to count the number of scans completed.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
H Hartley Sweeten 2014-10-31 09:49:31 -07:00 коммит произвёл Greg Kroah-Hartman
Родитель c1b617e017
Коммит f8736ca466
9 изменённых файлов: 16 добавлений и 48 удалений

Просмотреть файл

@ -341,8 +341,15 @@ void comedi_inc_scan_progress(struct comedi_subdevice *s,
unsigned int num_bytes) unsigned int num_bytes)
{ {
struct comedi_async *async = s->async; struct comedi_async *async = s->async;
struct comedi_cmd *cmd = &async->cmd;
unsigned int scan_length = comedi_bytes_per_scan(s); unsigned int scan_length = comedi_bytes_per_scan(s);
/* track the 'cur_chan' for non-SDF_PACKED subdevices */
if (!(s->subdev_flags & SDF_PACKED)) {
async->cur_chan += comedi_bytes_to_samples(s, num_bytes);
async->cur_chan %= cmd->chanlist_len;
}
async->scan_progress += num_bytes; async->scan_progress += num_bytes;
if (async->scan_progress >= scan_length) { if (async->scan_progress >= scan_length) {
async->scan_progress %= scan_length; async->scan_progress %= scan_length;

Просмотреть файл

@ -1167,8 +1167,6 @@ static void v_APCI3120_InterruptDmaMoveBlock16bit(struct comedi_device *dev,
devpriv->ui_AiActualScan += devpriv->ui_AiActualScan +=
(s->async->cur_chan + num_samples) / cmd->scan_end_arg; (s->async->cur_chan + num_samples) / cmd->scan_end_arg;
s->async->cur_chan += num_samples;
s->async->cur_chan %= cmd->scan_end_arg;
comedi_buf_write_samples(s, dma_buffer, num_samples); comedi_buf_write_samples(s, dma_buffer, num_samples);
} }

Просмотреть файл

@ -483,8 +483,6 @@ static void move_block_from_dma(struct comedi_device *dev,
num_samples = defragment_dma_buffer(dev, s, dma_buffer, num_samples); num_samples = defragment_dma_buffer(dev, s, dma_buffer, num_samples);
devpriv->ai_act_scan += devpriv->ai_act_scan +=
(s->async->cur_chan + num_samples) / cmd->scan_end_arg; (s->async->cur_chan + num_samples) / cmd->scan_end_arg;
s->async->cur_chan += num_samples;
s->async->cur_chan %= cmd->scan_end_arg;
comedi_buf_write_samples(s, dma_buffer, num_samples); comedi_buf_write_samples(s, dma_buffer, num_samples);
} }
@ -612,10 +610,8 @@ static void interrupt_pci9118_ai_onesample(struct comedi_device *dev,
sampl = inl(dev->iobase + PCI9118_AI_FIFO_REG); sampl = inl(dev->iobase + PCI9118_AI_FIFO_REG);
comedi_buf_write_samples(s, &sampl, 1); comedi_buf_write_samples(s, &sampl, 1);
s->async->cur_chan++;
if (s->async->cur_chan >= cmd->scan_end_arg) { if (s->async->cur_chan == 0) {
/* one scan done */
s->async->cur_chan %= cmd->scan_end_arg;
devpriv->ai_act_scan++; devpriv->ai_act_scan++;
if (!devpriv->ai_neverending) { if (!devpriv->ai_neverending) {
/* all data sampled? */ /* all data sampled? */

Просмотреть файл

@ -772,11 +772,6 @@ static void pci1710_handle_every_sample(struct comedi_device *dev,
val &= s->maxdata; val &= s->maxdata;
comedi_buf_write_samples(s, &val, 1); comedi_buf_write_samples(s, &val, 1);
s->async->cur_chan++;
if (s->async->cur_chan >= cmd->chanlist_len)
s->async->cur_chan = 0;
if (s->async->cur_chan == 0) { /* one scan done */ if (s->async->cur_chan == 0) { /* one scan done */
devpriv->ai_act_scan++; devpriv->ai_act_scan++;
if (cmd->stop_src == TRIG_COUNT && if (cmd->stop_src == TRIG_COUNT &&
@ -800,7 +795,6 @@ static int move_block_from_fifo(struct comedi_device *dev,
struct comedi_subdevice *s, int n, int turn) struct comedi_subdevice *s, int n, int turn)
{ {
struct pci1710_private *devpriv = dev->private; struct pci1710_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd;
unsigned int val; unsigned int val;
int ret; int ret;
int i; int i;
@ -817,11 +811,8 @@ static int move_block_from_fifo(struct comedi_device *dev,
val &= s->maxdata; val &= s->maxdata;
comedi_buf_write_samples(s, &val, 1); comedi_buf_write_samples(s, &val, 1);
s->async->cur_chan++; if (s->async->cur_chan == 0)
if (s->async->cur_chan >= cmd->chanlist_len) {
s->async->cur_chan = 0;
devpriv->ai_act_scan++; devpriv->ai_act_scan++;
}
} }
return 0; return 0;
} }

Просмотреть файл

@ -1125,14 +1125,10 @@ static void ni_ao_fifo_load(struct comedi_device *dev,
struct comedi_subdevice *s, int n) struct comedi_subdevice *s, int n)
{ {
struct ni_private *devpriv = dev->private; struct ni_private *devpriv = dev->private;
struct comedi_async *async = s->async;
struct comedi_cmd *cmd = &async->cmd;
int chan;
int i; int i;
unsigned short d; unsigned short d;
u32 packed_data; u32 packed_data;
chan = async->cur_chan;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
comedi_buf_read_samples(s, &d, 1); comedi_buf_read_samples(s, &d, 1);
@ -1141,7 +1137,6 @@ static void ni_ao_fifo_load(struct comedi_device *dev,
/* 6711 only has 16 bit wide ao fifo */ /* 6711 only has 16 bit wide ao fifo */
if (!devpriv->is_6711) { if (!devpriv->is_6711) {
comedi_buf_read_samples(s, &d, 1); comedi_buf_read_samples(s, &d, 1);
chan++;
i++; i++;
packed_data |= (d << 16) & 0xffff0000; packed_data |= (d << 16) & 0xffff0000;
} }
@ -1149,10 +1144,7 @@ static void ni_ao_fifo_load(struct comedi_device *dev,
} else { } else {
ni_writew(dev, d, DAC_FIFO_Data); ni_writew(dev, d, DAC_FIFO_Data);
} }
chan++;
chan %= cmd->chanlist_len;
} }
async->cur_chan = chan;
} }
/* /*

Просмотреть файл

@ -843,12 +843,8 @@ static bool pcl812_ai_next_chan(struct comedi_device *dev,
struct pcl812_private *devpriv = dev->private; struct pcl812_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd; struct comedi_cmd *cmd = &s->async->cmd;
s->async->cur_chan++; if (s->async->cur_chan == 0)
if (s->async->cur_chan >= cmd->chanlist_len) {
s->async->cur_chan = 0;
devpriv->ai_act_scan++; devpriv->ai_act_scan++;
s->async->events |= COMEDI_CB_EOS;
}
if (cmd->stop_src == TRIG_COUNT && if (cmd->stop_src == TRIG_COUNT &&
devpriv->ai_act_scan >= cmd->stop_arg) { devpriv->ai_act_scan >= cmd->stop_arg) {
@ -864,6 +860,7 @@ static void pcl812_handle_eoc(struct comedi_device *dev,
struct comedi_subdevice *s) struct comedi_subdevice *s)
{ {
struct comedi_cmd *cmd = &s->async->cmd; struct comedi_cmd *cmd = &s->async->cmd;
unsigned int chan = s->async->cur_chan;
unsigned int next_chan; unsigned int next_chan;
unsigned short val; unsigned short val;
@ -877,10 +874,8 @@ static void pcl812_handle_eoc(struct comedi_device *dev,
comedi_buf_write_samples(s, &val, 1); comedi_buf_write_samples(s, &val, 1);
/* Set up next channel. Added by abbotti 2010-01-20, but untested. */ /* Set up next channel. Added by abbotti 2010-01-20, but untested. */
next_chan = s->async->cur_chan + 1; next_chan = s->async->cur_chan;
if (next_chan >= cmd->chanlist_len) if (cmd->chanlist[chan] != cmd->chanlist[next_chan])
next_chan = 0;
if (cmd->chanlist[s->async->cur_chan] != cmd->chanlist[next_chan])
pcl812_ai_set_chan_range(dev, cmd->chanlist[next_chan], 0); pcl812_ai_set_chan_range(dev, cmd->chanlist[next_chan], 0);
pcl812_ai_next_chan(dev, s); pcl812_ai_next_chan(dev, s);

Просмотреть файл

@ -289,12 +289,8 @@ static bool pcl816_ai_next_chan(struct comedi_device *dev,
struct pcl816_private *devpriv = dev->private; struct pcl816_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd; struct comedi_cmd *cmd = &s->async->cmd;
s->async->cur_chan++; if (s->async->cur_chan == 0)
if (s->async->cur_chan >= cmd->chanlist_len) {
s->async->cur_chan = 0;
devpriv->ai_act_scan++; devpriv->ai_act_scan++;
s->async->events |= COMEDI_CB_EOS;
}
if (cmd->stop_src == TRIG_COUNT && if (cmd->stop_src == TRIG_COUNT &&
devpriv->ai_act_scan >= cmd->stop_arg) { devpriv->ai_act_scan >= cmd->stop_arg) {

Просмотреть файл

@ -525,12 +525,8 @@ static bool pcl818_ai_next_chan(struct comedi_device *dev,
if (devpriv->act_chanlist_pos >= devpriv->act_chanlist_len) if (devpriv->act_chanlist_pos >= devpriv->act_chanlist_len)
devpriv->act_chanlist_pos = 0; devpriv->act_chanlist_pos = 0;
s->async->cur_chan++; if (s->async->cur_chan == 0)
if (s->async->cur_chan >= cmd->chanlist_len) {
s->async->cur_chan = 0;
devpriv->ai_act_scan--; devpriv->ai_act_scan--;
s->async->events |= COMEDI_CB_EOS;
}
if (cmd->stop_src == TRIG_COUNT && devpriv->ai_act_scan == 0) { if (cmd->stop_src == TRIG_COUNT && devpriv->ai_act_scan == 0) {
/* all data sampled */ /* all data sampled */

Просмотреть файл

@ -628,9 +628,6 @@ static int ai_read_n(struct comedi_device *dev, struct comedi_subdevice *s,
if (!comedi_buf_write_samples(s, &d, 1)) if (!comedi_buf_write_samples(s, &d, 1))
return -1; return -1;
async->cur_chan++;
async->cur_chan %= cmd->chanlist_len;
if (devpriv->ai_count > 0) /* < 0, means read forever */ if (devpriv->ai_count > 0) /* < 0, means read forever */
devpriv->ai_count--; devpriv->ai_count--;
} }