tizen 2.4 release
[profile/mobile/platform/kernel/linux-3.10-sc7730.git] / drivers / staging / comedi / drivers / addi_apci_3xxx.c
1 #include <linux/pci.h>
2
3 #include "../comedidev.h"
4 #include "comedi_fc.h"
5 #include "amcc_s5933.h"
6
7 #include "addi-data/addi_common.h"
8
9 #include "addi-data/addi_eeprom.c"
10 #include "addi-data/hwdrv_apci3xxx.c"
11 #include "addi-data/addi_common.c"
12
13 enum apci3xxx_boardid {
14         BOARD_APCI3000_16,
15         BOARD_APCI3000_8,
16         BOARD_APCI3000_4,
17         BOARD_APCI3006_16,
18         BOARD_APCI3006_8,
19         BOARD_APCI3006_4,
20         BOARD_APCI3010_16,
21         BOARD_APCI3010_8,
22         BOARD_APCI3010_4,
23         BOARD_APCI3016_16,
24         BOARD_APCI3016_8,
25         BOARD_APCI3016_4,
26         BOARD_APCI3100_16_4,
27         BOARD_APCI3100_8_4,
28         BOARD_APCI3106_16_4,
29         BOARD_APCI3106_8_4,
30         BOARD_APCI3110_16_4,
31         BOARD_APCI3110_8_4,
32         BOARD_APCI3116_16_4,
33         BOARD_APCI3116_8_4,
34         BOARD_APCI3003,
35         BOARD_APCI3002_16,
36         BOARD_APCI3002_8,
37         BOARD_APCI3002_4,
38         BOARD_APCI3500,
39 };
40
41 static const struct addi_board apci3xxx_boardtypes[] = {
42         [BOARD_APCI3000_16] = {
43                 .pc_DriverName          = "apci3000-16",
44                 .i_IorangeBase1         = 256,
45                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
46                 .pc_EepromChip          = ADDIDATA_9054,
47                 .i_NbrAiChannel         = 16,
48                 .i_NbrAiChannelDiff     = 8,
49                 .i_AiChannelList        = 16,
50                 .i_AiMaxdata            = 4095,
51                 .pr_AiRangelist         = &range_apci3XXX_ai,
52                 .i_NbrTTLChannel        = 24,
53                 .b_AvailableConvertUnit = 6,
54                 .ui_MinAcquisitiontimeNs = 10000,
55                 .interrupt              = v_APCI3XXX_Interrupt,
56                 .reset                  = i_APCI3XXX_Reset,
57                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
58                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
59                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
60                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
61                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
62                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
63         },
64         [BOARD_APCI3000_8] = {
65                 .pc_DriverName          = "apci3000-8",
66                 .i_IorangeBase1         = 256,
67                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
68                 .pc_EepromChip          = ADDIDATA_9054,
69                 .i_NbrAiChannel         = 8,
70                 .i_NbrAiChannelDiff     = 4,
71                 .i_AiChannelList        = 8,
72                 .i_AiMaxdata            = 4095,
73                 .pr_AiRangelist         = &range_apci3XXX_ai,
74                 .i_NbrTTLChannel        = 24,
75                 .b_AvailableConvertUnit = 6,
76                 .ui_MinAcquisitiontimeNs = 10000,
77                 .interrupt              = v_APCI3XXX_Interrupt,
78                 .reset                  = i_APCI3XXX_Reset,
79                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
80                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
81                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
82                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
83                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
84                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
85         },
86         [BOARD_APCI3000_4] = {
87                 .pc_DriverName          = "apci3000-4",
88                 .i_IorangeBase1         = 256,
89                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
90                 .pc_EepromChip          = ADDIDATA_9054,
91                 .i_NbrAiChannel         = 4,
92                 .i_NbrAiChannelDiff     = 2,
93                 .i_AiChannelList        = 4,
94                 .i_AiMaxdata            = 4095,
95                 .pr_AiRangelist         = &range_apci3XXX_ai,
96                 .i_NbrTTLChannel        = 24,
97                 .b_AvailableConvertUnit = 6,
98                 .ui_MinAcquisitiontimeNs = 10000,
99                 .interrupt              = v_APCI3XXX_Interrupt,
100                 .reset                  = i_APCI3XXX_Reset,
101                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
102                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
103                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
104                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
105                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
106                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
107         },
108         [BOARD_APCI3006_16] = {
109                 .pc_DriverName          = "apci3006-16",
110                 .i_IorangeBase1         = 256,
111                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
112                 .pc_EepromChip          = ADDIDATA_9054,
113                 .i_NbrAiChannel         = 16,
114                 .i_NbrAiChannelDiff     = 8,
115                 .i_AiChannelList        = 16,
116                 .i_AiMaxdata            = 65535,
117                 .pr_AiRangelist         = &range_apci3XXX_ai,
118                 .i_NbrTTLChannel        = 24,
119                 .b_AvailableConvertUnit = 6,
120                 .ui_MinAcquisitiontimeNs = 10000,
121                 .interrupt              = v_APCI3XXX_Interrupt,
122                 .reset                  = i_APCI3XXX_Reset,
123                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
124                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
125                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
126                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
127                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
128                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
129         },
130         [BOARD_APCI3006_8] = {
131                 .pc_DriverName          = "apci3006-8",
132                 .i_IorangeBase1         = 256,
133                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
134                 .pc_EepromChip          = ADDIDATA_9054,
135                 .i_NbrAiChannel         = 8,
136                 .i_NbrAiChannelDiff     = 4,
137                 .i_AiChannelList        = 8,
138                 .i_AiMaxdata            = 65535,
139                 .pr_AiRangelist         = &range_apci3XXX_ai,
140                 .i_NbrTTLChannel        = 24,
141                 .b_AvailableConvertUnit = 6,
142                 .ui_MinAcquisitiontimeNs = 10000,
143                 .interrupt              = v_APCI3XXX_Interrupt,
144                 .reset                  = i_APCI3XXX_Reset,
145                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
146                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
147                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
148                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
149                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
150                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
151         },
152         [BOARD_APCI3006_4] = {
153                 .pc_DriverName          = "apci3006-4",
154                 .i_IorangeBase1         = 256,
155                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
156                 .pc_EepromChip          = ADDIDATA_9054,
157                 .i_NbrAiChannel         = 4,
158                 .i_NbrAiChannelDiff     = 2,
159                 .i_AiChannelList        = 4,
160                 .i_AiMaxdata            = 65535,
161                 .pr_AiRangelist         = &range_apci3XXX_ai,
162                 .i_NbrTTLChannel        = 24,
163                 .b_AvailableConvertUnit = 6,
164                 .ui_MinAcquisitiontimeNs = 10000,
165                 .interrupt              = v_APCI3XXX_Interrupt,
166                 .reset                  = i_APCI3XXX_Reset,
167                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
168                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
169                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
170                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
171                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
172                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
173         },
174         [BOARD_APCI3010_16] = {
175                 .pc_DriverName          = "apci3010-16",
176                 .i_IorangeBase1         = 256,
177                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
178                 .pc_EepromChip          = ADDIDATA_9054,
179                 .i_NbrAiChannel         = 16,
180                 .i_NbrAiChannelDiff     = 8,
181                 .i_AiChannelList        = 16,
182                 .i_AiMaxdata            = 4095,
183                 .pr_AiRangelist         = &range_apci3XXX_ai,
184                 .i_NbrDiChannel         = 4,
185                 .i_NbrDoChannel         = 4,
186                 .i_DoMaxdata            = 1,
187                 .i_NbrTTLChannel        = 24,
188                 .b_AvailableConvertUnit = 6,
189                 .ui_MinAcquisitiontimeNs = 5000,
190                 .interrupt              = v_APCI3XXX_Interrupt,
191                 .reset                  = i_APCI3XXX_Reset,
192                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
193                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
194                 .di_bits                = apci3xxx_di_insn_bits,
195                 .do_bits                = apci3xxx_do_insn_bits,
196                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
197                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
198                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
199                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
200         },
201         [BOARD_APCI3010_8] = {
202                 .pc_DriverName          = "apci3010-8",
203                 .i_IorangeBase1         = 256,
204                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
205                 .pc_EepromChip          = ADDIDATA_9054,
206                 .i_NbrAiChannel         = 8,
207                 .i_NbrAiChannelDiff     = 4,
208                 .i_AiChannelList        = 8,
209                 .i_AiMaxdata            = 4095,
210                 .pr_AiRangelist         = &range_apci3XXX_ai,
211                 .i_NbrDiChannel         = 4,
212                 .i_NbrDoChannel         = 4,
213                 .i_DoMaxdata            = 1,
214                 .i_NbrTTLChannel        = 24,
215                 .b_AvailableConvertUnit = 6,
216                 .ui_MinAcquisitiontimeNs = 5000,
217                 .interrupt              = v_APCI3XXX_Interrupt,
218                 .reset                  = i_APCI3XXX_Reset,
219                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
220                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
221                 .di_bits                = apci3xxx_di_insn_bits,
222                 .do_bits                = apci3xxx_do_insn_bits,
223                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
224                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
225                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
226                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
227         },
228         [BOARD_APCI3010_4] = {
229                 .pc_DriverName          = "apci3010-4",
230                 .i_IorangeBase1         = 256,
231                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
232                 .pc_EepromChip          = ADDIDATA_9054,
233                 .i_NbrAiChannel         = 4,
234                 .i_NbrAiChannelDiff     = 2,
235                 .i_AiChannelList        = 4,
236                 .i_AiMaxdata            = 4095,
237                 .pr_AiRangelist         = &range_apci3XXX_ai,
238                 .i_NbrDiChannel         = 4,
239                 .i_NbrDoChannel         = 4,
240                 .i_DoMaxdata            = 1,
241                 .i_NbrTTLChannel        = 24,
242                 .b_AvailableConvertUnit = 6,
243                 .ui_MinAcquisitiontimeNs = 5000,
244                 .interrupt              = v_APCI3XXX_Interrupt,
245                 .reset                  = i_APCI3XXX_Reset,
246                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
247                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
248                 .di_bits                = apci3xxx_di_insn_bits,
249                 .do_bits                = apci3xxx_do_insn_bits,
250                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
251                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
252                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
253                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
254         },
255         [BOARD_APCI3016_16] = {
256                 .pc_DriverName          = "apci3016-16",
257                 .i_IorangeBase1         = 256,
258                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
259                 .pc_EepromChip          = ADDIDATA_9054,
260                 .i_NbrAiChannel         = 16,
261                 .i_NbrAiChannelDiff     = 8,
262                 .i_AiChannelList        = 16,
263                 .i_AiMaxdata            = 65535,
264                 .pr_AiRangelist         = &range_apci3XXX_ai,
265                 .i_NbrDiChannel         = 4,
266                 .i_NbrDoChannel         = 4,
267                 .i_DoMaxdata            = 1,
268                 .i_NbrTTLChannel        = 24,
269                 .b_AvailableConvertUnit = 6,
270                 .ui_MinAcquisitiontimeNs = 5000,
271                 .interrupt              = v_APCI3XXX_Interrupt,
272                 .reset                  = i_APCI3XXX_Reset,
273                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
274                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
275                 .di_bits                = apci3xxx_di_insn_bits,
276                 .do_bits                = apci3xxx_do_insn_bits,
277                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
278                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
279                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
280                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
281         },
282         [BOARD_APCI3016_8] = {
283                 .pc_DriverName          = "apci3016-8",
284                 .i_IorangeBase1         = 256,
285                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
286                 .pc_EepromChip          = ADDIDATA_9054,
287                 .i_NbrAiChannel         = 8,
288                 .i_NbrAiChannelDiff     = 4,
289                 .i_AiChannelList        = 8,
290                 .i_AiMaxdata            = 65535,
291                 .pr_AiRangelist         = &range_apci3XXX_ai,
292                 .i_NbrDiChannel         = 4,
293                 .i_NbrDoChannel         = 4,
294                 .i_DoMaxdata            = 1,
295                 .i_NbrTTLChannel        = 24,
296                 .b_AvailableConvertUnit = 6,
297                 .ui_MinAcquisitiontimeNs = 5000,
298                 .interrupt              = v_APCI3XXX_Interrupt,
299                 .reset                  = i_APCI3XXX_Reset,
300                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
301                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
302                 .di_bits                = apci3xxx_di_insn_bits,
303                 .do_bits                = apci3xxx_do_insn_bits,
304                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
305                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
306                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
307                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
308         },
309         [BOARD_APCI3016_4] = {
310                 .pc_DriverName          = "apci3016-4",
311                 .i_IorangeBase1         = 256,
312                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
313                 .pc_EepromChip          = ADDIDATA_9054,
314                 .i_NbrAiChannel         = 4,
315                 .i_NbrAiChannelDiff     = 2,
316                 .i_AiChannelList        = 4,
317                 .i_AiMaxdata            = 65535,
318                 .pr_AiRangelist         = &range_apci3XXX_ai,
319                 .i_NbrDiChannel         = 4,
320                 .i_NbrDoChannel         = 4,
321                 .i_DoMaxdata            = 1,
322                 .i_NbrTTLChannel        = 24,
323                 .b_AvailableConvertUnit = 6,
324                 .ui_MinAcquisitiontimeNs = 5000,
325                 .interrupt              = v_APCI3XXX_Interrupt,
326                 .reset                  = i_APCI3XXX_Reset,
327                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
328                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
329                 .di_bits                = apci3xxx_di_insn_bits,
330                 .do_bits                = apci3xxx_do_insn_bits,
331                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
332                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
333                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
334                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
335         },
336         [BOARD_APCI3100_16_4] = {
337                 .pc_DriverName          = "apci3100-16-4",
338                 .i_IorangeBase1         = 256,
339                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
340                 .pc_EepromChip          = ADDIDATA_9054,
341                 .i_NbrAiChannel         = 16,
342                 .i_NbrAiChannelDiff     = 8,
343                 .i_AiChannelList        = 16,
344                 .i_NbrAoChannel         = 4,
345                 .i_AiMaxdata            = 4095,
346                 .i_AoMaxdata            = 4095,
347                 .pr_AiRangelist         = &range_apci3XXX_ai,
348                 .pr_AoRangelist         = &range_apci3XXX_ao,
349                 .i_NbrTTLChannel        = 24,
350                 .b_AvailableConvertUnit = 6,
351                 .ui_MinAcquisitiontimeNs = 10000,
352                 .interrupt              = v_APCI3XXX_Interrupt,
353                 .reset                  = i_APCI3XXX_Reset,
354                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
355                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
356                 .ao_write               = i_APCI3XXX_InsnWriteAnalogOutput,
357                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
358                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
359                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
360                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
361         },
362         [BOARD_APCI3100_8_4] = {
363                 .pc_DriverName          = "apci3100-8-4",
364                 .i_IorangeBase1         = 256,
365                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
366                 .pc_EepromChip          = ADDIDATA_9054,
367                 .i_NbrAiChannel         = 8,
368                 .i_NbrAiChannelDiff     = 4,
369                 .i_AiChannelList        = 8,
370                 .i_NbrAoChannel         = 4,
371                 .i_AiMaxdata            = 4095,
372                 .i_AoMaxdata            = 4095,
373                 .pr_AiRangelist         = &range_apci3XXX_ai,
374                 .pr_AoRangelist         = &range_apci3XXX_ao,
375                 .i_NbrTTLChannel        = 24,
376                 .b_AvailableConvertUnit = 6,
377                 .ui_MinAcquisitiontimeNs = 10000,
378                 .interrupt              = v_APCI3XXX_Interrupt,
379                 .reset                  = i_APCI3XXX_Reset,
380                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
381                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
382                 .ao_write               = i_APCI3XXX_InsnWriteAnalogOutput,
383                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
384                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
385                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
386                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
387         },
388         [BOARD_APCI3106_16_4] = {
389                 .pc_DriverName          = "apci3106-16-4",
390                 .i_IorangeBase1         = 256,
391                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
392                 .pc_EepromChip          = ADDIDATA_9054,
393                 .i_NbrAiChannel         = 16,
394                 .i_NbrAiChannelDiff     = 8,
395                 .i_AiChannelList        = 16,
396                 .i_NbrAoChannel         = 4,
397                 .i_AiMaxdata            = 65535,
398                 .i_AoMaxdata            = 4095,
399                 .pr_AiRangelist         = &range_apci3XXX_ai,
400                 .pr_AoRangelist         = &range_apci3XXX_ao,
401                 .i_NbrTTLChannel        = 24,
402                 .b_AvailableConvertUnit = 6,
403                 .ui_MinAcquisitiontimeNs = 10000,
404                 .interrupt              = v_APCI3XXX_Interrupt,
405                 .reset                  = i_APCI3XXX_Reset,
406                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
407                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
408                 .ao_write               = i_APCI3XXX_InsnWriteAnalogOutput,
409                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
410                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
411                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
412                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
413         },
414         [BOARD_APCI3106_8_4] = {
415                 .pc_DriverName          = "apci3106-8-4",
416                 .i_IorangeBase1         = 256,
417                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
418                 .pc_EepromChip          = ADDIDATA_9054,
419                 .i_NbrAiChannel         = 8,
420                 .i_NbrAiChannelDiff     = 4,
421                 .i_AiChannelList        = 8,
422                 .i_NbrAoChannel         = 4,
423                 .i_AiMaxdata            = 65535,
424                 .i_AoMaxdata            = 4095,
425                 .pr_AiRangelist         = &range_apci3XXX_ai,
426                 .pr_AoRangelist         = &range_apci3XXX_ao,
427                 .i_NbrTTLChannel        = 24,
428                 .b_AvailableConvertUnit = 6,
429                 .ui_MinAcquisitiontimeNs = 10000,
430                 .interrupt              = v_APCI3XXX_Interrupt,
431                 .reset                  = i_APCI3XXX_Reset,
432                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
433                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
434                 .ao_write               = i_APCI3XXX_InsnWriteAnalogOutput,
435                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
436                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
437                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
438                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
439         },
440         [BOARD_APCI3110_16_4] = {
441                 .pc_DriverName          = "apci3110-16-4",
442                 .i_IorangeBase1         = 256,
443                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
444                 .pc_EepromChip          = ADDIDATA_9054,
445                 .i_NbrAiChannel         = 16,
446                 .i_NbrAiChannelDiff     = 8,
447                 .i_AiChannelList        = 16,
448                 .i_NbrAoChannel         = 4,
449                 .i_AiMaxdata            = 4095,
450                 .i_AoMaxdata            = 4095,
451                 .pr_AiRangelist         = &range_apci3XXX_ai,
452                 .pr_AoRangelist         = &range_apci3XXX_ao,
453                 .i_NbrDiChannel         = 4,
454                 .i_NbrDoChannel         = 4,
455                 .i_DoMaxdata            = 1,
456                 .i_NbrTTLChannel        = 24,
457                 .b_AvailableConvertUnit = 6,
458                 .ui_MinAcquisitiontimeNs = 5000,
459                 .interrupt              = v_APCI3XXX_Interrupt,
460                 .reset                  = i_APCI3XXX_Reset,
461                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
462                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
463                 .ao_write               = i_APCI3XXX_InsnWriteAnalogOutput,
464                 .di_bits                = apci3xxx_di_insn_bits,
465                 .do_bits                = apci3xxx_do_insn_bits,
466                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
467                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
468                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
469                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
470         },
471         [BOARD_APCI3110_8_4] = {
472                 .pc_DriverName          = "apci3110-8-4",
473                 .i_IorangeBase1         = 256,
474                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
475                 .pc_EepromChip          = ADDIDATA_9054,
476                 .i_NbrAiChannel         = 8,
477                 .i_NbrAiChannelDiff     = 4,
478                 .i_AiChannelList        = 8,
479                 .i_NbrAoChannel         = 4,
480                 .i_AiMaxdata            = 4095,
481                 .i_AoMaxdata            = 4095,
482                 .pr_AiRangelist         = &range_apci3XXX_ai,
483                 .pr_AoRangelist         = &range_apci3XXX_ao,
484                 .i_NbrDiChannel         = 4,
485                 .i_NbrDoChannel         = 4,
486                 .i_DoMaxdata            = 1,
487                 .i_NbrTTLChannel        = 24,
488                 .b_AvailableConvertUnit = 6,
489                 .ui_MinAcquisitiontimeNs = 5000,
490                 .interrupt              = v_APCI3XXX_Interrupt,
491                 .reset                  = i_APCI3XXX_Reset,
492                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
493                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
494                 .ao_write               = i_APCI3XXX_InsnWriteAnalogOutput,
495                 .di_bits                = apci3xxx_di_insn_bits,
496                 .do_bits                = apci3xxx_do_insn_bits,
497                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
498                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
499                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
500                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
501         },
502         [BOARD_APCI3116_16_4] = {
503                 .pc_DriverName          = "apci3116-16-4",
504                 .i_IorangeBase1         = 256,
505                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
506                 .pc_EepromChip          = ADDIDATA_9054,
507                 .i_NbrAiChannel         = 16,
508                 .i_NbrAiChannelDiff     = 8,
509                 .i_AiChannelList        = 16,
510                 .i_NbrAoChannel         = 4,
511                 .i_AiMaxdata            = 65535,
512                 .i_AoMaxdata            = 4095,
513                 .pr_AiRangelist         = &range_apci3XXX_ai,
514                 .pr_AoRangelist         = &range_apci3XXX_ao,
515                 .i_NbrDiChannel         = 4,
516                 .i_NbrDoChannel         = 4,
517                 .i_DoMaxdata            = 1,
518                 .i_NbrTTLChannel        = 24,
519                 .b_AvailableConvertUnit = 6,
520                 .ui_MinAcquisitiontimeNs = 5000,
521                 .interrupt              = v_APCI3XXX_Interrupt,
522                 .reset                  = i_APCI3XXX_Reset,
523                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
524                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
525                 .ao_write               = i_APCI3XXX_InsnWriteAnalogOutput,
526                 .di_bits                = apci3xxx_di_insn_bits,
527                 .do_bits                = apci3xxx_do_insn_bits,
528                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
529                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
530                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
531                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
532         },
533         [BOARD_APCI3116_8_4] = {
534                 .pc_DriverName          = "apci3116-8-4",
535                 .i_IorangeBase1         = 256,
536                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
537                 .pc_EepromChip          = ADDIDATA_9054,
538                 .i_NbrAiChannel         = 8,
539                 .i_NbrAiChannelDiff     = 4,
540                 .i_AiChannelList        = 8,
541                 .i_NbrAoChannel         = 4,
542                 .i_AiMaxdata            = 65535,
543                 .i_AoMaxdata            = 4095,
544                 .pr_AiRangelist         = &range_apci3XXX_ai,
545                 .pr_AoRangelist         = &range_apci3XXX_ao,
546                 .i_NbrDiChannel         = 4,
547                 .i_NbrDoChannel         = 4,
548                 .i_DoMaxdata            = 1,
549                 .i_NbrTTLChannel        = 24,
550                 .b_AvailableConvertUnit = 6,
551                 .ui_MinAcquisitiontimeNs = 5000,
552                 .interrupt              = v_APCI3XXX_Interrupt,
553                 .reset                  = i_APCI3XXX_Reset,
554                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
555                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
556                 .ao_write               = i_APCI3XXX_InsnWriteAnalogOutput,
557                 .di_bits                = apci3xxx_di_insn_bits,
558                 .do_bits                = apci3xxx_do_insn_bits,
559                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
560                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
561                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
562                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
563         },
564         [BOARD_APCI3003] = {
565                 .pc_DriverName          = "apci3003",
566                 .i_IorangeBase1         = 256,
567                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
568                 .pc_EepromChip          = ADDIDATA_9054,
569                 .i_NbrAiChannelDiff     = 4,
570                 .i_AiChannelList        = 4,
571                 .i_AiMaxdata            = 65535,
572                 .pr_AiRangelist         = &range_apci3XXX_ai,
573                 .i_NbrDiChannel         = 4,
574                 .i_NbrDoChannel         = 4,
575                 .i_DoMaxdata            = 1,
576                 .b_AvailableConvertUnit = 7,
577                 .ui_MinAcquisitiontimeNs = 2500,
578                 .interrupt              = v_APCI3XXX_Interrupt,
579                 .reset                  = i_APCI3XXX_Reset,
580                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
581                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
582                 .di_bits                = apci3xxx_di_insn_bits,
583                 .do_bits                = apci3xxx_do_insn_bits,
584         },
585         [BOARD_APCI3002_16] = {
586                 .pc_DriverName          = "apci3002-16",
587                 .i_IorangeBase1         = 256,
588                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
589                 .pc_EepromChip          = ADDIDATA_9054,
590                 .i_NbrAiChannelDiff     = 16,
591                 .i_AiChannelList        = 16,
592                 .i_AiMaxdata            = 65535,
593                 .pr_AiRangelist         = &range_apci3XXX_ai,
594                 .i_NbrDiChannel         = 4,
595                 .i_NbrDoChannel         = 4,
596                 .i_DoMaxdata            = 1,
597                 .b_AvailableConvertUnit = 6,
598                 .ui_MinAcquisitiontimeNs = 5000,
599                 .interrupt              = v_APCI3XXX_Interrupt,
600                 .reset                  = i_APCI3XXX_Reset,
601                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
602                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
603                 .di_bits                = apci3xxx_di_insn_bits,
604                 .do_bits                = apci3xxx_do_insn_bits,
605         },
606         [BOARD_APCI3002_8] = {
607                 .pc_DriverName          = "apci3002-8",
608                 .i_IorangeBase1         = 256,
609                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
610                 .pc_EepromChip          = ADDIDATA_9054,
611                 .i_NbrAiChannelDiff     = 8,
612                 .i_AiChannelList        = 8,
613                 .i_AiMaxdata            = 65535,
614                 .pr_AiRangelist         = &range_apci3XXX_ai,
615                 .i_NbrDiChannel         = 4,
616                 .i_NbrDoChannel         = 4,
617                 .i_DoMaxdata            = 1,
618                 .b_AvailableConvertUnit = 6,
619                 .ui_MinAcquisitiontimeNs = 5000,
620                 .interrupt              = v_APCI3XXX_Interrupt,
621                 .reset                  = i_APCI3XXX_Reset,
622                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
623                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
624                 .di_bits                = apci3xxx_di_insn_bits,
625                 .do_bits                = apci3xxx_do_insn_bits,
626         },
627         [BOARD_APCI3002_4] = {
628                 .pc_DriverName          = "apci3002-4",
629                 .i_IorangeBase1         = 256,
630                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
631                 .pc_EepromChip          = ADDIDATA_9054,
632                 .i_NbrAiChannelDiff     = 4,
633                 .i_AiChannelList        = 4,
634                 .i_AiMaxdata            = 65535,
635                 .pr_AiRangelist         = &range_apci3XXX_ai,
636                 .i_NbrDiChannel         = 4,
637                 .i_NbrDoChannel         = 4,
638                 .i_DoMaxdata            = 1,
639                 .b_AvailableConvertUnit = 6,
640                 .ui_MinAcquisitiontimeNs = 5000,
641                 .interrupt              = v_APCI3XXX_Interrupt,
642                 .reset                  = i_APCI3XXX_Reset,
643                 .ai_config              = i_APCI3XXX_InsnConfigAnalogInput,
644                 .ai_read                = i_APCI3XXX_InsnReadAnalogInput,
645                 .di_bits                = apci3xxx_di_insn_bits,
646                 .do_bits                = apci3xxx_do_insn_bits,
647         },
648         [BOARD_APCI3500] = {
649                 .pc_DriverName          = "apci3500",
650                 .i_IorangeBase1         = 256,
651                 .i_PCIEeprom            = ADDIDATA_NO_EEPROM,
652                 .pc_EepromChip          = ADDIDATA_9054,
653                 .i_NbrAoChannel         = 4,
654                 .i_AoMaxdata            = 4095,
655                 .pr_AoRangelist         = &range_apci3XXX_ao,
656                 .i_NbrTTLChannel        = 24,
657                 .interrupt              = v_APCI3XXX_Interrupt,
658                 .reset                  = i_APCI3XXX_Reset,
659                 .ao_write               = i_APCI3XXX_InsnWriteAnalogOutput,
660                 .ttl_config             = i_APCI3XXX_InsnConfigInitTTLIO,
661                 .ttl_bits               = i_APCI3XXX_InsnBitsTTLIO,
662                 .ttl_read               = i_APCI3XXX_InsnReadTTLIO,
663                 .ttl_write              = i_APCI3XXX_InsnWriteTTLIO,
664         },
665 };
666
667 static int apci3xxx_auto_attach(struct comedi_device *dev,
668                                 unsigned long context)
669 {
670         const struct addi_board *board = NULL;
671
672         if (context < ARRAY_SIZE(apci3xxx_boardtypes))
673                 board = &apci3xxx_boardtypes[context];
674         if (!board)
675                 return -ENODEV;
676         dev->board_ptr = board;
677
678         return addi_auto_attach(dev, context);
679 }
680
681 static struct comedi_driver apci3xxx_driver = {
682         .driver_name    = "addi_apci_3xxx",
683         .module         = THIS_MODULE,
684         .auto_attach    = apci3xxx_auto_attach,
685         .detach         = i_ADDI_Detach,
686 };
687
688 static int apci3xxx_pci_probe(struct pci_dev *dev,
689                               const struct pci_device_id *id)
690 {
691         return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data);
692 }
693
694 static DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = {
695         { PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 },
696         { PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 },
697         { PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 },
698         { PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 },
699         { PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 },
700         { PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 },
701         { PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 },
702         { PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 },
703         { PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 },
704         { PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 },
705         { PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 },
706         { PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 },
707         { PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 },
708         { PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 },
709         { PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 },
710         { PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 },
711         { PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 },
712         { PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 },
713         { PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 },
714         { PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 },
715         { PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 },
716         { PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 },
717         { PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 },
718         { PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 },
719         { PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 },
720         { 0 }
721 };
722 MODULE_DEVICE_TABLE(pci, apci3xxx_pci_table);
723
724 static struct pci_driver apci3xxx_pci_driver = {
725         .name           = "addi_apci_3xxx",
726         .id_table       = apci3xxx_pci_table,
727         .probe          = apci3xxx_pci_probe,
728         .remove         = comedi_pci_auto_unconfig,
729 };
730 module_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver);
731
732 MODULE_AUTHOR("Comedi http://www.comedi.org");
733 MODULE_DESCRIPTION("Comedi low-level driver");
734 MODULE_LICENSE("GPL");