diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2013-10-01 15:10:41 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-10-03 14:09:53 -0700 |
commit | c6d9681b40e6dde9f8cbd922efff1f4d5433adc6 (patch) | |
tree | 722c1cd51e05f142a1e0ba074d84e0f281ab6348 /drivers/staging/comedi/drivers/ni_6527.c | |
parent | staging: comedi: ni_6527: factor out the code that sets the filter enables (diff) | |
download | linux-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.c | 38 |
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, |