OSDN Git Service

staging: comedi: ni_65xx: fix ni_65xx_intr_insn_config()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Mon, 14 Jul 2014 19:06:58 +0000 (12:06 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 16 Jul 2014 20:22:50 +0000 (13:22 -0700)
Refactor this function to follow the standard (*insn_config) form.

Add a sanity check of the number of data parameters (insn->n). Currently
the core does not check INSN_CONFIG_CHANGE_NOTIFY.

Fix the writes to the rise/fall edge enable registers. The macro expects
a "port" value not the port offset value.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/ni_65xx.c

index 517dbc6..742d3cd 100644 (file)
@@ -508,22 +508,41 @@ static int ni_65xx_intr_insn_config(struct comedi_device *dev,
 {
        struct ni_65xx_private *devpriv = dev->private;
 
-       if (insn->n < 1)
-               return -EINVAL;
-       if (data[0] != INSN_CONFIG_CHANGE_NOTIFY)
-               return -EINVAL;
+       switch (data[0]) {
+       case INSN_CONFIG_CHANGE_NOTIFY:
+               /* add instruction to check_insn_config_length() */
+               if (insn->n != 3)
+                       return -EINVAL;
 
-       writeb(data[1], devpriv->mmio + NI_65XX_RISE_EDGE_ENA_REG(0));
-       writeb(data[1] >> 8, devpriv->mmio + NI_65XX_RISE_EDGE_ENA_REG(0x10));
-       writeb(data[1] >> 16, devpriv->mmio + NI_65XX_RISE_EDGE_ENA_REG(0x20));
-       writeb(data[1] >> 24, devpriv->mmio + NI_65XX_RISE_EDGE_ENA_REG(0x30));
+               /*
+                * This only works for the first 4 ports (32 channels)!
+                */
 
-       writeb(data[2], devpriv->mmio + NI_65XX_FALL_EDGE_ENA_REG(0));
-       writeb(data[2] >> 8, devpriv->mmio + NI_65XX_FALL_EDGE_ENA_REG(0x10));
-       writeb(data[2] >> 16, devpriv->mmio + NI_65XX_FALL_EDGE_ENA_REG(0x20));
-       writeb(data[2] >> 24, devpriv->mmio + NI_65XX_FALL_EDGE_ENA_REG(0x30));
+               /* set the channels to monitor for rising edges */
+               writeb(data[1] & 0xff,
+                      devpriv->mmio + NI_65XX_RISE_EDGE_ENA_REG(0));
+               writeb((data[1] >> 8) & 0xff,
+                      devpriv->mmio + NI_65XX_RISE_EDGE_ENA_REG(1));
+               writeb((data[1] >> 16) & 0xff,
+                      devpriv->mmio + NI_65XX_RISE_EDGE_ENA_REG(2));
+               writeb((data[1] >> 24) & 0xff,
+                      devpriv->mmio + NI_65XX_RISE_EDGE_ENA_REG(3));
+
+               /* set the channels to monitor for falling edges */
+               writeb(data[2] & 0xff,
+                      devpriv->mmio + NI_65XX_FALL_EDGE_ENA_REG(0));
+               writeb((data[2] >> 8) & 0xff,
+                      devpriv->mmio + NI_65XX_FALL_EDGE_ENA_REG(1));
+               writeb((data[2] >> 16) & 0xff,
+                      devpriv->mmio + NI_65XX_FALL_EDGE_ENA_REG(2));
+               writeb((data[2] >> 24) & 0xff,
+                      devpriv->mmio + NI_65XX_FALL_EDGE_ENA_REG(3));
+               break;
+       default:
+               return -EINVAL;
+       }
 
-       return 2;
+       return insn->n;
 }
 
 /* ripped from mite.h and mite_setup2() to avoid mite dependancy */