summaryrefslogtreecommitdiff
path: root/drivers/staging/comedi/drivers/addi_apci_3xxx.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-08-12 15:14:18 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-08-12 15:14:18 -0700
commit3457bfd6dfb38f7bb66a227fe3473bad4773de06 (patch)
tree3db9558ade443c7f344fa46219f5ecf384499ab8 /drivers/staging/comedi/drivers/addi_apci_3xxx.c
parent96256460487387d28b8398033928e06eb9e428f7 (diff)
Revert "staging: comedi: drivers: use comedi_dio_insn_config() for complex cases"
This reverts commit f21c53945cb95f66faa9636af5f23cb00ba73019. I applied the wrong patch :( Cc: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/drivers/addi_apci_3xxx.c')
-rw-r--r--drivers/staging/comedi/drivers/addi_apci_3xxx.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/drivers/staging/comedi/drivers/addi_apci_3xxx.c b/drivers/staging/comedi/drivers/addi_apci_3xxx.c
index cf5dd10eaf91..dbc0678027ca 100644
--- a/drivers/staging/comedi/drivers/addi_apci_3xxx.c
+++ b/drivers/staging/comedi/drivers/addi_apci_3xxx.c
@@ -686,28 +686,38 @@ static int apci3xxx_dio_insn_config(struct comedi_device *dev,
unsigned int *data)
{
unsigned int chan = CR_CHAN(insn->chanspec);
- unsigned int mask;
- int ret;
+ unsigned int mask = 1 << chan;
+ unsigned int bits;
/*
* Port 0 (channels 0-7) are always inputs
* Port 1 (channels 8-15) are always outputs
* Port 2 (channels 16-23) are programmable i/o
+ *
+ * Changing any channel in port 2 changes the entire port.
*/
- if (chan < 16) {
- if (data[0] != INSN_CONFIG_DIO_QUERY)
- return -EINVAL;
- } else {
- /* changing any channel in port 2 changes the entire port */
- mask = 0xff0000;
+ if (mask & 0xff0000)
+ bits = 0xff0000;
+ else
+ bits = 0;
+
+ switch (data[0]) {
+ case INSN_CONFIG_DIO_INPUT:
+ s->io_bits &= ~bits;
+ break;
+ case INSN_CONFIG_DIO_OUTPUT:
+ s->io_bits |= bits;
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ default:
+ return -EINVAL;
}
- ret = comedi_dio_insn_config(dev, s, insn, data, mask);
- if (ret)
- return ret;
-
/* update port 2 configuration */
- outl((s->io_bits >> 24) & 0xff, dev->iobase + 224);
+ if (bits)
+ outl((s->io_bits >> 24) & 0xff, dev->iobase + 224);
return insn->n;
}