staging: comedi: pcmuio: tidy up pcmuio_handle_asic_interrupt()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Fri, 6 Dec 2013 16:43:02 +0000 (09:43 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Dec 2013 21:10:02 +0000 (13:10 -0800)
Unfortunatly, since there could be two asics, we can't use dev->read_subdev
to get the subdevice. But, the comedi_subdevice associated with the 'asic'
can easily be calculated. This allows removing the for () loop that searched
for the correct subdevice.

Tidy up the function.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/pcmuio.c

index f7032fe251b168ada6c6449fdd0c85d857009c0f..8752d4d09f3ff71c4c9f560792f66a04144e49ed 100644 (file)
@@ -354,38 +354,24 @@ done:
 
 static int pcmuio_handle_asic_interrupt(struct comedi_device *dev, int asic)
 {
-       struct pcmuio_subdev_private *subpriv;
+       /* there are could be two asics so we can't use dev->read_subdev */
+       struct comedi_subdevice *s = &dev->subdevices[asic * 2];
        unsigned long iobase = dev->iobase + (asic * PCMUIO_ASIC_IOSIZE);
-       unsigned int triggered = 0;
-       int got1 = 0;
-       unsigned char int_pend;
-       int i;
-
-       int_pend = inb(iobase + PCMUIO_INT_PENDING_REG) & 0x07;
-       if (int_pend) {
-               triggered = pcmuio_read(dev, asic, PCMUIO_PAGE_INT_ID, 0);
-               pcmuio_write(dev, 0, asic, PCMUIO_PAGE_INT_ID, 0);
+       unsigned int val;
 
-               ++got1;
-       }
+       /* are there any interrupts pending */
+       val = inb(iobase + PCMUIO_INT_PENDING_REG) & 0x07;
+       if (!val)
+               return 0;
 
-       if (triggered) {
-               struct comedi_subdevice *s;
-               /* TODO here: dispatch io lines to subdevs with commands.. */
-               for (i = 0; i < dev->n_subdevices; i++) {
-                       s = &dev->subdevices[i];
-                       subpriv = s->private;
-                       if (subpriv->intr.asic == asic) {
-                               /*
-                                * This is an interrupt subdev, and it
-                                * matches this asic!
-                                */
-                               pcmuio_handle_intr_subdev(dev, s,
-                                                         triggered);
-                       }
-               }
-       }
-       return got1;
+       /* get, and clear, the pending interrupts */
+       val = pcmuio_read(dev, asic, PCMUIO_PAGE_INT_ID, 0);
+       pcmuio_write(dev, 0, asic, PCMUIO_PAGE_INT_ID, 0);
+
+       /* handle the pending interrupts */
+       pcmuio_handle_intr_subdev(dev, s, val);
+
+       return 1;
 }
 
 static irqreturn_t pcmuio_interrupt(int irq, void *d)