linux/drivers/staging/comedi/drivers/pcm_common.c
<<
>>
Prefs
   1#include "../comedidev.h"
   2#include "pcm_common.h"
   3
   4/*
   5 * 'do_cmdtest' function for an 'INTERRUPT' subdevice.  This is for
   6 * the PCM drivers.
   7 */
   8int comedi_pcm_cmdtest(struct comedi_device *dev,
   9                       struct comedi_subdevice *s, struct comedi_cmd *cmd)
  10{
  11        int err = 0;
  12        unsigned int tmp;
  13
  14        /* step 1: make sure trigger sources are trivially valid */
  15
  16        tmp = cmd->start_src;
  17        cmd->start_src &= (TRIG_NOW | TRIG_INT);
  18        if (!cmd->start_src || tmp != cmd->start_src)
  19                err++;
  20
  21        tmp = cmd->scan_begin_src;
  22        cmd->scan_begin_src &= TRIG_EXT;
  23        if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
  24                err++;
  25
  26        tmp = cmd->convert_src;
  27        cmd->convert_src &= TRIG_NOW;
  28        if (!cmd->convert_src || tmp != cmd->convert_src)
  29                err++;
  30
  31        tmp = cmd->scan_end_src;
  32        cmd->scan_end_src &= TRIG_COUNT;
  33        if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
  34                err++;
  35
  36        tmp = cmd->stop_src;
  37        cmd->stop_src &= (TRIG_COUNT | TRIG_NONE);
  38        if (!cmd->stop_src || tmp != cmd->stop_src)
  39                err++;
  40
  41        if (err)
  42                return 1;
  43
  44        /* step 2: make sure trigger sources are unique and mutually compatible */
  45
  46        /* these tests are true if more than one _src bit is set */
  47        if ((cmd->start_src & (cmd->start_src - 1)) != 0)
  48                err++;
  49        if ((cmd->scan_begin_src & (cmd->scan_begin_src - 1)) != 0)
  50                err++;
  51        if ((cmd->convert_src & (cmd->convert_src - 1)) != 0)
  52                err++;
  53        if ((cmd->scan_end_src & (cmd->scan_end_src - 1)) != 0)
  54                err++;
  55        if ((cmd->stop_src & (cmd->stop_src - 1)) != 0)
  56                err++;
  57
  58        if (err)
  59                return 2;
  60
  61        /* step 3: make sure arguments are trivially compatible */
  62
  63        /* cmd->start_src == TRIG_NOW || cmd->start_src == TRIG_INT */
  64        if (cmd->start_arg != 0) {
  65                cmd->start_arg = 0;
  66                err++;
  67        }
  68
  69        /* cmd->scan_begin_src == TRIG_EXT */
  70        if (cmd->scan_begin_arg != 0) {
  71                cmd->scan_begin_arg = 0;
  72                err++;
  73        }
  74
  75        /* cmd->convert_src == TRIG_NOW */
  76        if (cmd->convert_arg != 0) {
  77                cmd->convert_arg = 0;
  78                err++;
  79        }
  80
  81        /* cmd->scan_end_src == TRIG_COUNT */
  82        if (cmd->scan_end_arg != cmd->chanlist_len) {
  83                cmd->scan_end_arg = cmd->chanlist_len;
  84                err++;
  85        }
  86
  87        switch (cmd->stop_src) {
  88        case TRIG_COUNT:
  89                /* any count allowed */
  90                break;
  91        case TRIG_NONE:
  92                if (cmd->stop_arg != 0) {
  93                        cmd->stop_arg = 0;
  94                        err++;
  95                }
  96                break;
  97        default:
  98                break;
  99        }
 100
 101        if (err)
 102                return 3;
 103
 104        /* step 4: fix up any arguments */
 105
 106        /* if (err) return 4; */
 107
 108        return 0;
 109}
 110
 111EXPORT_SYMBOL(comedi_pcm_cmdtest);
 112