Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b3e33cd3 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

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: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 33998d67
Loading
Loading
Loading
Loading
+32 −13
Original line number Diff line number Diff line
@@ -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)
	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 */