Revert "staging: comedi: drivers: use comedi_dio_insn_config() for complex cases"
[firefly-linux-kernel-4.4.55.git] / drivers / staging / comedi / drivers / pcm3724.c
index cc1dc7f66e5b5868d4c717b352a9e54e8785c149..cca972ebd010edb604a07986113a48b4af02ffd7 100644 (file)
@@ -184,30 +184,39 @@ static void enable_chan(struct comedi_device *dev, struct comedi_subdevice *s,
 /* overriding the 8255 insn config */
 static int subdev_3724_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;
-       int ret;
-
-       if (chan < 8)
-               mask = 0x0000ff;
-       else if (chan < 16)
-               mask = 0x00ff00;
-       else if (chan < 20)
-               mask = 0x0f0000;
+       unsigned int bits;
+
+       mask = 1 << CR_CHAN(insn->chanspec);
+       if (mask & 0x0000ff)
+               bits = 0x0000ff;
+       else if (mask & 0x00ff00)
+               bits = 0x00ff00;
+       else if (mask & 0x0f0000)
+               bits = 0x0f0000;
        else
-               mask = 0xf00000;
-
-       ret = comedi_dio_insn_config(dev, s, insn, data, mask);
-       if (ret)
-               return ret;
+               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;
+       }
 
        do_3724_config(dev, s, insn->chanspec);
        enable_chan(dev, s, insn->chanspec);
-
-       return insn->n;
+       return 1;
 }
 
 static int pcm3724_attach(struct comedi_device *dev,