| #include "../comedidev.h" |
| #include "pcm_common.h" |
| |
| /* |
| * 'do_cmdtest' function for an 'INTERRUPT' subdevice. This is for |
| * the PCM drivers. |
| */ |
| int comedi_pcm_cmdtest(struct comedi_device *dev, |
| struct comedi_subdevice *s, struct comedi_cmd *cmd) |
| { |
| int err = 0; |
| unsigned int tmp; |
| |
| /* step 1: make sure trigger sources are trivially valid */ |
| |
| tmp = cmd->start_src; |
| cmd->start_src &= (TRIG_NOW | TRIG_INT); |
| if (!cmd->start_src || tmp != cmd->start_src) |
| err++; |
| |
| tmp = cmd->scan_begin_src; |
| cmd->scan_begin_src &= TRIG_EXT; |
| if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src) |
| err++; |
| |
| tmp = cmd->convert_src; |
| cmd->convert_src &= TRIG_NOW; |
| if (!cmd->convert_src || tmp != cmd->convert_src) |
| err++; |
| |
| tmp = cmd->scan_end_src; |
| cmd->scan_end_src &= TRIG_COUNT; |
| if (!cmd->scan_end_src || tmp != cmd->scan_end_src) |
| err++; |
| |
| tmp = cmd->stop_src; |
| cmd->stop_src &= (TRIG_COUNT | TRIG_NONE); |
| if (!cmd->stop_src || tmp != cmd->stop_src) |
| err++; |
| |
| if (err) |
| return 1; |
| |
| /* step 2: make sure trigger sources are unique and |
| * mutually compatible */ |
| |
| /* these tests are true if more than one _src bit is set */ |
| if ((cmd->start_src & (cmd->start_src - 1)) != 0) |
| err++; |
| if ((cmd->scan_begin_src & (cmd->scan_begin_src - 1)) != 0) |
| err++; |
| if ((cmd->convert_src & (cmd->convert_src - 1)) != 0) |
| err++; |
| if ((cmd->scan_end_src & (cmd->scan_end_src - 1)) != 0) |
| err++; |
| if ((cmd->stop_src & (cmd->stop_src - 1)) != 0) |
| err++; |
| |
| if (err) |
| return 2; |
| |
| /* step 3: make sure arguments are trivially compatible */ |
| |
| /* cmd->start_src == TRIG_NOW || cmd->start_src == TRIG_INT */ |
| if (cmd->start_arg != 0) { |
| cmd->start_arg = 0; |
| err++; |
| } |
| |
| /* cmd->scan_begin_src == TRIG_EXT */ |
| if (cmd->scan_begin_arg != 0) { |
| cmd->scan_begin_arg = 0; |
| err++; |
| } |
| |
| /* cmd->convert_src == TRIG_NOW */ |
| if (cmd->convert_arg != 0) { |
| cmd->convert_arg = 0; |
| err++; |
| } |
| |
| /* cmd->scan_end_src == TRIG_COUNT */ |
| if (cmd->scan_end_arg != cmd->chanlist_len) { |
| cmd->scan_end_arg = cmd->chanlist_len; |
| err++; |
| } |
| |
| switch (cmd->stop_src) { |
| case TRIG_COUNT: |
| /* any count allowed */ |
| break; |
| case TRIG_NONE: |
| if (cmd->stop_arg != 0) { |
| cmd->stop_arg = 0; |
| err++; |
| } |
| break; |
| default: |
| break; |
| } |
| |
| if (err) |
| return 3; |
| |
| /* step 4: fix up any arguments */ |
| |
| /* if (err) return 4; */ |
| |
| return 0; |
| } |
| EXPORT_SYMBOL(comedi_pcm_cmdtest); |