staging: comedi: Move pcm do_cmdtest function into a single source file
[pandora-kernel.git] / drivers / staging / comedi / drivers / pcm_common.c
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  */
8 int 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
111 EXPORT_SYMBOL(comedi_pcm_cmdtest);