pcl818: Fix write instruction for AO subdevice
authorIan Abbott <abbotti@mev.co.uk>
Tue, 20 Mar 2012 14:40:57 +0000 (14:40 +0000)
committerIan Abbott <abbotti@mev.co.uk>
Fri, 23 Mar 2012 14:11:45 +0000 (14:11 +0000)
Max Korovkin reported that analog output was not working on Advantech
PCI818L and found the cause to be an operator precedence error in
pcl818_ao_insn_write().  The effect of the bug was that the function
wrote to absolute I/O port addresses 6 and 7 (part of the ISA DMA
controller) instead of the port addresses assigned to the board.

The same bug was reported by Kudlaty on 2010-11-25, but was not
investigated further at the time.

The same bug was already fixed by Roel Kluin in the "staging" version of
this driver in the 2.6.31 kernel back in May 2009 (commit
f764df88f86c8db669bd7bfac230b9d2689ae322 in Linus's linux-2.6 git
repository).

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
comedi/drivers/pcl818.c

index fe0166cc9255f8e9bdb5724b896f781e5ed9e066..ef8e10298636b19542df1ef6d1135aa287e1c069 100644 (file)
@@ -456,9 +456,9 @@ static int pcl818_ao_insn_write(comedi_device * dev, comedi_subdevice * s,
        for (n = 0; n < insn->n; n++) {
                devpriv->ao_readback[chan] = data[n];
                outb((data[n] & 0x000f) << 4, dev->iobase +
-                       (chan) ? PCL718_DA2_LO : PCL818_DA_LO);
+                       (chan ? PCL718_DA2_LO : PCL818_DA_LO));
                outb((data[n] & 0x0ff0) >> 4, dev->iobase +
-                       (chan) ? PCL718_DA2_HI : PCL818_DA_HI);
+                       (chan ? PCL718_DA2_HI : PCL818_DA_HI));
        }
 
        return n;