On the PCI-1720 board, bipolar analog output ranges use two's complement data. Use comedi_offset_munge() to munge the comedi offset binary values before writing them to the hardware. Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx> Cc: Ian Abbott <abbotti@xxxxxxxxx> Cc: Greg Kroah-Hartman <gregk@xxxxxxxxxxxxxxxxxxx> --- drivers/staging/comedi/drivers/adv_pci1710.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c b/drivers/staging/comedi/drivers/adv_pci1710.c index cb3edf9..c2c5b34 100644 --- a/drivers/staging/comedi/drivers/adv_pci1710.c +++ b/drivers/staging/comedi/drivers/adv_pci1710.c @@ -682,26 +682,30 @@ static int pci1720_insn_write_ao(struct comedi_device *dev, struct comedi_insn *insn, unsigned int *data) { struct pci1710_private *devpriv = dev->private; + unsigned int chan = CR_CHAN(insn->chanspec); + unsigned int range = CR_RANGE(insn->chanspec); unsigned int val; - int n, rangereg, chan; + int n, rangereg; - chan = CR_CHAN(insn->chanspec); rangereg = devpriv->da_ranges & (~(0x03 << (chan << 1))); - rangereg |= (CR_RANGE(insn->chanspec) << (chan << 1)); + rangereg |= (range << (chan << 1)); if (rangereg != devpriv->da_ranges) { outb(rangereg, dev->iobase + PCI1720_RANGE); devpriv->da_ranges = rangereg; } - val = devpriv->ao_data[chan]; for (n = 0; n < insn->n; n++) { val = data[n]; + devpriv->ao_data[chan] = val; + + /* bipolar codes are two's complement values */ + if (comedi_range_is_bipolar(s, range)) + val = comedi_offset_munge(s, val); + outw(val, dev->iobase + PCI1720_DA0 + (chan << 1)); outb(0, dev->iobase + PCI1720_SYNCOUT); /* update outputs */ } - devpriv->ao_data[chan] = val; - return n; } -- 1.9.3 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel