Merge git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / comedi / kcomedilib / dio.c
1 /*
2 kcomedilib/dio.c
3 implements comedi_dio_*() functions
4
5 COMEDI - Linux Control and Measurement Device Interface
6 Copyright (C) 2000 David A. Schleef <ds@schleef.org>
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
22 */
23
24 #include "../comedi.h"
25 #include "../comedilib.h"
26
27 #include <linux/string.h>
28
29 int comedi_dio_config(comedi_t * dev, unsigned int subdev, unsigned int chan,
30 unsigned int io)
31 {
32 comedi_insn insn;
33
34 memset(&insn, 0, sizeof(insn));
35 insn.insn = INSN_CONFIG;
36 insn.n = 1;
37 insn.data = &io;
38 insn.subdev = subdev;
39 insn.chanspec = CR_PACK(chan, 0, 0);
40
41 return comedi_do_insn(dev, &insn);
42 }
43
44 int comedi_dio_read(comedi_t * dev, unsigned int subdev, unsigned int chan,
45 unsigned int *val)
46 {
47 comedi_insn insn;
48
49 memset(&insn, 0, sizeof(insn));
50 insn.insn = INSN_READ;
51 insn.n = 1;
52 insn.data = val;
53 insn.subdev = subdev;
54 insn.chanspec = CR_PACK(chan, 0, 0);
55
56 return comedi_do_insn(dev, &insn);
57 }
58
59 int comedi_dio_write(comedi_t * dev, unsigned int subdev, unsigned int chan,
60 unsigned int val)
61 {
62 comedi_insn insn;
63
64 memset(&insn, 0, sizeof(insn));
65 insn.insn = INSN_WRITE;
66 insn.n = 1;
67 insn.data = &val;
68 insn.subdev = subdev;
69 insn.chanspec = CR_PACK(chan, 0, 0);
70
71 return comedi_do_insn(dev, &insn);
72 }
73
74 int comedi_dio_bitfield(comedi_t * dev, unsigned int subdev, unsigned int mask,
75 unsigned int *bits)
76 {
77 comedi_insn insn;
78 lsampl_t data[2];
79 int ret;
80
81 memset(&insn, 0, sizeof(insn));
82 insn.insn = INSN_BITS;
83 insn.n = 2;
84 insn.data = data;
85 insn.subdev = subdev;
86
87 data[0] = mask;
88 data[1] = *bits;
89
90 ret = comedi_do_insn(dev, &insn);
91
92 *bits = data[1];
93
94 return ret;
95 }