pcm_common.c revision 22d89f4abfe492ac347a41e053151e4a6c2787aa
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