Revert "staging: comedi: drivers: use comedi_dio_insn_config() for complex cases"
[firefly-linux-kernel-4.4.55.git] / drivers / staging / comedi / drivers / me_daq.c
index a6f6d4a46587f06d1b84ba53a45df3ebcf150821..e8a743c2f9a166a160ab50f09f9b8f0870a96f60 100644 (file)
@@ -186,30 +186,38 @@ static int me_dio_insn_config(struct comedi_device *dev,
                              struct comedi_insn *insn,
                              unsigned int *data)
 {
-       struct me_private_data *devpriv = dev->private;
-       unsigned int chan = CR_CHAN(insn->chanspec);
-       unsigned int mask;
-       int ret;
-
-       if (chan < 16)
-               mask = 0x0000ffff;
-       else
-               mask = 0xffff0000;
+       struct me_private_data *dev_private = dev->private;
+       unsigned int mask = 1 << CR_CHAN(insn->chanspec);
+       unsigned int bits;
+       unsigned int port;
 
-       ret = comedi_dio_insn_config(dev, s, insn, data, mask);
-       if (ret)
-               return ret;
+       if (mask & 0x0000ffff) {
+               bits = 0x0000ffff;
+               port = ENABLE_PORT_A;
+       } else {
+               bits = 0xffff0000;
+               port = ENABLE_PORT_B;
+       }
 
-       if (s->io_bits & 0x0000ffff)
-               devpriv->control_2 |= ENABLE_PORT_A;
-       else
-               devpriv->control_2 &= ~ENABLE_PORT_A;
-       if (s->io_bits & 0xffff0000)
-               devpriv->control_2 |= ENABLE_PORT_B;
-       else
-               devpriv->control_2 &= ~ENABLE_PORT_B;
+       switch (data[0]) {
+       case INSN_CONFIG_DIO_INPUT:
+               s->io_bits &= ~bits;
+               dev_private->control_2 &= ~port;
+               break;
+       case INSN_CONFIG_DIO_OUTPUT:
+               s->io_bits |= bits;
+               dev_private->control_2 |= port;
+               break;
+       case INSN_CONFIG_DIO_QUERY:
+               data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT;
+               return insn->n;
+               break;
+       default:
+               return -EINVAL;
+       }
 
-       writew(devpriv->control_2, devpriv->me_regbase + ME_CONTROL_2);
+       /* Update the port configuration */
+       writew(dev_private->control_2, dev_private->me_regbase + ME_CONTROL_2);
 
        return insn->n;
 }