From: H Hartley Sweeten Date: Tue, 4 Mar 2014 18:29:33 +0000 (-0700) Subject: staging: comedi: pcl818: interrupt handlers should not busywait X-Git-Tag: firefly_0821_release~176^2~4193^2~670 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=127005717dfc5bf42091a14e5a9736f52bfaea1c;p=firefly-linux-kernel-4.4.55.git staging: comedi: pcl818: interrupt handlers should not busywait The interrupt is only generated by the hardware at the completion of an A/D conversion. Because of this the sanity check to make sure that the A/D conversion is complete and data is available is probably unnecessary but it doesn't hurt anything. The busywait loop is a different issue. Interrupt routines should not busywait. That's just mean... Remove the bustwait and use pcl818_ai_eoc() to check for the end-of- conversion. Signed-off-by: H Hartley Sweeten Reviewed-by: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c index 661a907272bc..0167d7ee6d0d 100644 --- a/drivers/staging/comedi/drivers/pcl818.c +++ b/drivers/staging/comedi/drivers/pcl818.c @@ -547,21 +547,16 @@ static irqreturn_t interrupt_pcl818_ai_mode13_int(int irq, void *d) struct comedi_subdevice *s = dev->read_subdev; struct comedi_cmd *cmd = &s->async->cmd; unsigned int chan; - int timeout = 50; /* wait max 50us */ - while (timeout--) { - if (inb(dev->iobase + PCL818_STATUS) & 0x10) - goto conv_finish; - udelay(1); + if (pcl818_ai_eoc(dev, s, NULL, 0)) { + outb(0, dev->iobase + PCL818_STATUS); /* clear INT request */ + comedi_error(dev, "A/D mode1/3 IRQ without DRDY!"); + s->cancel(dev, s); + s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR; + comedi_event(dev, s); + return IRQ_HANDLED; } - outb(0, dev->iobase + PCL818_STATUS); /* clear INT request */ - comedi_error(dev, "A/D mode1/3 IRQ without DRDY!"); - s->cancel(dev, s); - s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR; - comedi_event(dev, s); - return IRQ_HANDLED; -conv_finish: comedi_buf_put(s->async, pcl818_ai_get_sample(dev, s, &chan)); outb(0, dev->iobase + PCL818_CLRINT); /* clear INT request */