staging: comedi: comedi_fc: introduce cfc_check_trigger_src
authorH Hartley Sweeten <hartleys@visionengravers.com>
Tue, 11 Sep 2012 17:47:08 +0000 (10:47 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 11 Sep 2012 19:11:04 +0000 (12:11 -0700)
All of the comedi drivers that support the 'cmd' callback also
require a 'do_cmdtest' callback. The do_cmdtest validates the
comedi_cmd before it is executed.

"Step 1" of each do_cmdtest does a trivial validation of the
trigger sources by doing something like this for each trigger:

int err = 0;
unsigned int tmp;

tmp = cmd->start_src;
src &= TRIG_NOW;
if (!src || tmp != src)
err++;
/* Test the remaining triggers similarly */

if (err)
return 1;

Introduce a helper function in comedi_fc to handle this boilerplate.
The drivers can then just do:

err |= cfc_check_trigger_src(&cmd->start_src, TRIG_NOW);
/* Test the remaining triggers similarly */

if (err)
return 1;

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

index 4b2cfd3279951c946378da1d503e6efb34a4a354..1f083917188734c9da7581504373f8b618ee1ae9 100644 (file)
@@ -73,4 +73,24 @@ static inline unsigned int cfc_bytes_per_scan(struct comedi_subdevice *subd)
        return num_samples * bytes_per_sample(subd);
 }
 
+/**
+ * cfc_check_trigger_src() - trivially validate a comedi_cmd trigger source
+ * @src: pointer to the trigger source to validate
+ * @flags: bitmask of valid TRIG_* for the trigger
+ *
+ * This is used in "step 1" of the do_cmdtest functions of comedi drivers
+ * to vaildate the comedi_cmd triggers. The mask of the @src against the
+ * @flags allows the userspace comedilib to pass all the comedi_cmd
+ * triggers as TRIG_ANY and get back a bitmask of the valid trigger sources.
+ */
+static inline int cfc_check_trigger_src(unsigned int *src, unsigned int flags)
+{
+       unsigned int orig_src = *src;
+
+       *src = orig_src & flags;
+       if (*src == TRIG_INVALID || *src != orig_src)
+               return -EINVAL;
+       return 0;
+}
+
 #endif /* _COMEDI_FC_H */