diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2014-11-10 16:20:14 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-11-26 15:31:33 -0800 |
commit | 3a2cf2f971b7128b1daff50abbd88c766b458544 (patch) | |
tree | c08f0ecc5e99026b71d46271077aac5e56a7998e /drivers/staging/comedi/drivers/addi_apci_1564.c | |
parent | 6cf8ea2ebfb4421927cd7f1c66247d6980b5ac4c (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.c | 44 |
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)); + } } } |