staging: comedi: drivers: use comedi_dio_insn_config() for complex cases
[firefly-linux-kernel-4.4.55.git] / drivers / staging / comedi / drivers / dt3000.c
index e4748da1993b8dc13cab8176616f4583c6491a31..64ef87598b607deffe7b9a11999c753defbce126 100644 (file)
@@ -642,32 +642,23 @@ static void dt3k_dio_config(struct comedi_device *dev, int bits)
 
 static int dt3k_dio_insn_config(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       int mask;
-
-       mask = (CR_CHAN(insn->chanspec) < 4) ? 0x0f : 0xf0;
-
-       switch (data[0]) {
-       case INSN_CONFIG_DIO_OUTPUT:
-               s->io_bits |= mask;
-               break;
-       case INSN_CONFIG_DIO_INPUT:
-               s->io_bits &= ~mask;
-               break;
-       case INSN_CONFIG_DIO_QUERY:
-               data[1] =
-                   (s->
-                    io_bits & (1 << CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT :
-                   COMEDI_INPUT;
-               return insn->n;
-               break;
-       default:
-               return -EINVAL;
-               break;
-       }
-       mask = (s->io_bits & 0x01) | ((s->io_bits & 0x10) >> 3);
-       dt3k_dio_config(dev, mask);
+       unsigned int chan = CR_CHAN(insn->chanspec);
+       unsigned int mask;
+       int ret;
+
+       if (chan < 4)
+               mask = 0x0f;
+       else
+               mask = 0xf0;
+
+       ret = comedi_dio_insn_config(dev, s, insn, data, mask);
+       if (ret)
+               return ret;
+
+       dt3k_dio_config(dev, (s->io_bits & 0x01) | ((s->io_bits & 0x10) >> 3));
 
        return insn->n;
 }