Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

staging: comedi: amplc_pci230: use comedi_handle_events()



Use comedi_handle_events() to automatically (*cancel) the async command
for an end-of-acquisition or if an error/overflow occurs.

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 a708e091
Loading
Loading
Loading
Loading
+17 −31
Original line number Diff line number Diff line
@@ -1089,8 +1089,6 @@ static void pci230_handle_ao_nofifo(struct comedi_device *dev,
		ret = comedi_buf_get(s, &data);
		if (ret == 0) {
			s->async->events |= COMEDI_CB_OVERFLOW;
			pci230_ao_stop(dev, s);
			dev_err(dev->class_dev, "AO buffer underrun\n");
			return;
		}
		pci230_ao_write_nofifo(dev, data, chan);
@@ -1102,7 +1100,6 @@ static void pci230_handle_ao_nofifo(struct comedi_device *dev,
		if (devpriv->ao_scan_count == 0) {
			/* End of acquisition. */
			async->events |= COMEDI_CB_EOA;
			pci230_ao_stop(dev, s);
		}
	}
}
@@ -1204,13 +1201,10 @@ static bool pci230_handle_ao_fifo(struct comedi_device *dev,
			events |= COMEDI_CB_OVERFLOW | COMEDI_CB_ERROR;
		}
	}
	if (events & (COMEDI_CB_EOA | COMEDI_CB_ERROR | COMEDI_CB_OVERFLOW)) {
		/* Stopping AO due to completion or error. */
		pci230_ao_stop(dev, s);
	if (events & (COMEDI_CB_EOA | COMEDI_CB_ERROR | COMEDI_CB_OVERFLOW))
		running = false;
	} else {
	else
		running = true;
	}
	async->events |= events;
	return running;
}
@@ -1235,7 +1229,7 @@ static int pci230_ao_inttrig_scan_begin(struct comedi_device *dev,
		/* Not using DAC FIFO. */
		spin_unlock_irqrestore(&devpriv->ao_stop_spinlock, irqflags);
		pci230_handle_ao_nofifo(dev, s);
		comedi_event(dev, s);
		comedi_handle_events(dev, s);
	} else {
		/* Using DAC FIFO. */
		/* Read DACSWTRIG register to trigger conversion. */
@@ -1265,7 +1259,7 @@ static void pci230_ao_start(struct comedi_device *dev,

		/* Preload FIFO data. */
		run = pci230_handle_ao_fifo(dev, s);
		comedi_event(dev, s);
		comedi_handle_events(dev, s);
		if (!run) {
			/* Stopped. */
			return;
@@ -2134,11 +2128,8 @@ static void pci230_handle_ai(struct comedi_device *dev,
		events |= COMEDI_CB_BLOCK;
	}
	async->events |= events;
	if (async->events & (COMEDI_CB_EOA | COMEDI_CB_ERROR |
			     COMEDI_CB_OVERFLOW)) {
		/* disable hardware conversions */
		pci230_ai_stop(dev, s);
	} else {
	if (!(async->events & (COMEDI_CB_EOA | COMEDI_CB_ERROR |
			       COMEDI_CB_OVERFLOW))) {
		/* update FIFO interrupt trigger level */
		pci230_ai_update_fifo_trigger_level(dev, s);
	}
@@ -2355,7 +2346,8 @@ static irqreturn_t pci230_interrupt(int irq, void *d)
	unsigned char status_int, valid_status_int, temp_ier;
	struct comedi_device *dev = (struct comedi_device *)d;
	struct pci230_private *devpriv = dev->private;
	struct comedi_subdevice *s;
	struct comedi_subdevice *s_ao = dev->write_subdev;
	struct comedi_subdevice *s_ai = dev->read_subdev;
	unsigned long irqflags;

	/* Read interrupt status/enable register. */
@@ -2385,23 +2377,14 @@ static irqreturn_t pci230_interrupt(int irq, void *d)
	 * two.
	 */

	if (valid_status_int & PCI230_INT_ZCLK_CT1) {
		s = dev->write_subdev;
		pci230_handle_ao_nofifo(dev, s);
		comedi_event(dev, s);
	}
	if (valid_status_int & PCI230_INT_ZCLK_CT1)
		pci230_handle_ao_nofifo(dev, s_ao);

	if (valid_status_int & PCI230P2_INT_DAC) {
		s = dev->write_subdev;
		pci230_handle_ao_fifo(dev, s);
		comedi_event(dev, s);
	}
	if (valid_status_int & PCI230P2_INT_DAC)
		pci230_handle_ao_fifo(dev, s_ao);

	if (valid_status_int & PCI230_INT_ADC) {
		s = dev->read_subdev;
		pci230_handle_ai(dev, s);
		comedi_event(dev, s);
	}
	if (valid_status_int & PCI230_INT_ADC)
		pci230_handle_ai(dev, s_ai);

	/* Reenable interrupts. */
	spin_lock_irqsave(&devpriv->isr_spinlock, irqflags);
@@ -2410,6 +2393,9 @@ static irqreturn_t pci230_interrupt(int irq, void *d)
	devpriv->intr_running = false;
	spin_unlock_irqrestore(&devpriv->isr_spinlock, irqflags);

	comedi_handle_events(dev, s_ao);
	comedi_handle_events(dev, s_ai);

	return IRQ_HANDLED;
}