aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-12-09 15:31:13 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-12-17 10:02:14 -0800
commiteacc792d2c6441570d90dec274a5379f562cd40b (patch)
tree0ce9f02b5f55408a3733d8eac99ff842801b383e
parentstaging: comedi: pcmmio: cleanup indent levels in interrupt_pcmmio() (diff)
staging: comedi: pcmmio: use pcmmio_dio_{read, write}() in interrupt_pcmmio()
Use the helper functions to read/write the PCMMIO_PAGE_INT_ID registers. This allows removing the need to lock/unlock the spinlock 'pagelock' and removes the need for the for () loop that did the read/write of the 3 paged registers. Also, remove the need for the 'got1' local variable by just returning 'IRQ_NONE' if there are not interrupts pending. 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>
-rw-r--r--drivers/staging/comedi/drivers/pcmmio.c39
1 files changed, 8 insertions, 31 deletions
diff --git a/drivers/staging/comedi/drivers/pcmmio.c b/drivers/staging/comedi/drivers/pcmmio.c
index 5543ac959c94..850a6d03ef60 100644
--- a/drivers/staging/comedi/drivers/pcmmio.c
+++ b/drivers/staging/comedi/drivers/pcmmio.c
@@ -359,38 +359,17 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d)
struct comedi_device *dev = d;
struct pcmmio_private *devpriv = dev->private;
struct comedi_subdevice *s = dev->read_subdev;
- unsigned triggered = 0;
- int got1 = 0;
- unsigned long flags;
+ unsigned int triggered;
unsigned char int_pend;
- spin_lock_irqsave(&devpriv->pagelock, flags);
-
- int_pend = inb(dev->iobase + PCMMIO_INT_PENDING_REG);
- int_pend &= 0x07;
-
- if (int_pend) {
- int port;
- for (port = 0; port < INTR_PORTS_PER_ASIC; ++port) {
- if (int_pend & (0x1 << port)) {
- unsigned char io_lines_with_edges = 0;
- switch_page(dev, PCMMIO_PAGE_INT_ID);
- io_lines_with_edges = inb(dev->iobase +
- PCMMIO_PAGE_REG(port));
-
- /* clear pending interrupt */
- if (io_lines_with_edges)
- outb(0, dev->iobase +
- PCMMIO_PAGE_REG(port));
-
- triggered |= io_lines_with_edges << port * 8;
- }
- }
-
- ++got1;
- }
+ /* are there any interrupts pending */
+ int_pend = inb(dev->iobase + PCMMIO_INT_PENDING_REG) & 0x07;
+ if (!int_pend)
+ return IRQ_NONE;
- spin_unlock_irqrestore(&devpriv->pagelock, flags);
+ /* get, and clear, the pending interrupts */
+ triggered = pcmmio_dio_read(dev, PCMMIO_PAGE_INT_ID, 0);
+ pcmmio_dio_write(dev, 0, PCMMIO_PAGE_INT_ID, 0);
if (triggered) {
/* TODO here: dispatch io lines to subdevs with commands */
@@ -444,8 +423,6 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d)
comedi_event(dev, s);
}
- if (!got1)
- return IRQ_NONE; /* interrupt from other source */
return IRQ_HANDLED;
}