pcm_common.c revision 90f703d30dd3e0c16ff80f35e34e511385a05ad5
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 45 * mutually compatible */ 46 47 /* these tests are true if more than one _src bit is set */ 48 if ((cmd->start_src & (cmd->start_src - 1)) != 0) 49 err++; 50 if ((cmd->scan_begin_src & (cmd->scan_begin_src - 1)) != 0) 51 err++; 52 if ((cmd->convert_src & (cmd->convert_src - 1)) != 0) 53 err++; 54 if ((cmd->scan_end_src & (cmd->scan_end_src - 1)) != 0) 55 err++; 56 if ((cmd->stop_src & (cmd->stop_src - 1)) != 0) 57 err++; 58 59 if (err) 60 return 2; 61 62 /* step 3: make sure arguments are trivially compatible */ 63 64 /* cmd->start_src == TRIG_NOW || cmd->start_src == TRIG_INT */ 65 if (cmd->start_arg != 0) { 66 cmd->start_arg = 0; 67 err++; 68 } 69 70 /* cmd->scan_begin_src == TRIG_EXT */ 71 if (cmd->scan_begin_arg != 0) { 72 cmd->scan_begin_arg = 0; 73 err++; 74 } 75 76 /* cmd->convert_src == TRIG_NOW */ 77 if (cmd->convert_arg != 0) { 78 cmd->convert_arg = 0; 79 err++; 80 } 81 82 /* cmd->scan_end_src == TRIG_COUNT */ 83 if (cmd->scan_end_arg != cmd->chanlist_len) { 84 cmd->scan_end_arg = cmd->chanlist_len; 85 err++; 86 } 87 88 switch (cmd->stop_src) { 89 case TRIG_COUNT: 90 /* any count allowed */ 91 break; 92 case TRIG_NONE: 93 if (cmd->stop_arg != 0) { 94 cmd->stop_arg = 0; 95 err++; 96 } 97 break; 98 default: 99 break; 100 } 101 102 if (err) 103 return 3; 104 105 /* step 4: fix up any arguments */ 106 107 /* if (err) return 4; */ 108 109 return 0; 110} 111EXPORT_SYMBOL(comedi_pcm_cmdtest); 112 113MODULE_AUTHOR("Comedi http://www.comedi.org"); 114MODULE_DESCRIPTION("Comedi low-level driver"); 115MODULE_LICENSE("GPL"); 116