summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-12-09 15:30:51 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-12-17 10:02:12 -0800
commit6e6bed0b523717aa93f08ce8fe679a5c48c81cfd (patch)
treeab8f748ec8ef072a1152d1ff967eae61b5f358dd
parent5d4997bbfa3bb7ed4786bd96bfcc756b02f9551a (diff)
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>
-rw-r--r--drivers/staging/comedi/drivers/pcmmio.c37
1 files changed, 7 insertions, 30 deletions
diff --git a/drivers/staging/comedi/drivers/pcmmio.c b/drivers/staging/comedi/drivers/pcmmio.c
index 39dff77c3655..a31a2b796519 100644
--- a/drivers/staging/comedi/drivers/pcmmio.c
+++ b/drivers/staging/comedi/drivers/pcmmio.c
@@ -276,7 +276,6 @@ struct pcmmio_private {
unsigned char enab[NUM_PAGED_REGS];
int num;
unsigned long iobase;
- unsigned int irq;
spinlock_t spinlock;
} asics[MAX_ASICS];
struct pcmmio_subdev_private *sprivs;
@@ -440,7 +439,7 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d)
int i;
for (asic = 0; asic < MAX_ASICS; ++asic) {
- if (irq == devpriv->asics[asic].irq) {
+ if (irq == dev->irq) {
unsigned long flags;
unsigned triggered = 0;
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;
int sdev_no, chans_left, n_dio_subdevs, n_subdevs, port, asic,
thisasic_chanct = 0;
- unsigned int irq[MAX_ASICS];
int ret;
- irq[0] = it->options[1];
-
ret = comedi_request_region(dev, it->options[0], 32);
if (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].iobase =
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);
}
@@ -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 */
- for (asic = 0; irq[0] && asic < MAX_ASICS; ++asic) {
- if (irq[asic]
- && request_irq(irq[asic], interrupt_pcmmio,
- IRQF_SHARED, dev->board_name, dev)) {
- int i;
- /* 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];
+ if (it->options[1]) {
+ ret = request_irq(it->options[1], interrupt_pcmmio, 0,
+ dev->board_name, dev);
+ if (ret == 0)
+ dev->irq = it->options[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)
{
struct pcmmio_private *devpriv = dev->private;
- int i;
- if (devpriv) {
- for (i = 0; i < MAX_ASICS; ++i) {
- if (devpriv->asics[i].irq)
- free_irq(devpriv->asics[i].irq, dev);
- }
+ if (devpriv)
kfree(devpriv->sprivs);
- }
comedi_legacy_detach(dev);
}