summaryrefslogtreecommitdiff
path: root/drivers/staging/comedi/drivers/ni_65xx.c
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2014-07-14 12:06:58 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-07-16 13:22:50 -0700
commitb3e33cd3f83fcb4415a1014a1c8b11c621900ae8 (patch)
tree7332db3a9d13d087848934922f8e4912164776e7 /drivers/staging/comedi/drivers/ni_65xx.c
parent33998d67d5269430f8a52c719817f9e47fef47b0 (diff)
staging: comedi: ni_65xx: fix ni_65xx_intr_insn_config()
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>
Diffstat (limited to 'drivers/staging/comedi/drivers/ni_65xx.c')
-rw-r--r--drivers/staging/comedi/drivers/ni_65xx.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/drivers/staging/comedi/drivers/ni_65xx.c b/drivers/staging/comedi/drivers/ni_65xx.c
index 517dbc6f7395..742d3cdcd898 100644
--- a/drivers/staging/comedi/drivers/ni_65xx.c
+++ b/drivers/staging/comedi/drivers/ni_65xx.c
@@ -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 */