1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | /* |
3 | * das08_isa.c |
4 | * comedi driver for DAS08 ISA/PC-104 boards |
5 | * |
6 | * COMEDI - Linux Control and Measurement Device Interface |
7 | * Copyright (C) 2000 David A. Schleef <ds@schleef.org> |
8 | * Copyright (C) 2001,2002,2003 Frank Mori Hess <fmhess@users.sourceforge.net> |
9 | * Copyright (C) 2004 Salvador E. Tropea <set@users.sf.net> <set@ieee.org> |
10 | */ |
11 | |
12 | /* |
13 | * Driver: das08_isa |
14 | * Description: DAS-08 ISA/PC-104 compatible boards |
15 | * Devices: [Keithley Metrabyte] DAS08 (isa-das08), |
16 | * [ComputerBoards] DAS08 (isa-das08), DAS08-PGM (das08-pgm), |
17 | * DAS08-PGH (das08-pgh), DAS08-PGL (das08-pgl), DAS08-AOH (das08-aoh), |
18 | * DAS08-AOL (das08-aol), DAS08-AOM (das08-aom), DAS08/JR-AO (das08/jr-ao), |
19 | * DAS08/JR-16-AO (das08jr-16-ao), PC104-DAS08 (pc104-das08), |
20 | * DAS08/JR/16 (das08jr/16) |
21 | * Author: Warren Jasper, ds, Frank Hess |
22 | * Updated: Fri, 31 Aug 2012 19:19:06 +0100 |
23 | * Status: works |
24 | * |
25 | * This is the ISA/PC-104-specific support split off from the das08 driver. |
26 | * |
27 | * Configuration Options: |
28 | * [0] - base io address |
29 | */ |
30 | |
31 | #include <linux/module.h> |
32 | #include <linux/comedi/comedidev.h> |
33 | |
34 | #include "das08.h" |
35 | |
36 | static const struct das08_board_struct das08_isa_boards[] = { |
37 | { |
38 | /* cio-das08.pdf */ |
39 | .name = "isa-das08" , |
40 | .ai_nbits = 12, |
41 | .ai_pg = das08_pg_none, |
42 | .ai_encoding = das08_encode12, |
43 | .di_nchan = 3, |
44 | .do_nchan = 4, |
45 | .i8255_offset = 8, |
46 | .i8254_offset = 4, |
47 | .iosize = 16, /* unchecked */ |
48 | }, { |
49 | /* cio-das08pgx.pdf */ |
50 | .name = "das08-pgm" , |
51 | .ai_nbits = 12, |
52 | .ai_pg = das08_pgm, |
53 | .ai_encoding = das08_encode12, |
54 | .di_nchan = 3, |
55 | .do_nchan = 4, |
56 | .i8255_offset = 0, |
57 | .i8254_offset = 0x04, |
58 | .iosize = 16, /* unchecked */ |
59 | }, { |
60 | /* cio-das08pgx.pdf */ |
61 | .name = "das08-pgh" , |
62 | .ai_nbits = 12, |
63 | .ai_pg = das08_pgh, |
64 | .ai_encoding = das08_encode12, |
65 | .di_nchan = 3, |
66 | .do_nchan = 4, |
67 | .i8254_offset = 0x04, |
68 | .iosize = 16, /* unchecked */ |
69 | }, { |
70 | /* cio-das08pgx.pdf */ |
71 | .name = "das08-pgl" , |
72 | .ai_nbits = 12, |
73 | .ai_pg = das08_pgl, |
74 | .ai_encoding = das08_encode12, |
75 | .di_nchan = 3, |
76 | .do_nchan = 4, |
77 | .i8254_offset = 0x04, |
78 | .iosize = 16, /* unchecked */ |
79 | }, { |
80 | /* cio-das08_aox.pdf */ |
81 | .name = "das08-aoh" , |
82 | .ai_nbits = 12, |
83 | .ai_pg = das08_pgh, |
84 | .ai_encoding = das08_encode12, |
85 | .ao_nbits = 12, |
86 | .di_nchan = 3, |
87 | .do_nchan = 4, |
88 | .i8255_offset = 0x0c, |
89 | .i8254_offset = 0x04, |
90 | .iosize = 16, /* unchecked */ |
91 | }, { |
92 | /* cio-das08_aox.pdf */ |
93 | .name = "das08-aol" , |
94 | .ai_nbits = 12, |
95 | .ai_pg = das08_pgl, |
96 | .ai_encoding = das08_encode12, |
97 | .ao_nbits = 12, |
98 | .di_nchan = 3, |
99 | .do_nchan = 4, |
100 | .i8255_offset = 0x0c, |
101 | .i8254_offset = 0x04, |
102 | .iosize = 16, /* unchecked */ |
103 | }, { |
104 | /* cio-das08_aox.pdf */ |
105 | .name = "das08-aom" , |
106 | .ai_nbits = 12, |
107 | .ai_pg = das08_pgm, |
108 | .ai_encoding = das08_encode12, |
109 | .ao_nbits = 12, |
110 | .di_nchan = 3, |
111 | .do_nchan = 4, |
112 | .i8255_offset = 0x0c, |
113 | .i8254_offset = 0x04, |
114 | .iosize = 16, /* unchecked */ |
115 | }, { |
116 | /* cio-das08-jr-ao.pdf */ |
117 | .name = "das08/jr-ao" , |
118 | .is_jr = true, |
119 | .ai_nbits = 12, |
120 | .ai_pg = das08_pg_none, |
121 | .ai_encoding = das08_encode12, |
122 | .ao_nbits = 12, |
123 | .di_nchan = 8, |
124 | .do_nchan = 8, |
125 | .iosize = 16, /* unchecked */ |
126 | }, { |
127 | /* cio-das08jr-16-ao.pdf */ |
128 | .name = "das08jr-16-ao" , |
129 | .is_jr = true, |
130 | .ai_nbits = 16, |
131 | .ai_pg = das08_pg_none, |
132 | .ai_encoding = das08_encode16, |
133 | .ao_nbits = 16, |
134 | .di_nchan = 8, |
135 | .do_nchan = 8, |
136 | .i8254_offset = 0x04, |
137 | .iosize = 16, /* unchecked */ |
138 | }, { |
139 | .name = "pc104-das08" , |
140 | .ai_nbits = 12, |
141 | .ai_pg = das08_pg_none, |
142 | .ai_encoding = das08_encode12, |
143 | .di_nchan = 3, |
144 | .do_nchan = 4, |
145 | .i8254_offset = 4, |
146 | .iosize = 16, /* unchecked */ |
147 | }, { |
148 | .name = "das08jr/16" , |
149 | .is_jr = true, |
150 | .ai_nbits = 16, |
151 | .ai_pg = das08_pg_none, |
152 | .ai_encoding = das08_encode16, |
153 | .di_nchan = 8, |
154 | .do_nchan = 8, |
155 | .iosize = 16, /* unchecked */ |
156 | }, |
157 | }; |
158 | |
159 | static int das08_isa_attach(struct comedi_device *dev, |
160 | struct comedi_devconfig *it) |
161 | { |
162 | const struct das08_board_struct *board = dev->board_ptr; |
163 | struct das08_private_struct *devpriv; |
164 | int ret; |
165 | |
166 | devpriv = comedi_alloc_devpriv(dev, size: sizeof(*devpriv)); |
167 | if (!devpriv) |
168 | return -ENOMEM; |
169 | |
170 | ret = comedi_request_region(dev, start: it->options[0], len: board->iosize); |
171 | if (ret) |
172 | return ret; |
173 | |
174 | return das08_common_attach(dev, iobase: dev->iobase); |
175 | } |
176 | |
177 | static struct comedi_driver das08_isa_driver = { |
178 | .driver_name = "isa-das08" , |
179 | .module = THIS_MODULE, |
180 | .attach = das08_isa_attach, |
181 | .detach = comedi_legacy_detach, |
182 | .board_name = &das08_isa_boards[0].name, |
183 | .num_names = ARRAY_SIZE(das08_isa_boards), |
184 | .offset = sizeof(das08_isa_boards[0]), |
185 | }; |
186 | module_comedi_driver(das08_isa_driver); |
187 | |
188 | MODULE_AUTHOR("Comedi https://www.comedi.org" ); |
189 | MODULE_DESCRIPTION("Comedi low-level driver" ); |
190 | MODULE_LICENSE("GPL" ); |
191 | |