Commit f8736ca4 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

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: 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 c1b617e0
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -341,8 +341,15 @@ void comedi_inc_scan_progress(struct comedi_subdevice *s,
			      unsigned int num_bytes)
{
	struct comedi_async *async = s->async;
	struct comedi_cmd *cmd = &async->cmd;
	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;
	if (async->scan_progress >= scan_length) {
		async->scan_progress %= scan_length;
+0 −2
Original line number Diff line number Diff line
@@ -1167,8 +1167,6 @@ static void v_APCI3120_InterruptDmaMoveBlock16bit(struct comedi_device *dev,

	devpriv->ui_AiActualScan +=
		(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);
}
+2 −6
Original line number Diff line number Diff line
@@ -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);
	devpriv->ai_act_scan +=
	    (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);
}
@@ -612,10 +610,8 @@ static void interrupt_pci9118_ai_onesample(struct comedi_device *dev,
	sampl = inl(dev->iobase + PCI9118_AI_FIFO_REG);

	comedi_buf_write_samples(s, &sampl, 1);
	s->async->cur_chan++;
	if (s->async->cur_chan >= cmd->scan_end_arg) {
							/* one scan done */
		s->async->cur_chan %= cmd->scan_end_arg;

	if (s->async->cur_chan == 0) {
		devpriv->ai_act_scan++;
		if (!devpriv->ai_neverending) {
			/* all data sampled? */
+1 −10
Original line number Diff line number Diff line
@@ -772,11 +772,6 @@ static void pci1710_handle_every_sample(struct comedi_device *dev,
		val &= s->maxdata;
		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 */
			devpriv->ai_act_scan++;
			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 pci1710_private *devpriv = dev->private;
	struct comedi_cmd *cmd = &s->async->cmd;
	unsigned int val;
	int ret;
	int i;
@@ -817,12 +811,9 @@ static int move_block_from_fifo(struct comedi_device *dev,
		val &= s->maxdata;
		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)
			devpriv->ai_act_scan++;
	}
	}
	return 0;
}

+0 −8
Original line number Diff line number Diff line
@@ -1125,14 +1125,10 @@ static void ni_ao_fifo_load(struct comedi_device *dev,
			    struct comedi_subdevice *s, int n)
{
	struct ni_private *devpriv = dev->private;
	struct comedi_async *async = s->async;
	struct comedi_cmd *cmd = &async->cmd;
	int chan;
	int i;
	unsigned short d;
	u32 packed_data;

	chan = async->cur_chan;
	for (i = 0; i < n; i++) {
		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 */
			if (!devpriv->is_6711) {
				comedi_buf_read_samples(s, &d, 1);
				chan++;
				i++;
				packed_data |= (d << 16) & 0xffff0000;
			}
@@ -1149,10 +1144,7 @@ static void ni_ao_fifo_load(struct comedi_device *dev,
		} else {
			ni_writew(dev, d, DAC_FIFO_Data);
		}
		chan++;
		chan %= cmd->chanlist_len;
	}
	async->cur_chan = chan;
}

/*
Loading