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