On 2012/11/08 03:42 PM, Ian Abbott wrote: > In the interrupt service routine, check the device is asserting the > shared interrupt line and check that interrupts have been enabled. > > When attaching the device, disable interrupts before setting up the > interrupt handler to avoid handling spurious interrupts before the > device is ready. > > Signed-off-by: Ian Abbott <abbotti@xxxxxxxxx> > --- > drivers/staging/comedi/drivers/addi_apci_1032.c | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/drivers/staging/comedi/drivers/addi_apci_1032.c b/drivers/staging/comedi/drivers/addi_apci_1032.c > index 14b5989..2b2b0f5 100644 > --- a/drivers/staging/comedi/drivers/addi_apci_1032.c > +++ b/drivers/staging/comedi/drivers/addi_apci_1032.c > @@ -31,6 +31,7 @@ > > #include "../comedidev.h" > #include "comedi_fc.h" > +#include "amcc_s5933.h" > > /* > * I/O Register Map > @@ -45,6 +46,7 @@ > #define APCI1032_CTRL_INT_ENA (1 << 2) > > struct apci1032_private { > + unsigned long amcc_iobase; /* base of AMCC I/O registers */ > unsigned int mode1; /* rising-edge/high level channels */ > unsigned int mode2; /* falling-edge/low level channels */ > unsigned int ctrl; /* interrupt mode OR (edge) . AND (level) */ > @@ -218,11 +220,21 @@ static int apci1032_cos_cancel(struct comedi_device *dev, > static irqreturn_t apci1032_interrupt(int irq, void *d) > { > struct comedi_device *dev = d; > + struct apci1032_private *devpriv = dev->private; > struct comedi_subdevice *s = dev->read_subdev; > unsigned int ctrl; > > - /* disable the interrupt */ > + /* check interrupt is from this device */ > + if ((inl(devpriv->amcc_iobase + AMCC_OP_REG_INTCSR) & > + INTCSR_INTR_ASSERTED) == 0) > + return IRQ_NONE; > + > + /* check interrupt is enabled */ > ctrl = inl(dev->iobase + APCI1032_CTRL_REG); > + if ((ctrl & APCI1032_CTRL_INT_ENA) == 0) > + return IRQ_HANDLED; > + > + /* disable the interrupt */ > outl(ctrl & ~APCI1032_CTRL_INT_ENA, dev->iobase + APCI1032_CTRL_REG); > > s->state = inl(dev->iobase + APCI1032_STATUS_REG) & 0xffff; > @@ -265,7 +277,9 @@ static int __devinit apci1032_auto_attach(struct comedi_device *dev, > if (ret) > return ret; > > + devpriv->amcc_iobase = pci_resource_start(pcidev, 0); > dev->iobase = pci_resource_start(pcidev, 2); > + apci1032_reset(dev); > > if (pcidev->irq > 0) { > ret = request_irq(pcidev->irq, apci1032_interrupt, IRQF_SHARED, > @@ -305,7 +319,6 @@ static int __devinit apci1032_auto_attach(struct comedi_device *dev, > s->type = COMEDI_SUBD_UNUSED; > } > > - apci1032_reset(dev); > return 0; > } > > This patch will probably not apply, or Hartley's earlier corrective patch won't apply, depending on which one gets applied first. Hartley's corrective patch sets: dev->iobase = pci_resource_start(pcidev, 1); which is correct. -- -=( Ian Abbott @ MEV Ltd. E-mail: <abbotti@xxxxxxxxx> )=- -=( Tel: +44 (0)161 477 1898 FAX: +44 (0)161 718 3587 )=- _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel