aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/comedi/drivers/ni_6527.c
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-10-01 15:10:41 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-10-03 14:09:53 -0700
commitc6d9681b40e6dde9f8cbd922efff1f4d5433adc6 (patch)
tree722c1cd51e05f142a1e0ba074d84e0f281ab6348 /drivers/staging/comedi/drivers/ni_6527.c
parentstaging: comedi: ni_6527: factor out the code that sets the filter enables (diff)
downloadlinux-dev-c6d9681b40e6dde9f8cbd922efff1f4d5433adc6.tar.xz
linux-dev-c6d9681b40e6dde9f8cbd922efff1f4d5433adc6.zip
staging: comedi: ni_6527: tidy up ni6527_di_insn_config()
The core will validate the insn->n value based on the actual instruction (data[0]) that is being handled. Remove the sanity check and change the instruction handling into a switch. This follows the normal format for (*insn_config) functions and make adding additional instructions easier. 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_6527.c')
-rw-r--r--drivers/staging/comedi/drivers/ni_6527.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/staging/comedi/drivers/ni_6527.c b/drivers/staging/comedi/drivers/ni_6527.c
index dc22f9f45749..65a1ba96fbab 100644
--- a/drivers/staging/comedi/drivers/ni_6527.c
+++ b/drivers/staging/comedi/drivers/ni_6527.c
@@ -123,32 +123,36 @@ static void ni6527_set_filter_enable(struct comedi_device *dev,
static int ni6527_di_insn_config(struct comedi_device *dev,
struct comedi_subdevice *s,
- struct comedi_insn *insn, unsigned int *data)
+ struct comedi_insn *insn,
+ unsigned int *data)
{
struct ni6527_private *devpriv = dev->private;
- int chan = CR_CHAN(insn->chanspec);
+ unsigned int chan = CR_CHAN(insn->chanspec);
unsigned int interval;
- if (insn->n != 2)
- return -EINVAL;
-
- if (data[0] != INSN_CONFIG_FILTER)
- return -EINVAL;
-
- if (data[1]) {
+ switch (data[0]) {
+ case INSN_CONFIG_FILTER:
+ /*
+ * The deglitch filter interval is specified in nanoseconds.
+ * The hardware supports intervals in 200ns increments. Round
+ * the user values up and return the actual interval.
+ */
interval = (data[1] + 100) / 200;
data[1] = interval * 200;
- ni6527_set_filter_interval(dev, interval);
-
- devpriv->filter_enable |= 1 << chan;
- } else {
- devpriv->filter_enable &= ~(1 << chan);
+ if (interval) {
+ ni6527_set_filter_interval(dev, interval);
+ devpriv->filter_enable |= 1 << chan;
+ } else {
+ devpriv->filter_enable &= ~(1 << chan);
+ }
+ ni6527_set_filter_enable(dev, devpriv->filter_enable);
+ break;
+ default:
+ return -EINVAL;
}
- ni6527_set_filter_enable(dev, devpriv->filter_enable);
-
- return 2;
+ return insn->n;
}
static int ni6527_di_insn_bits(struct comedi_device *dev,