staging: comedi: pcmmio: tidy up the irq request
The for () loop that does the request_irq() in this driver is a bit of an overkill. The code appears to have been copied from the pcmuio driver which supports boards with 1 or 2 ASIC devices. The board supported by this driver only has 1 ASIC. Simplify the code and store the irq number in the comedi_device. This allows the core to automatically do the free_irq() when the driver is detached. 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>
This commit is contained in:
parent
5d4997bbfa
commit
6e6bed0b52
1 changed files with 7 additions and 30 deletions
|
@ -276,7 +276,6 @@ struct pcmmio_private {
|
||||||
unsigned char enab[NUM_PAGED_REGS];
|
unsigned char enab[NUM_PAGED_REGS];
|
||||||
int num;
|
int num;
|
||||||
unsigned long iobase;
|
unsigned long iobase;
|
||||||
unsigned int irq;
|
|
||||||
spinlock_t spinlock;
|
spinlock_t spinlock;
|
||||||
} asics[MAX_ASICS];
|
} asics[MAX_ASICS];
|
||||||
struct pcmmio_subdev_private *sprivs;
|
struct pcmmio_subdev_private *sprivs;
|
||||||
|
@ -440,7 +439,7 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (asic = 0; asic < MAX_ASICS; ++asic) {
|
for (asic = 0; asic < MAX_ASICS; ++asic) {
|
||||||
if (irq == devpriv->asics[asic].irq) {
|
if (irq == dev->irq) {
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned triggered = 0;
|
unsigned triggered = 0;
|
||||||
unsigned long iobase = devpriv->asics[asic].iobase;
|
unsigned long iobase = devpriv->asics[asic].iobase;
|
||||||
|
@ -964,11 +963,8 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
||||||
struct comedi_subdevice *s;
|
struct comedi_subdevice *s;
|
||||||
int sdev_no, chans_left, n_dio_subdevs, n_subdevs, port, asic,
|
int sdev_no, chans_left, n_dio_subdevs, n_subdevs, port, asic,
|
||||||
thisasic_chanct = 0;
|
thisasic_chanct = 0;
|
||||||
unsigned int irq[MAX_ASICS];
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
irq[0] = it->options[1];
|
|
||||||
|
|
||||||
ret = comedi_request_region(dev, it->options[0], 32);
|
ret = comedi_request_region(dev, it->options[0], 32);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -981,11 +977,6 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
||||||
devpriv->asics[asic].num = asic;
|
devpriv->asics[asic].num = asic;
|
||||||
devpriv->asics[asic].iobase =
|
devpriv->asics[asic].iobase =
|
||||||
dev->iobase + 16 + asic * ASIC_IOSIZE;
|
dev->iobase + 16 + asic * ASIC_IOSIZE;
|
||||||
/*
|
|
||||||
* this gets actually set at the end of this function when we
|
|
||||||
* request_irqs
|
|
||||||
*/
|
|
||||||
devpriv->asics[asic].irq = 0;
|
|
||||||
spin_lock_init(&devpriv->asics[asic].spinlock);
|
spin_lock_init(&devpriv->asics[asic].spinlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1102,19 +1093,11 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
||||||
|
|
||||||
init_asics(dev); /* clear out all the registers, basically */
|
init_asics(dev); /* clear out all the registers, basically */
|
||||||
|
|
||||||
for (asic = 0; irq[0] && asic < MAX_ASICS; ++asic) {
|
if (it->options[1]) {
|
||||||
if (irq[asic]
|
ret = request_irq(it->options[1], interrupt_pcmmio, 0,
|
||||||
&& request_irq(irq[asic], interrupt_pcmmio,
|
dev->board_name, dev);
|
||||||
IRQF_SHARED, dev->board_name, dev)) {
|
if (ret == 0)
|
||||||
int i;
|
dev->irq = it->options[1];
|
||||||
/* unroll the allocated irqs.. */
|
|
||||||
for (i = asic - 1; i >= 0; --i) {
|
|
||||||
free_irq(irq[i], dev);
|
|
||||||
devpriv->asics[i].irq = irq[i] = 0;
|
|
||||||
}
|
|
||||||
irq[asic] = 0;
|
|
||||||
}
|
|
||||||
devpriv->asics[asic].irq = irq[asic];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1123,15 +1106,9 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
||||||
static void pcmmio_detach(struct comedi_device *dev)
|
static void pcmmio_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct pcmmio_private *devpriv = dev->private;
|
struct pcmmio_private *devpriv = dev->private;
|
||||||
int i;
|
|
||||||
|
|
||||||
if (devpriv) {
|
if (devpriv)
|
||||||
for (i = 0; i < MAX_ASICS; ++i) {
|
|
||||||
if (devpriv->asics[i].irq)
|
|
||||||
free_irq(devpriv->asics[i].irq, dev);
|
|
||||||
}
|
|
||||||
kfree(devpriv->sprivs);
|
kfree(devpriv->sprivs);
|
||||||
}
|
|
||||||
comedi_legacy_detach(dev);
|
comedi_legacy_detach(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue