aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/comedi/drivers/ni_65xx.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/drivers/staging/comedi/drivers/ni_65xx.c b/drivers/staging/comedi/drivers/ni_65xx.c
index a6d5fde428d6..3e25e4e67c7f 100644
--- a/drivers/staging/comedi/drivers/ni_65xx.c
+++ b/drivers/staging/comedi/drivers/ni_65xx.c
@@ -362,19 +362,13 @@ static int ni_65xx_dio_insn_bits(struct comedi_device *dev,
struct comedi_insn *insn,
unsigned int *data)
{
- const struct ni_65xx_board *board = comedi_board(dev);
struct ni_65xx_private *devpriv = dev->private;
unsigned long base_port = (unsigned long)s->private;
unsigned int base_chan = CR_CHAN(insn->chanspec);
int last_port_offset = NI_65XX_CHAN_TO_PORT(s->n_chan - 1);
- unsigned invert = 0x00;
unsigned read_bits = 0;
int port_offset;
- /* handle inverted outputs if necessary */
- if (s->type == COMEDI_SUBD_DO && board->invert_outputs)
- invert = 0xff;
-
for (port_offset = NI_65XX_CHAN_TO_PORT(base_chan);
port_offset <= last_port_offset; port_offset++) {
unsigned port = base_port + port_offset;
@@ -399,16 +393,16 @@ static int ni_65xx_dio_insn_bits(struct comedi_device *dev,
/* update the outputs */
if (port_mask) {
bits = readb(devpriv->mmio + NI_65XX_IO_DATA_REG(port));
- bits ^= invert;
+ bits ^= s->io_bits; /* invert if necessary */
bits &= ~port_mask;
bits |= (port_data & port_mask);
- bits ^= invert;
+ bits ^= s->io_bits; /* invert back */
writeb(bits, devpriv->mmio + NI_65XX_IO_DATA_REG(port));
}
/* read back the actual state */
bits = readb(devpriv->mmio + NI_65XX_IO_DATA_REG(port));
- bits ^= invert;
+ bits ^= s->io_bits; /* invert if necessary */
if (bitshift > 0)
bits <<= bitshift;
else
@@ -662,6 +656,9 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
/* the output ports always start after the input ports */
s->private = (void *)(unsigned long)board->num_di_ports;
+
+ /* use the io_bits to handle the inverted outputs */
+ s->io_bits = (board->invert_outputs) ? 0xff : 0x00;
} else {
s->type = COMEDI_SUBD_UNUSED;
}