summaryrefslogtreecommitdiff
path: root/drivers/staging/comedi/drivers/addi_apci_1564.c
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2014-11-10 16:20:14 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-11-26 15:31:33 -0800
commit3a2cf2f971b7128b1daff50abbd88c766b458544 (patch)
treec08f0ecc5e99026b71d46271077aac5e56a7998e /drivers/staging/comedi/drivers/addi_apci_1564.c
parent6cf8ea2ebfb4421927cd7f1c66247d6980b5ac4c (diff)
staging: comedi: addi_apci_1564: fix counter code in main driver source
The Rev 1.0 APCI-1564 boards do not have counters. Fix the code in the main driver source so that the I/O accesses to the counters do not happen if the devpriv->counters member is not initialized. This does not fix the code in hwdrv_apci1564.c. That code violates the comedi API and is currently broken. 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>
Diffstat (limited to 'drivers/staging/comedi/drivers/addi_apci_1564.c')
-rw-r--r--drivers/staging/comedi/drivers/addi_apci_1564.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/drivers/staging/comedi/drivers/addi_apci_1564.c b/drivers/staging/comedi/drivers/addi_apci_1564.c
index b74e6c62eb24..3fb9cc06973d 100644
--- a/drivers/staging/comedi/drivers/addi_apci_1564.c
+++ b/drivers/staging/comedi/drivers/addi_apci_1564.c
@@ -141,10 +141,12 @@ static int apci1564_reset(struct comedi_device *dev)
outl(0x0, devpriv->timer + APCI1564_TIMER_CTRL_REG);
outl(0x0, devpriv->timer + APCI1564_TIMER_RELOAD_REG);
- /* Reset the counter registers */
- outl(0x0, devpriv->counters + APCI1564_COUNTER_CTRL_REG(0));
- outl(0x0, devpriv->counters + APCI1564_COUNTER_CTRL_REG(1));
- outl(0x0, devpriv->counters + APCI1564_COUNTER_CTRL_REG(2));
+ if (devpriv->counters) {
+ /* Reset the counter registers */
+ outl(0x0, devpriv->counters + APCI1564_COUNTER_CTRL_REG(0));
+ outl(0x0, devpriv->counters + APCI1564_COUNTER_CTRL_REG(1));
+ outl(0x0, devpriv->counters + APCI1564_COUNTER_CTRL_REG(2));
+ }
return 0;
}
@@ -186,22 +188,24 @@ static irqreturn_t apci1564_interrupt(int irq, void *d)
outl(ctrl, devpriv->timer + APCI1564_TIMER_CTRL_REG);
}
- for (chan = 0; chan < 4; chan++) {
- status = inl(devpriv->counters +
- APCI1564_COUNTER_IRQ_REG(chan));
- if (status & 0x01) {
- /* Disable Counter Interrupt */
- ctrl = inl(devpriv->counters +
- APCI1564_COUNTER_CTRL_REG(chan));
- outl(0x0, devpriv->counters +
- APCI1564_COUNTER_CTRL_REG(chan));
-
- /* Send a signal to from kernel to user space */
- send_sig(SIGIO, devpriv->tsk_current, 0);
-
- /* Enable Counter Interrupt */
- outl(ctrl, devpriv->counters +
- APCI1564_COUNTER_CTRL_REG(chan));
+ if (devpriv->counters) {
+ for (chan = 0; chan < 4; chan++) {
+ status = inl(devpriv->counters +
+ APCI1564_COUNTER_IRQ_REG(chan));
+ if (status & 0x01) {
+ /* Disable Counter Interrupt */
+ ctrl = inl(devpriv->counters +
+ APCI1564_COUNTER_CTRL_REG(chan));
+ outl(0x0, devpriv->counters +
+ APCI1564_COUNTER_CTRL_REG(chan));
+
+ /* Send a signal to from kernel to user space */
+ send_sig(SIGIO, devpriv->tsk_current, 0);
+
+ /* Enable Counter Interrupt */
+ outl(ctrl, devpriv->counters +
+ APCI1564_COUNTER_CTRL_REG(chan));
+ }
}
}