mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-04 18:19:28 +09:00
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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6cf8ea2ebf
commit
3a2cf2f971
@@ -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));
|
||||
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);
|
||||
/* 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));
|
||||
/* Enable Counter Interrupt */
|
||||
outl(ctrl, devpriv->counters +
|
||||
APCI1564_COUNTER_CTRL_REG(chan));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user