]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/staging/comedi/drivers/8255.c
Merge branch 'next' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[karo-tx-linux.git] / drivers / staging / comedi / drivers / 8255.c
index 94e17500150f5fad2ac14e3fcb6e3a7cd3752557..2f070fdbbb1d3b206b6e17f5f10bea0ec6e3a02a 100644 (file)
@@ -73,10 +73,9 @@ I/O port base address can be found in the output of 'lspci -v'.
    will copy the latched value to a Comedi buffer.
  */
 
+#include <linux/module.h>
 #include "../comedidev.h"
 
-#include <linux/ioport.h>
-
 #include "comedi_fc.h"
 #include "8255.h"
 
@@ -185,39 +184,29 @@ static void subdev_8255_do_config(struct comedi_device *dev,
 
 static int subdev_8255_insn_config(struct comedi_device *dev,
                                   struct comedi_subdevice *s,
-                                  struct comedi_insn *insn, unsigned int *data)
+                                  struct comedi_insn *insn,
+                                  unsigned int *data)
 {
+       unsigned int chan = CR_CHAN(insn->chanspec);
        unsigned int mask;
-       unsigned int bits;
+       int ret;
 
-       mask = 1 << CR_CHAN(insn->chanspec);
-       if (mask & 0x0000ff)
-               bits = 0x0000ff;
-       else if (mask & 0x00ff00)
-               bits = 0x00ff00;
-       else if (mask & 0x0f0000)
-               bits = 0x0f0000;
+       if (chan < 8)
+               mask = 0x0000ff;
+       else if (chan < 16)
+               mask = 0x00ff00;
+       else if (chan < 20)
+               mask = 0x0f0000;
        else
-               bits = 0xf00000;
-
-       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;
-               break;
-       default:
-               return -EINVAL;
-       }
+               mask = 0xf00000;
+
+       ret = comedi_dio_insn_config(dev, s, insn, data, mask);
+       if (ret)
+               return ret;
 
        subdev_8255_do_config(dev, s);
 
-       return 1;
+       return insn->n;
 }
 
 static int subdev_8255_cmdtest(struct comedi_device *dev,