staging/comedi/addi: Convert pci_table entries to PCI_DEVICE (if PCI_ANY_ID is used)
[cascardo/linux.git] / drivers / staging / comedi / drivers / addi-data / addi_common.c
1 /**
2 @verbatim
3
4 Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.
5
6         ADDI-DATA GmbH
7         Dieselstrasse 3
8         D-77833 Ottersweier
9         Tel: +19(0)7223/9493-0
10         Fax: +49(0)7223/9493-92
11         http://www.addi-data.com
12         info@addi-data.com
13
14 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 You should also find the complete GPL in the COPYING file accompanying this source code.
21
22 @endverbatim
23 */
24 /*
25
26   +-----------------------------------------------------------------------+
27   | (C) ADDI-DATA GmbH          Dieselstrasse 3      D-77833 Ottersweier  |
28   +-----------------------------------------------------------------------+
29   | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |
30   | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |
31   +-----------------------------------------------------------------------+
32   | Project   : ADDI DATA         | Compiler : GCC                        |
33   | Modulname : addi_common.c     | Version  : 2.96                       |
34   +-------------------------------+---------------------------------------+
35   | Author    :           | Date     :                                    |
36   +-----------------------------------------------------------------------+
37   | Description : ADDI COMMON Main Module                                 |
38   +-----------------------------------------------------------------------+
39   | CONFIG OPTIONS                                                        |
40   |     option[0] - PCI bus number - if bus number and slot number are 0, |
41   |                              then driver search for first unused card |
42   |     option[1] - PCI slot number                                       |
43   |                                                                       |
44   |     option[2] = 0  - DMA ENABLE                                       |
45   |               = 1  - DMA DISABLE                                      |
46   +----------+-----------+------------------------------------------------+
47 */
48
49 #include <linux/kernel.h>
50 #include <linux/module.h>
51 #include <linux/sched.h>
52 #include <linux/mm.h>
53 #include <linux/errno.h>
54 #include <linux/ioport.h>
55 #include <linux/delay.h>
56 #include <linux/interrupt.h>
57 #include <linux/timex.h>
58 #include <linux/timer.h>
59 #include <linux/pci.h>
60 #include <linux/gfp.h>
61 #include <linux/io.h>
62 #include "../../comedidev.h"
63 #if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300)
64 #include <asm/i387.h>
65 #endif
66 #include "../comedi_fc.h"
67
68 #include "addi_common.h"
69 #include "addi_amcc_s5933.h"
70
71 #ifndef ADDIDATA_DRIVER_NAME
72 #define ADDIDATA_DRIVER_NAME    "addi_common"
73 #endif
74
75 /* Update-0.7.57->0.7.68MODULE_AUTHOR("ADDI-DATA GmbH <info@addi-data.com>"); */
76 /* Update-0.7.57->0.7.68MODULE_DESCRIPTION("Comedi ADDI-DATA module"); */
77 /* Update-0.7.57->0.7.68MODULE_LICENSE("GPL"); */
78
79 #define devpriv ((struct addi_private *)dev->private)
80 #define this_board ((const struct addi_board *)dev->board_ptr)
81
82 #if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300)
83 /* BYTE b_SaveFPUReg [94]; */
84
85 void fpu_begin(void)
86 {
87         /* asm ("fstenv b_SaveFPUReg"); */
88         kernel_fpu_begin();
89 }
90
91 void fpu_end(void)
92 {
93         /*  asm ("frstor b_SaveFPUReg"); */
94         kernel_fpu_end();
95 }
96 #endif
97
98 #include "addi_eeprom.c"
99 #if (defined (CONFIG_APCI_3120) || defined (CONFIG_APCI_3001))
100 #include "hwdrv_apci3120.c"
101 #endif
102 #ifdef CONFIG_APCI_1032
103 #include "hwdrv_apci1032.c"
104 #endif
105 #ifdef CONFIG_APCI_1516
106 #include "hwdrv_apci1516.c"
107 #endif
108 #ifdef CONFIG_APCI_2016
109 #include "hwdrv_apci2016.c"
110 #endif
111 #ifdef CONFIG_APCI_2032
112 #include "hwdrv_apci2032.c"
113 #endif
114 #ifdef CONFIG_APCI_2200
115 #include "hwdrv_apci2200.c"
116 #endif
117 #ifdef CONFIG_APCI_1564
118 #include "hwdrv_apci1564.c"
119 #endif
120 #ifdef CONFIG_APCI_1500
121 #include "hwdrv_apci1500.c"
122 #endif
123 #ifdef CONFIG_APCI_3501
124 #include "hwdrv_apci3501.c"
125 #endif
126 #ifdef CONFIG_APCI_035
127 #include "hwdrv_apci035.c"
128 #endif
129 #if (defined (CONFIG_APCI_3200) || defined (CONFIG_APCI_3300))
130 #include "hwdrv_apci3200.c"
131 #endif
132 #ifdef CONFIG_APCI_1710
133 #include "hwdrv_APCI1710.c"
134 #endif
135 #ifdef CONFIG_APCI_16XX
136 #include "hwdrv_apci16xx.c"
137 #endif
138 #ifdef CONFIG_APCI_3XXX
139 #include "hwdrv_apci3xxx.c"
140 #endif
141
142 #ifndef COMEDI_SUBD_TTLIO
143 #define COMEDI_SUBD_TTLIO   11  /* Digital Input Output But TTL */
144 #endif
145
146 static DEFINE_PCI_DEVICE_TABLE(addi_apci_tbl) = {
147 #ifdef CONFIG_APCI_3120
148         {PCI_DEVICE(APCI3120_BOARD_VENDOR_ID, 0x818D)},
149 #endif
150 #ifdef CONFIG_APCI_1032
151         {PCI_DEVICE(APCI1032_BOARD_VENDOR_ID, 0x1003)},
152 #endif
153 #ifdef CONFIG_APCI_1516
154         {PCI_DEVICE(APCI1516_BOARD_VENDOR_ID, 0x1001)},
155 #endif
156 #ifdef CONFIG_APCI_2016
157         {PCI_DEVICE(APCI2016_BOARD_VENDOR_ID, 0x1002)},
158 #endif
159 #ifdef CONFIG_APCI_2032
160         {PCI_DEVICE(APCI2032_BOARD_VENDOR_ID, 0x1004)},
161 #endif
162 #ifdef CONFIG_APCI_2200
163         {PCI_DEVICE(APCI2200_BOARD_VENDOR_ID, 0x1005)},
164 #endif
165 #ifdef CONFIG_APCI_1564
166         {PCI_DEVICE(APCI1564_BOARD_VENDOR_ID, 0x1006)},
167 #endif
168 #ifdef CONFIG_APCI_1500
169         {PCI_DEVICE(APCI1500_BOARD_VENDOR_ID, 0x80fc)},
170 #endif
171 #ifdef CONFIG_APCI_3001
172         {PCI_DEVICE(APCI3120_BOARD_VENDOR_ID, 0x828D)},
173 #endif
174 #ifdef CONFIG_APCI_3501
175         {PCI_DEVICE(APCI3501_BOARD_VENDOR_ID, 0x3001)},
176 #endif
177 #ifdef CONFIG_APCI_035
178         {PCI_DEVICE(APCI035_BOARD_VENDOR_ID,  0x0300)},
179 #endif
180 #ifdef CONFIG_APCI_3200
181         {PCI_DEVICE(APCI3200_BOARD_VENDOR_ID, 0x3000)},
182 #endif
183 #ifdef CONFIG_APCI_3300
184         {PCI_DEVICE(APCI3200_BOARD_VENDOR_ID, 0x3007)},
185 #endif
186 #ifdef CONFIG_APCI_1710
187         {PCI_DEVICE(APCI1710_BOARD_VENDOR_ID, APCI1710_BOARD_DEVICE_ID)},
188 #endif
189 #ifdef CONFIG_APCI_16XX
190         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x1009)},
191         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x100A)},
192 #endif
193 #ifdef CONFIG_APCI_3XXX
194         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3010)},
195         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300F)},
196         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300E)},
197         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3013)},
198         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3014)},
199         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3015)},
200         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3016)},
201         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3017)},
202         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3018)},
203         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3019)},
204         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301A)},
205         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301B)},
206         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301C)},
207         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301D)},
208         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301E)},
209         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301F)},
210         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3020)},
211         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3021)},
212         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3022)},
213         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3023)},
214         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300B)},
215         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3002)},
216         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3003)},
217         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3004)},
218         {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3024)},
219 #endif
220         {0}
221 };
222
223 MODULE_DEVICE_TABLE(pci, addi_apci_tbl);
224
225 static const struct addi_board boardtypes[] = {
226 #ifdef CONFIG_APCI_3120
227         {"apci3120",
228                         APCI3120_BOARD_VENDOR_ID,
229                         0x818D,
230                         AMCC_OP_REG_SIZE,
231                         APCI3120_ADDRESS_RANGE,
232                         8,
233                         0,
234                         ADDIDATA_NO_EEPROM,
235                         NULL,
236                         16,
237                         8,
238                         16,
239                         8,
240                         0xffff,
241                         0x3fff,
242                         &range_apci3120_ai,
243                         &range_apci3120_ao,
244                         4,
245                         4,
246                         0x0f,
247                         0,
248                         NULL,
249                         1,
250                         1,
251                         1,
252                         10000,
253                         100000,
254                         v_APCI3120_Interrupt,
255                         i_APCI3120_Reset,
256                         i_APCI3120_InsnConfigAnalogInput,
257                         i_APCI3120_InsnReadAnalogInput,
258                         NULL,
259                         NULL,
260                         i_APCI3120_CommandTestAnalogInput,
261                         i_APCI3120_CommandAnalogInput,
262                         i_APCI3120_StopCyclicAcquisition,
263                         NULL,
264                         i_APCI3120_InsnWriteAnalogOutput,
265                         NULL,
266                         NULL,
267                         i_APCI3120_InsnReadDigitalInput,
268                         NULL,
269                         i_APCI3120_InsnBitsDigitalInput,
270                         i_APCI3120_InsnConfigDigitalOutput,
271                         i_APCI3120_InsnWriteDigitalOutput,
272                         i_APCI3120_InsnBitsDigitalOutput,
273                         NULL,
274                         i_APCI3120_InsnConfigTimer,
275                         i_APCI3120_InsnWriteTimer,
276                         i_APCI3120_InsnReadTimer,
277                         NULL,
278                         NULL,
279                         NULL,
280                         NULL,
281                 NULL},
282 #endif
283 #ifdef CONFIG_APCI_1032
284         {"apci1032",
285                         APCI1032_BOARD_VENDOR_ID,
286                         0x1003,
287                         4,
288                         APCI1032_ADDRESS_RANGE,
289                         0,
290                         0,
291                         ADDIDATA_EEPROM,
292                         ADDIDATA_93C76,
293                         0,
294                         0,
295                         0,
296                         0,
297                         0,
298                         0,
299                         NULL,
300                         NULL,
301                         32,
302                         0,
303                         0,
304                         0,
305                         NULL,
306                         0,
307                         0,
308                         0,
309                         0,
310                         0,
311                         v_APCI1032_Interrupt,
312                         i_APCI1032_Reset,
313                         NULL,
314                         NULL,
315                         NULL,
316                         NULL,
317                         NULL,
318                         NULL,
319                         NULL,
320                         NULL,
321                         NULL,
322                         NULL,
323                         i_APCI1032_ConfigDigitalInput,
324                         i_APCI1032_Read1DigitalInput,
325                         NULL,
326                         i_APCI1032_ReadMoreDigitalInput,
327                         NULL,
328                         NULL,
329                         NULL,
330                         NULL,
331                         NULL,
332                         NULL,
333                         NULL,
334                         NULL,
335                         NULL,
336                         NULL,
337                         NULL,
338                 NULL},
339 #endif
340 #ifdef CONFIG_APCI_1516
341         {"apci1516",
342                         APCI1516_BOARD_VENDOR_ID,
343                         0x1001,
344                         128,
345                         APCI1516_ADDRESS_RANGE,
346                         32,
347                         0,
348                         ADDIDATA_EEPROM,
349                         ADDIDATA_S5920,
350                         0,
351                         0,
352                         0,
353                         0,
354                         0,
355                         0,
356                         NULL,
357                         NULL,
358                         8,
359                         8,
360                         0,
361                         0,
362                         NULL,
363                         0,
364                         1,
365                         0,
366                         0,
367                         0,
368                         NULL,
369                         i_APCI1516_Reset,
370                         NULL, NULL,
371                         NULL,
372                         NULL,
373                         NULL,
374                         NULL,
375                         NULL,
376                         NULL,
377                         NULL,
378                         NULL,
379                         NULL,
380                         i_APCI1516_Read1DigitalInput,
381                         NULL,
382                         i_APCI1516_ReadMoreDigitalInput,
383                         i_APCI1516_ConfigDigitalOutput,
384                         i_APCI1516_WriteDigitalOutput,
385                         i_APCI1516_ReadDigitalOutput,
386                         NULL,
387                         i_APCI1516_ConfigWatchdog,
388                         i_APCI1516_StartStopWriteWatchdog,
389                         i_APCI1516_ReadWatchdog,
390                         NULL,
391                         NULL,
392                         NULL,
393                         NULL,
394                 NULL},
395 #endif
396 #ifdef CONFIG_APCI_2016
397         {"apci2016",
398                         APCI2016_BOARD_VENDOR_ID,
399                         0x1002,
400                         128,
401                         APCI2016_ADDRESS_RANGE,
402                         32,
403                         0,
404                         ADDIDATA_EEPROM,
405                         ADDIDATA_S5920,
406                         0,
407                         0,
408                         0,
409                         0,
410                         0,
411                         0,
412                         NULL,
413                         NULL,
414                         0,
415                         16,
416                         0,
417                         0,
418                         NULL,
419                         0,
420                         1,
421                         0,
422                         0,
423                         0,
424                         NULL,
425                         i_APCI2016_Reset,
426                         NULL,
427                         NULL,
428                         NULL,
429                         NULL,
430                         NULL,
431                         NULL,
432                         NULL,
433                         NULL,
434                         NULL,
435                         NULL,
436                         NULL,
437                         NULL,
438                         NULL,
439                         NULL,
440                         i_APCI2016_ConfigDigitalOutput,
441                         i_APCI2016_WriteDigitalOutput,
442                         i_APCI2016_BitsDigitalOutput,
443                         NULL,
444                         i_APCI2016_ConfigWatchdog,
445                         i_APCI2016_StartStopWriteWatchdog,
446                         i_APCI2016_ReadWatchdog,
447                         NULL,
448                         NULL,
449                         NULL,
450                         NULL,
451                 NULL},
452 #endif
453 #ifdef CONFIG_APCI_2032
454         {"apci2032",
455                         APCI2032_BOARD_VENDOR_ID,
456                         0x1004,
457                         4,
458                         APCI2032_ADDRESS_RANGE,
459                         0,
460                         0,
461                         ADDIDATA_EEPROM,
462                         ADDIDATA_93C76,
463                         0,
464                         0,
465                         0,
466                         0,
467                         0,
468                         0,
469                         NULL,
470                         NULL,
471                         0,
472                         32,
473                         0xffffffff,
474                         0,
475                         NULL,
476                         0,
477                         1,
478                         0,
479                         0,
480                         0,
481                         v_APCI2032_Interrupt,
482                         i_APCI2032_Reset,
483                         NULL, NULL,
484                         NULL,
485                         NULL,
486                         NULL,
487                         NULL,
488                         NULL,
489                         NULL,
490                         NULL,
491                         NULL,
492                         NULL,
493                         NULL,
494                         NULL,
495                         NULL,
496                         i_APCI2032_ConfigDigitalOutput,
497                         i_APCI2032_WriteDigitalOutput,
498                         i_APCI2032_ReadDigitalOutput,
499                         i_APCI2032_ReadInterruptStatus,
500                         i_APCI2032_ConfigWatchdog,
501                         i_APCI2032_StartStopWriteWatchdog,
502                         i_APCI2032_ReadWatchdog,
503                         NULL,
504                         NULL,
505                         NULL,
506                         NULL,
507                 NULL},
508 #endif
509 #ifdef CONFIG_APCI_2200
510         {"apci2200",
511                         APCI2200_BOARD_VENDOR_ID,
512                         0x1005,
513                         4,
514                         APCI2200_ADDRESS_RANGE,
515                         0,
516                         0,
517                         ADDIDATA_EEPROM,
518                         ADDIDATA_93C76,
519                         0,
520                         0,
521                         0,
522                         0,
523                         0,
524                         0,
525                         NULL,
526                         NULL,
527                         8,
528                         16,
529                         0,
530                         0,
531                         NULL,
532                         0,
533                         1,
534                         0,
535                         0,
536                         0,
537                         NULL,
538                         i_APCI2200_Reset,
539                         NULL, NULL,
540                         NULL,
541                         NULL,
542                         NULL,
543                         NULL,
544                         NULL,
545                         NULL,
546                         NULL,
547                         NULL,
548                         NULL,
549                         i_APCI2200_Read1DigitalInput,
550                         NULL,
551                         i_APCI2200_ReadMoreDigitalInput,
552                         i_APCI2200_ConfigDigitalOutput,
553                         i_APCI2200_WriteDigitalOutput,
554                         i_APCI2200_ReadDigitalOutput,
555                         NULL,
556                         i_APCI2200_ConfigWatchdog,
557                         i_APCI2200_StartStopWriteWatchdog,
558                         i_APCI2200_ReadWatchdog,
559                         NULL,
560                         NULL,
561                         NULL,
562                         NULL,
563                 NULL},
564 #endif
565 #ifdef CONFIG_APCI_1564
566         {"apci1564",
567                         APCI1564_BOARD_VENDOR_ID,
568                         0x1006,
569                         128,
570                         APCI1564_ADDRESS_RANGE,
571                         0,
572                         0,
573                         ADDIDATA_EEPROM,
574                         ADDIDATA_93C76,
575                         0,
576                         0,
577                         0,
578                         0,
579                         0,
580                         0,
581                         NULL,
582                         NULL,
583                         32,
584                         32,
585                         0xffffffff,
586                         0,
587                         NULL,
588                         0,
589                         1,
590                         0,
591                         0,
592                         0,
593                         v_APCI1564_Interrupt,
594                         i_APCI1564_Reset,
595                         NULL,
596                         NULL,
597                         NULL,
598                         NULL,
599                         NULL,
600                         NULL,
601                         NULL,
602                         NULL,
603                         NULL,
604                         NULL,
605                         i_APCI1564_ConfigDigitalInput,
606                         i_APCI1564_Read1DigitalInput,
607                         NULL,
608                         i_APCI1564_ReadMoreDigitalInput,
609                         i_APCI1564_ConfigDigitalOutput,
610                         i_APCI1564_WriteDigitalOutput,
611                         i_APCI1564_ReadDigitalOutput,
612                         i_APCI1564_ReadInterruptStatus,
613                         i_APCI1564_ConfigTimerCounterWatchdog,
614                         i_APCI1564_StartStopWriteTimerCounterWatchdog,
615                         i_APCI1564_ReadTimerCounterWatchdog,
616                         NULL,
617                         NULL,
618                         NULL,
619                         NULL,
620                 NULL},
621 #endif
622 #ifdef CONFIG_APCI_1500
623         {"apci1500",
624                         APCI1500_BOARD_VENDOR_ID,
625                         0x80fc,
626                         128,
627                         APCI1500_ADDRESS_RANGE,
628                         4,
629                         0,
630                         ADDIDATA_NO_EEPROM,
631                         NULL,
632                         0,
633                         0,
634                         0,
635                         0,
636                         0,
637                         0,
638                         NULL,
639                         NULL,
640                         16,
641                         16,
642                         0xffff,
643                         0,
644                         NULL,
645                         0,
646                         1,
647                         0,
648                         0,
649                         0,
650                         v_APCI1500_Interrupt,
651                         i_APCI1500_Reset,
652                         NULL,
653                         NULL,
654                         NULL,
655                         NULL,
656                         NULL,
657                         NULL,
658                         NULL,
659                         NULL,
660                         NULL,
661                         NULL,
662                         i_APCI1500_ConfigDigitalInputEvent,
663                         i_APCI1500_Initialisation,
664                         i_APCI1500_StartStopInputEvent,
665                         i_APCI1500_ReadMoreDigitalInput,
666                         i_APCI1500_ConfigDigitalOutputErrorInterrupt,
667                         i_APCI1500_WriteDigitalOutput,
668                         i_APCI1500_ConfigureInterrupt,
669                         NULL,
670                         i_APCI1500_ConfigCounterTimerWatchdog,
671                         i_APCI1500_StartStopTriggerTimerCounterWatchdog,
672                         i_APCI1500_ReadInterruptMask,
673                         i_APCI1500_ReadCounterTimerWatchdog,
674                         NULL,
675                         NULL,
676                         NULL,
677                 NULL},
678 #endif
679 #ifdef CONFIG_APCI_3001
680         {"apci3001",
681                         APCI3120_BOARD_VENDOR_ID,
682                         0x828D,
683                         AMCC_OP_REG_SIZE,
684                         APCI3120_ADDRESS_RANGE,
685                         8,
686                         0,
687                         ADDIDATA_NO_EEPROM,
688                         NULL,
689                         16,
690                         8,
691                         16,
692                         0,
693                         0xfff,
694                         0,
695                         &range_apci3120_ai,
696                         NULL,
697                         4,
698                         4,
699                         0x0f,
700                         0,
701                         NULL,
702                         1,
703                         1,
704                         1,
705                         10000,
706                         100000,
707                         v_APCI3120_Interrupt,
708                         i_APCI3120_Reset,
709                         i_APCI3120_InsnConfigAnalogInput,
710                         i_APCI3120_InsnReadAnalogInput,
711                         NULL,
712                         NULL,
713                         i_APCI3120_CommandTestAnalogInput,
714                         i_APCI3120_CommandAnalogInput,
715                         i_APCI3120_StopCyclicAcquisition,
716                         NULL,
717                         NULL,
718                         NULL,
719                         NULL,
720                         i_APCI3120_InsnReadDigitalInput,
721                         NULL,
722                         i_APCI3120_InsnBitsDigitalInput,
723                         i_APCI3120_InsnConfigDigitalOutput,
724                         i_APCI3120_InsnWriteDigitalOutput,
725                         i_APCI3120_InsnBitsDigitalOutput,
726                         NULL,
727                         i_APCI3120_InsnConfigTimer,
728                         i_APCI3120_InsnWriteTimer,
729                         i_APCI3120_InsnReadTimer,
730                         NULL,
731                         NULL,
732                         NULL,
733                         NULL,
734                 NULL},
735 #endif
736 #ifdef CONFIG_APCI_3501
737         {"apci3501",
738                         APCI3501_BOARD_VENDOR_ID,
739                         0x3001,
740                         64,
741                         APCI3501_ADDRESS_RANGE,
742                         0,
743                         0,
744                         ADDIDATA_EEPROM,
745                         ADDIDATA_S5933,
746                         0,
747                         0,
748                         0,
749                         8,
750                         0,
751                         16383,
752                         NULL,
753                         &range_apci3501_ao,
754                         2,
755                         2,
756                         0x3,
757                         0,
758                         NULL,
759                         0,
760                         1,
761                         0,
762                         0,
763                         0,
764                         v_APCI3501_Interrupt,
765                         i_APCI3501_Reset,
766                         NULL, NULL,
767                         NULL,
768                         NULL,
769                         NULL,
770                         NULL,
771                         NULL,
772                         i_APCI3501_ConfigAnalogOutput,
773                         i_APCI3501_WriteAnalogOutput,
774                         NULL,
775                         NULL,
776                         NULL,
777                         NULL,
778                         i_APCI3501_ReadDigitalInput,
779                         i_APCI3501_ConfigDigitalOutput,
780                         i_APCI3501_WriteDigitalOutput,
781                         i_APCI3501_ReadDigitalOutput,
782                         NULL,
783                         i_APCI3501_ConfigTimerCounterWatchdog,
784                         i_APCI3501_StartStopWriteTimerCounterWatchdog,
785                         i_APCI3501_ReadTimerCounterWatchdog,
786                         NULL,
787                         NULL,
788                         NULL,
789                         NULL,
790                 NULL},
791 #endif
792 #ifdef CONFIG_APCI_035
793         {"apci035",
794                         APCI035_BOARD_VENDOR_ID,
795                         0x0300,
796                         127,
797                         APCI035_ADDRESS_RANGE,
798                         0,
799                         0,
800                         1,
801                         ADDIDATA_S5920,
802                         16,
803                         8,
804                         16,
805                         0,
806                         0xff,
807                         0,
808                         &range_apci035_ai,
809                         NULL,
810                         0,
811                         0,
812                         0,
813                         0,
814                         NULL,
815                         0,
816                         1,
817                         0,
818                         10000,
819                         100000,
820                         v_APCI035_Interrupt,
821                         i_APCI035_Reset,
822                         i_APCI035_ConfigAnalogInput,
823                         i_APCI035_ReadAnalogInput,
824                         NULL,
825                         NULL,
826                         NULL,
827                         NULL,
828                         NULL,
829                         NULL,
830                         NULL,
831                         NULL,
832                         NULL,
833                         NULL,
834                         NULL,
835                         NULL,
836                         NULL,
837                         NULL,
838                         NULL,
839                         NULL,
840                         i_APCI035_ConfigTimerWatchdog,
841                         i_APCI035_StartStopWriteTimerWatchdog,
842                         i_APCI035_ReadTimerWatchdog,
843                         NULL,
844                         NULL,
845                         NULL,
846                         NULL,
847                 NULL},
848 #endif
849 #ifdef CONFIG_APCI_3200
850         {"apci3200",
851                         APCI3200_BOARD_VENDOR_ID,
852                         0x3000,
853                         128,
854                         256,
855                         4,
856                         4,
857                         ADDIDATA_EEPROM,
858                         ADDIDATA_S5920,
859                         16,
860                         8,
861                         16,
862                         0,
863                         0x3ffff,
864                         0,
865                         &range_apci3200_ai,
866                         NULL,
867                         4,
868                         4,
869                         0,
870                         0,
871                         NULL,
872                         0,
873                         0,
874                         0,
875                         10000,
876                         100000,
877                         v_APCI3200_Interrupt,
878                         i_APCI3200_Reset,
879                         i_APCI3200_ConfigAnalogInput,
880                         i_APCI3200_ReadAnalogInput,
881                         i_APCI3200_InsnWriteReleaseAnalogInput,
882                         i_APCI3200_InsnBits_AnalogInput_Test,
883                         i_APCI3200_CommandTestAnalogInput,
884                         i_APCI3200_CommandAnalogInput,
885                         i_APCI3200_StopCyclicAcquisition,
886                         NULL,
887                         NULL,
888                         NULL,
889                         NULL,
890                         NULL,
891                         NULL,
892                         i_APCI3200_ReadDigitalInput,
893                         i_APCI3200_ConfigDigitalOutput,
894                         i_APCI3200_WriteDigitalOutput,
895                         i_APCI3200_ReadDigitalOutput,
896                         NULL,
897                         NULL,
898                         NULL,
899                         NULL,
900                         NULL,
901                         NULL,
902                         NULL,
903                         NULL,
904                 NULL},
905 #endif
906 #ifdef CONFIG_APCI_3300
907         /* Begin JK     .20.10.2004 = APCI-3300 integration */
908         {"apci3300",
909                         APCI3200_BOARD_VENDOR_ID,
910                         0x3007,
911                         128,
912                         256,
913                         4,
914                         4,
915                         ADDIDATA_EEPROM,
916                         ADDIDATA_S5920,
917                         0,
918                         8,
919                         8,
920                         0,
921                         0x3ffff,
922                         0,
923                         &range_apci3300_ai,
924                         NULL,
925                         4,
926                         4,
927                         0,
928                         0,
929                         NULL,
930                         0,
931                         0,
932                         0,
933                         10000,
934                         100000,
935                         v_APCI3200_Interrupt,
936                         i_APCI3200_Reset,
937                         i_APCI3200_ConfigAnalogInput,
938                         i_APCI3200_ReadAnalogInput,
939                         i_APCI3200_InsnWriteReleaseAnalogInput,
940                         i_APCI3200_InsnBits_AnalogInput_Test,
941                         i_APCI3200_CommandTestAnalogInput,
942                         i_APCI3200_CommandAnalogInput,
943                         i_APCI3200_StopCyclicAcquisition,
944                         NULL,
945                         NULL,
946                         NULL,
947                         NULL,
948                         NULL,
949                         NULL,
950                         i_APCI3200_ReadDigitalInput,
951                         i_APCI3200_ConfigDigitalOutput,
952                         i_APCI3200_WriteDigitalOutput,
953                         i_APCI3200_ReadDigitalOutput,
954                         NULL,
955                         NULL,
956                         NULL,
957                         NULL,
958                         NULL,
959                         NULL,
960                         NULL,
961                         NULL,
962                 NULL},
963 #endif
964 #ifdef CONFIG_APCI_1710
965         {"apci1710", APCI1710_BOARD_VENDOR_ID, APCI1710_BOARD_DEVICE_ID,
966                         128,
967                         8,
968                         256,
969                         0,
970                         ADDIDATA_NO_EEPROM,
971                         NULL,
972                         0,
973                         0,
974                         0,
975                         0,
976                         0,
977                         0,
978                         NULL,
979                         NULL,
980                         0,
981                         0,
982                         0,
983                         0,
984                         NULL,
985                         0,
986                         0,
987                         0,
988                         0,
989                         0,
990                         v_APCI1710_Interrupt,
991                         i_APCI1710_Reset,
992                         NULL,
993                         NULL,
994                         NULL,
995                         NULL,
996                         NULL,
997                         NULL,
998                         NULL,
999                         NULL,
1000                         NULL,
1001                         NULL,
1002                         NULL,
1003                         NULL,
1004                         NULL,
1005                         NULL,
1006                         NULL,
1007                         NULL,
1008                         NULL,
1009                         NULL,
1010                         NULL,
1011                         NULL,
1012                         NULL,
1013                         NULL,
1014                         NULL,
1015                         NULL,
1016                         NULL,
1017                 NULL},
1018 #endif
1019 #ifdef CONFIG_APCI_16XX
1020         {"apci1648",
1021                         PCI_VENDOR_ID_ADDIDATA,
1022                         0x1009,
1023                         128,
1024                         0,
1025                         0,
1026                         0,
1027                         ADDIDATA_NO_EEPROM,
1028                         NULL,
1029                         0,
1030                         0,
1031                         0,
1032                         0,
1033                         0,
1034                         0,
1035                         NULL,
1036                         NULL,
1037                         0,
1038                         0,
1039                         0,
1040                         48,
1041                         &range_apci16xx_ttl,
1042                         0,
1043                         0,
1044                         0,
1045                         0,
1046                         0,
1047                         NULL,
1048                         i_APCI16XX_Reset,
1049                         NULL,
1050                         NULL,
1051                         NULL,
1052                         NULL,
1053                         NULL,
1054                         NULL,
1055                         NULL,
1056                         NULL,
1057                         NULL,
1058                         NULL,
1059                         NULL,
1060                         NULL,
1061                         NULL,
1062                         NULL,
1063                         NULL,
1064                         NULL,
1065                         NULL,
1066                         NULL,
1067                         NULL,
1068                         NULL,
1069                         NULL,
1070                         NULL,
1071                         i_APCI16XX_InsnConfigInitTTLIO,
1072                         i_APCI16XX_InsnBitsReadTTLIO,
1073                         i_APCI16XX_InsnReadTTLIOAllPortValue,
1074                 i_APCI16XX_InsnBitsWriteTTLIO},
1075
1076         {"apci1696",
1077                         PCI_VENDOR_ID_ADDIDATA,
1078                         0x100A,
1079                         128,
1080                         0,
1081                         0,
1082                         0,
1083                         ADDIDATA_NO_EEPROM,
1084                         NULL,
1085                         0,
1086                         0,
1087                         0,
1088                         0,
1089                         0,
1090                         0,
1091                         NULL,
1092                         NULL,
1093                         0,
1094                         0,
1095                         0,
1096                         96,
1097                         &range_apci16xx_ttl,
1098                         0,
1099                         0,
1100                         0,
1101                         0,
1102                         0,
1103                         NULL,
1104                         i_APCI16XX_Reset,
1105                         NULL,
1106                         NULL,
1107                         NULL,
1108                         NULL,
1109                         NULL,
1110                         NULL,
1111                         NULL,
1112                         NULL,
1113                         NULL,
1114                         NULL,
1115                         NULL,
1116                         NULL,
1117                         NULL,
1118                         NULL,
1119                         NULL,
1120                         NULL,
1121                         NULL,
1122                         NULL,
1123                         NULL,
1124                         NULL,
1125                         NULL,
1126                         NULL,
1127                         i_APCI16XX_InsnConfigInitTTLIO,
1128                         i_APCI16XX_InsnBitsReadTTLIO,
1129                         i_APCI16XX_InsnReadTTLIOAllPortValue,
1130                 i_APCI16XX_InsnBitsWriteTTLIO},
1131 #endif
1132 #ifdef CONFIG_APCI_3XXX
1133         {"apci3000-16",
1134                         PCI_VENDOR_ID_ADDIDATA,
1135                         0x3010,
1136                         256,
1137                         256,
1138                         256,
1139                         256,
1140                         ADDIDATA_NO_EEPROM,
1141                         ADDIDATA_9054,
1142                         16,
1143                         8,
1144                         16,
1145                         0,
1146                         4095,
1147                         0,
1148                         &range_apci3XXX_ai,
1149                         NULL,
1150                         0,
1151                         0,
1152                         0,
1153                         24,
1154                         &range_apci3XXX_ttl,
1155                         0,
1156                         0,
1157                         6,
1158                         10000,
1159                         0,
1160                         v_APCI3XXX_Interrupt,
1161                         i_APCI3XXX_Reset,
1162                         i_APCI3XXX_InsnConfigAnalogInput,
1163                         i_APCI3XXX_InsnReadAnalogInput,
1164                         NULL,
1165                         NULL,
1166                         NULL,
1167                         NULL,
1168                         NULL,
1169                         NULL,
1170                         NULL,
1171                         NULL,
1172                         NULL,
1173                         NULL,
1174                         NULL,
1175                         NULL,
1176                         NULL,
1177                         NULL,
1178                         NULL,
1179                         NULL,
1180                         NULL,
1181                         NULL,
1182                         NULL,
1183                         NULL,
1184                         i_APCI3XXX_InsnConfigInitTTLIO,
1185                         i_APCI3XXX_InsnBitsTTLIO,
1186                         i_APCI3XXX_InsnReadTTLIO,
1187                 i_APCI3XXX_InsnWriteTTLIO},
1188
1189         {"apci3000-8",
1190                         PCI_VENDOR_ID_ADDIDATA,
1191                         0x300F,
1192                         256,
1193                         256,
1194                         256,
1195                         256,
1196                         ADDIDATA_NO_EEPROM,
1197                         ADDIDATA_9054,
1198                         8,
1199                         4,
1200                         8,
1201                         0,
1202                         4095,
1203                         0,
1204                         &range_apci3XXX_ai,
1205                         NULL,
1206                         0,
1207                         0,
1208                         0,
1209                         24,
1210                         &range_apci3XXX_ttl,
1211                         0,
1212                         0,
1213                         6,
1214                         10000,
1215                         0,
1216                         v_APCI3XXX_Interrupt,
1217                         i_APCI3XXX_Reset,
1218                         i_APCI3XXX_InsnConfigAnalogInput,
1219                         i_APCI3XXX_InsnReadAnalogInput,
1220                         NULL,
1221                         NULL,
1222                         NULL,
1223                         NULL,
1224                         NULL,
1225                         NULL,
1226                         NULL,
1227                         NULL,
1228                         NULL,
1229                         NULL,
1230                         NULL,
1231                         NULL,
1232                         NULL,
1233                         NULL,
1234                         NULL,
1235                         NULL,
1236                         NULL,
1237                         NULL,
1238                         NULL,
1239                         NULL,
1240                         i_APCI3XXX_InsnConfigInitTTLIO,
1241                         i_APCI3XXX_InsnBitsTTLIO,
1242                         i_APCI3XXX_InsnReadTTLIO,
1243                 i_APCI3XXX_InsnWriteTTLIO},
1244
1245         {"apci3000-4",
1246                         PCI_VENDOR_ID_ADDIDATA,
1247                         0x300E,
1248                         256,
1249                         256,
1250                         256,
1251                         256,
1252                         ADDIDATA_NO_EEPROM,
1253                         ADDIDATA_9054,
1254                         4,
1255                         2,
1256                         4,
1257                         0,
1258                         4095,
1259                         0,
1260                         &range_apci3XXX_ai,
1261                         NULL,
1262                         0,
1263                         0,
1264                         0,
1265                         24,
1266                         &range_apci3XXX_ttl,
1267                         0,
1268                         0,
1269                         6,
1270                         10000,
1271                         0,
1272                         v_APCI3XXX_Interrupt,
1273                         i_APCI3XXX_Reset,
1274                         i_APCI3XXX_InsnConfigAnalogInput,
1275                         i_APCI3XXX_InsnReadAnalogInput,
1276                         NULL,
1277                         NULL,
1278                         NULL,
1279                         NULL,
1280                         NULL,
1281                         NULL,
1282                         NULL,
1283                         NULL,
1284                         NULL,
1285                         NULL,
1286                         NULL,
1287                         NULL,
1288                         NULL,
1289                         NULL,
1290                         NULL,
1291                         NULL,
1292                         NULL,
1293                         NULL,
1294                         NULL,
1295                         NULL,
1296                         i_APCI3XXX_InsnConfigInitTTLIO,
1297                         i_APCI3XXX_InsnBitsTTLIO,
1298                         i_APCI3XXX_InsnReadTTLIO,
1299                 i_APCI3XXX_InsnWriteTTLIO},
1300
1301         {"apci3006-16",
1302                         PCI_VENDOR_ID_ADDIDATA,
1303                         0x3013,
1304                         256,
1305                         256,
1306                         256,
1307                         256,
1308                         ADDIDATA_NO_EEPROM,
1309                         ADDIDATA_9054,
1310                         16,
1311                         8,
1312                         16,
1313                         0,
1314                         65535,
1315                         0,
1316                         &range_apci3XXX_ai,
1317                         NULL,
1318                         0,
1319                         0,
1320                         0,
1321                         24,
1322                         &range_apci3XXX_ttl,
1323                         0,
1324                         0,
1325                         6,
1326                         10000,
1327                         0,
1328                         v_APCI3XXX_Interrupt,
1329                         i_APCI3XXX_Reset,
1330                         i_APCI3XXX_InsnConfigAnalogInput,
1331                         i_APCI3XXX_InsnReadAnalogInput,
1332                         NULL,
1333                         NULL,
1334                         NULL,
1335                         NULL,
1336                         NULL,
1337                         NULL,
1338                         NULL,
1339                         NULL,
1340                         NULL,
1341                         NULL,
1342                         NULL,
1343                         NULL,
1344                         NULL,
1345                         NULL,
1346                         NULL,
1347                         NULL,
1348                         NULL,
1349                         NULL,
1350                         NULL,
1351                         NULL,
1352                         i_APCI3XXX_InsnConfigInitTTLIO,
1353                         i_APCI3XXX_InsnBitsTTLIO,
1354                         i_APCI3XXX_InsnReadTTLIO,
1355                 i_APCI3XXX_InsnWriteTTLIO},
1356
1357         {"apci3006-8",
1358                         PCI_VENDOR_ID_ADDIDATA,
1359                         0x3014,
1360                         256,
1361                         256,
1362                         256,
1363                         256,
1364                         ADDIDATA_NO_EEPROM,
1365                         ADDIDATA_9054,
1366                         8,
1367                         4,
1368                         8,
1369                         0,
1370                         65535,
1371                         0,
1372                         &range_apci3XXX_ai,
1373                         NULL,
1374                         0,
1375                         0,
1376                         0,
1377                         24,
1378                         &range_apci3XXX_ttl,
1379                         0,
1380                         0,
1381                         6,
1382                         10000,
1383                         0,
1384                         v_APCI3XXX_Interrupt,
1385                         i_APCI3XXX_Reset,
1386                         i_APCI3XXX_InsnConfigAnalogInput,
1387                         i_APCI3XXX_InsnReadAnalogInput,
1388                         NULL,
1389                         NULL,
1390                         NULL,
1391                         NULL,
1392                         NULL,
1393                         NULL,
1394                         NULL,
1395                         NULL,
1396                         NULL,
1397                         NULL,
1398                         NULL,
1399                         NULL,
1400                         NULL,
1401                         NULL,
1402                         NULL,
1403                         NULL,
1404                         NULL,
1405                         NULL,
1406                         NULL,
1407                         NULL,
1408                         i_APCI3XXX_InsnConfigInitTTLIO,
1409                         i_APCI3XXX_InsnBitsTTLIO,
1410                         i_APCI3XXX_InsnReadTTLIO,
1411                 i_APCI3XXX_InsnWriteTTLIO},
1412
1413         {"apci3006-4",
1414                         PCI_VENDOR_ID_ADDIDATA,
1415                         0x3015,
1416                         256,
1417                         256,
1418                         256,
1419                         256,
1420                         ADDIDATA_NO_EEPROM,
1421                         ADDIDATA_9054,
1422                         4,
1423                         2,
1424                         4,
1425                         0,
1426                         65535,
1427                         0,
1428                         &range_apci3XXX_ai,
1429                         NULL,
1430                         0,
1431                         0,
1432                         0,
1433                         24,
1434                         &range_apci3XXX_ttl,
1435                         0,
1436                         0,
1437                         6,
1438                         10000,
1439                         0,
1440                         v_APCI3XXX_Interrupt,
1441                         i_APCI3XXX_Reset,
1442                         i_APCI3XXX_InsnConfigAnalogInput,
1443                         i_APCI3XXX_InsnReadAnalogInput,
1444                         NULL,
1445                         NULL,
1446                         NULL,
1447                         NULL,
1448                         NULL,
1449                         NULL,
1450                         NULL,
1451                         NULL,
1452                         NULL,
1453                         NULL,
1454                         NULL,
1455                         NULL,
1456                         NULL,
1457                         NULL,
1458                         NULL,
1459                         NULL,
1460                         NULL,
1461                         NULL,
1462                         NULL,
1463                         NULL,
1464                         i_APCI3XXX_InsnConfigInitTTLIO,
1465                         i_APCI3XXX_InsnBitsTTLIO,
1466                         i_APCI3XXX_InsnReadTTLIO,
1467                 i_APCI3XXX_InsnWriteTTLIO},
1468
1469         {"apci3010-16",
1470                         PCI_VENDOR_ID_ADDIDATA,
1471                         0x3016,
1472                         256,
1473                         256,
1474                         256,
1475                         256,
1476                         ADDIDATA_NO_EEPROM,
1477                         ADDIDATA_9054,
1478                         16,
1479                         8,
1480                         16,
1481                         0,
1482                         4095,
1483                         0,
1484                         &range_apci3XXX_ai,
1485                         NULL,
1486                         4,
1487                         4,
1488                         1,
1489                         24,
1490                         &range_apci3XXX_ttl,
1491                         0,
1492                         0,
1493                         6,
1494                         5000,
1495                         0,
1496                         v_APCI3XXX_Interrupt,
1497                         i_APCI3XXX_Reset,
1498                         i_APCI3XXX_InsnConfigAnalogInput,
1499                         i_APCI3XXX_InsnReadAnalogInput,
1500                         NULL,
1501                         NULL,
1502                         NULL,
1503                         NULL,
1504                         NULL,
1505                         NULL,
1506                         NULL,
1507                         NULL,
1508                         NULL,
1509                         i_APCI3XXX_InsnReadDigitalInput,
1510                         NULL,
1511                         i_APCI3XXX_InsnBitsDigitalInput,
1512                         NULL,
1513                         i_APCI3XXX_InsnWriteDigitalOutput,
1514                         i_APCI3XXX_InsnBitsDigitalOutput,
1515                         i_APCI3XXX_InsnReadDigitalOutput,
1516                         NULL,
1517                         NULL,
1518                         NULL,
1519                         NULL,
1520                         i_APCI3XXX_InsnConfigInitTTLIO,
1521                         i_APCI3XXX_InsnBitsTTLIO,
1522                         i_APCI3XXX_InsnReadTTLIO,
1523                 i_APCI3XXX_InsnWriteTTLIO},
1524
1525         {"apci3010-8",
1526                         PCI_VENDOR_ID_ADDIDATA,
1527                         0x3017,
1528                         256,
1529                         256,
1530                         256,
1531                         256,
1532                         ADDIDATA_NO_EEPROM,
1533                         ADDIDATA_9054,
1534                         8,
1535                         4,
1536                         8,
1537                         0,
1538                         4095,
1539                         0,
1540                         &range_apci3XXX_ai,
1541                         NULL,
1542                         4,
1543                         4,
1544                         1,
1545                         24,
1546                         &range_apci3XXX_ttl,
1547                         0,
1548                         0,
1549                         6,
1550                         5000,
1551                         0,
1552                         v_APCI3XXX_Interrupt,
1553                         i_APCI3XXX_Reset,
1554                         i_APCI3XXX_InsnConfigAnalogInput,
1555                         i_APCI3XXX_InsnReadAnalogInput,
1556                         NULL,
1557                         NULL,
1558                         NULL,
1559                         NULL,
1560                         NULL,
1561                         NULL,
1562                         NULL,
1563                         NULL,
1564                         NULL,
1565                         i_APCI3XXX_InsnReadDigitalInput,
1566                         NULL,
1567                         i_APCI3XXX_InsnBitsDigitalInput,
1568                         NULL,
1569                         i_APCI3XXX_InsnWriteDigitalOutput,
1570                         i_APCI3XXX_InsnBitsDigitalOutput,
1571                         i_APCI3XXX_InsnReadDigitalOutput,
1572                         NULL,
1573                         NULL,
1574                         NULL,
1575                         NULL,
1576                         i_APCI3XXX_InsnConfigInitTTLIO,
1577                         i_APCI3XXX_InsnBitsTTLIO,
1578                         i_APCI3XXX_InsnReadTTLIO,
1579                 i_APCI3XXX_InsnWriteTTLIO},
1580
1581         {"apci3010-4",
1582                         PCI_VENDOR_ID_ADDIDATA,
1583                         0x3018,
1584                         256,
1585                         256,
1586                         256,
1587                         256,
1588                         ADDIDATA_NO_EEPROM,
1589                         ADDIDATA_9054,
1590                         4,
1591                         2,
1592                         4,
1593                         0,
1594                         4095,
1595                         0,
1596                         &range_apci3XXX_ai,
1597                         NULL,
1598                         4,
1599                         4,
1600                         1,
1601                         24,
1602                         &range_apci3XXX_ttl,
1603                         0,
1604                         0,
1605                         6,
1606                         5000,
1607                         0,
1608                         v_APCI3XXX_Interrupt,
1609                         i_APCI3XXX_Reset,
1610                         i_APCI3XXX_InsnConfigAnalogInput,
1611                         i_APCI3XXX_InsnReadAnalogInput,
1612                         NULL,
1613                         NULL,
1614                         NULL,
1615                         NULL,
1616                         NULL,
1617                         NULL,
1618                         NULL,
1619                         NULL,
1620                         NULL,
1621                         i_APCI3XXX_InsnReadDigitalInput,
1622                         NULL,
1623                         i_APCI3XXX_InsnBitsDigitalInput,
1624                         NULL,
1625                         i_APCI3XXX_InsnWriteDigitalOutput,
1626                         i_APCI3XXX_InsnBitsDigitalOutput,
1627                         i_APCI3XXX_InsnReadDigitalOutput,
1628                         NULL,
1629                         NULL,
1630                         NULL,
1631                         NULL,
1632                         i_APCI3XXX_InsnConfigInitTTLIO,
1633                         i_APCI3XXX_InsnBitsTTLIO,
1634                         i_APCI3XXX_InsnReadTTLIO,
1635                 i_APCI3XXX_InsnWriteTTLIO},
1636
1637         {"apci3016-16",
1638                         PCI_VENDOR_ID_ADDIDATA,
1639                         0x3019,
1640                         256,
1641                         256,
1642                         256,
1643                         256,
1644                         ADDIDATA_NO_EEPROM,
1645                         ADDIDATA_9054,
1646                         16,
1647                         8,
1648                         16,
1649                         0,
1650                         65535,
1651                         0,
1652                         &range_apci3XXX_ai,
1653                         NULL,
1654                         4,
1655                         4,
1656                         1,
1657                         24,
1658                         &range_apci3XXX_ttl,
1659                         0,
1660                         0,
1661                         6,
1662                         5000,
1663                         0,
1664                         v_APCI3XXX_Interrupt,
1665                         i_APCI3XXX_Reset,
1666                         i_APCI3XXX_InsnConfigAnalogInput,
1667                         i_APCI3XXX_InsnReadAnalogInput,
1668                         NULL,
1669                         NULL,
1670                         NULL,
1671                         NULL,
1672                         NULL,
1673                         NULL,
1674                         NULL,
1675                         NULL,
1676                         NULL,
1677                         i_APCI3XXX_InsnReadDigitalInput,
1678                         NULL,
1679                         i_APCI3XXX_InsnBitsDigitalInput,
1680                         NULL,
1681                         i_APCI3XXX_InsnWriteDigitalOutput,
1682                         i_APCI3XXX_InsnBitsDigitalOutput,
1683                         i_APCI3XXX_InsnReadDigitalOutput,
1684                         NULL,
1685                         NULL,
1686                         NULL,
1687                         NULL,
1688                         i_APCI3XXX_InsnConfigInitTTLIO,
1689                         i_APCI3XXX_InsnBitsTTLIO,
1690                         i_APCI3XXX_InsnReadTTLIO,
1691                 i_APCI3XXX_InsnWriteTTLIO},
1692
1693         {"apci3016-8",
1694                         PCI_VENDOR_ID_ADDIDATA,
1695                         0x301A,
1696                         256,
1697                         256,
1698                         256,
1699                         256,
1700                         ADDIDATA_NO_EEPROM,
1701                         ADDIDATA_9054,
1702                         8,
1703                         4,
1704                         8,
1705                         0,
1706                         65535,
1707                         0,
1708                         &range_apci3XXX_ai,
1709                         NULL,
1710                         4,
1711                         4,
1712                         1,
1713                         24,
1714                         &range_apci3XXX_ttl,
1715                         0,
1716                         0,
1717                         6,
1718                         5000,
1719                         0,
1720                         v_APCI3XXX_Interrupt,
1721                         i_APCI3XXX_Reset,
1722                         i_APCI3XXX_InsnConfigAnalogInput,
1723                         i_APCI3XXX_InsnReadAnalogInput,
1724                         NULL,
1725                         NULL,
1726                         NULL,
1727                         NULL,
1728                         NULL,
1729                         NULL,
1730                         NULL,
1731                         NULL,
1732                         NULL,
1733                         i_APCI3XXX_InsnReadDigitalInput,
1734                         NULL,
1735                         i_APCI3XXX_InsnBitsDigitalInput,
1736                         NULL,
1737                         i_APCI3XXX_InsnWriteDigitalOutput,
1738                         i_APCI3XXX_InsnBitsDigitalOutput,
1739                         i_APCI3XXX_InsnReadDigitalOutput,
1740                         NULL,
1741                         NULL,
1742                         NULL,
1743                         NULL,
1744                         i_APCI3XXX_InsnConfigInitTTLIO,
1745                         i_APCI3XXX_InsnBitsTTLIO,
1746                         i_APCI3XXX_InsnReadTTLIO,
1747                 i_APCI3XXX_InsnWriteTTLIO},
1748
1749         {"apci3016-4",
1750                         PCI_VENDOR_ID_ADDIDATA,
1751                         0x301B,
1752                         256,
1753                         256,
1754                         256,
1755                         256,
1756                         ADDIDATA_NO_EEPROM,
1757                         ADDIDATA_9054,
1758                         4,
1759                         2,
1760                         4,
1761                         0,
1762                         65535,
1763                         0,
1764                         &range_apci3XXX_ai,
1765                         NULL,
1766                         4,
1767                         4,
1768                         1,
1769                         24,
1770                         &range_apci3XXX_ttl,
1771                         0,
1772                         0,
1773                         6,
1774                         5000,
1775                         0,
1776                         v_APCI3XXX_Interrupt,
1777                         i_APCI3XXX_Reset,
1778                         i_APCI3XXX_InsnConfigAnalogInput,
1779                         i_APCI3XXX_InsnReadAnalogInput,
1780                         NULL,
1781                         NULL,
1782                         NULL,
1783                         NULL,
1784                         NULL,
1785                         NULL,
1786                         NULL,
1787                         NULL,
1788                         NULL,
1789                         i_APCI3XXX_InsnReadDigitalInput,
1790                         NULL,
1791                         i_APCI3XXX_InsnBitsDigitalInput,
1792                         NULL,
1793                         i_APCI3XXX_InsnWriteDigitalOutput,
1794                         i_APCI3XXX_InsnBitsDigitalOutput,
1795                         i_APCI3XXX_InsnReadDigitalOutput,
1796                         NULL,
1797                         NULL,
1798                         NULL,
1799                         NULL,
1800                         i_APCI3XXX_InsnConfigInitTTLIO,
1801                         i_APCI3XXX_InsnBitsTTLIO,
1802                         i_APCI3XXX_InsnReadTTLIO,
1803                 i_APCI3XXX_InsnWriteTTLIO},
1804
1805         {"apci3100-16-4",
1806                         PCI_VENDOR_ID_ADDIDATA,
1807                         0x301C,
1808                         256,
1809                         256,
1810                         256,
1811                         256,
1812                         ADDIDATA_NO_EEPROM,
1813                         ADDIDATA_9054,
1814                         16,
1815                         8,
1816                         16,
1817                         4,
1818                         4095,
1819                         4095,
1820                         &range_apci3XXX_ai,
1821                         &range_apci3XXX_ao,
1822                         0,
1823                         0,
1824                         0,
1825                         24,
1826                         &range_apci3XXX_ttl,
1827                         0,
1828                         0,
1829                         6,
1830                         10000,
1831                         0,
1832                         v_APCI3XXX_Interrupt,
1833                         i_APCI3XXX_Reset,
1834                         i_APCI3XXX_InsnConfigAnalogInput,
1835                         i_APCI3XXX_InsnReadAnalogInput,
1836                         NULL,
1837                         NULL,
1838                         NULL,
1839                         NULL,
1840                         NULL,
1841                         NULL,
1842                         i_APCI3XXX_InsnWriteAnalogOutput,
1843                         NULL,
1844                         NULL,
1845                         NULL,
1846                         NULL,
1847                         NULL,
1848                         NULL,
1849                         NULL,
1850                         NULL,
1851                         NULL,
1852                         NULL,
1853                         NULL,
1854                         NULL,
1855                         NULL,
1856                         i_APCI3XXX_InsnConfigInitTTLIO,
1857                         i_APCI3XXX_InsnBitsTTLIO,
1858                         i_APCI3XXX_InsnReadTTLIO,
1859                 i_APCI3XXX_InsnWriteTTLIO},
1860
1861         {"apci3100-8-4",
1862                         PCI_VENDOR_ID_ADDIDATA,
1863                         0x301D,
1864                         256,
1865                         256,
1866                         256,
1867                         256,
1868                         ADDIDATA_NO_EEPROM,
1869                         ADDIDATA_9054,
1870                         8,
1871                         4,
1872                         8,
1873                         4,
1874                         4095,
1875                         4095,
1876                         &range_apci3XXX_ai,
1877                         &range_apci3XXX_ao,
1878                         0,
1879                         0,
1880                         0,
1881                         24,
1882                         &range_apci3XXX_ttl,
1883                         0,
1884                         0,
1885                         6,
1886                         10000,
1887                         0,
1888                         v_APCI3XXX_Interrupt,
1889                         i_APCI3XXX_Reset,
1890                         i_APCI3XXX_InsnConfigAnalogInput,
1891                         i_APCI3XXX_InsnReadAnalogInput,
1892                         NULL,
1893                         NULL,
1894                         NULL,
1895                         NULL,
1896                         NULL,
1897                         NULL,
1898                         i_APCI3XXX_InsnWriteAnalogOutput,
1899                         NULL,
1900                         NULL,
1901                         NULL,
1902                         NULL,
1903                         NULL,
1904                         NULL,
1905                         NULL,
1906                         NULL,
1907                         NULL,
1908                         NULL,
1909                         NULL,
1910                         NULL,
1911                         NULL,
1912                         i_APCI3XXX_InsnConfigInitTTLIO,
1913                         i_APCI3XXX_InsnBitsTTLIO,
1914                         i_APCI3XXX_InsnReadTTLIO,
1915                 i_APCI3XXX_InsnWriteTTLIO},
1916
1917         {"apci3106-16-4",
1918                         PCI_VENDOR_ID_ADDIDATA,
1919                         0x301E,
1920                         256,
1921                         256,
1922                         256,
1923                         256,
1924                         ADDIDATA_NO_EEPROM,
1925                         ADDIDATA_9054,
1926                         16,
1927                         8,
1928                         16,
1929                         4,
1930                         65535,
1931                         4095,
1932                         &range_apci3XXX_ai,
1933                         &range_apci3XXX_ao,
1934                         0,
1935                         0,
1936                         0,
1937                         24,
1938                         &range_apci3XXX_ttl,
1939                         0,
1940                         0,
1941                         6,
1942                         10000,
1943                         0,
1944                         v_APCI3XXX_Interrupt,
1945                         i_APCI3XXX_Reset,
1946                         i_APCI3XXX_InsnConfigAnalogInput,
1947                         i_APCI3XXX_InsnReadAnalogInput,
1948                         NULL,
1949                         NULL,
1950                         NULL,
1951                         NULL,
1952                         NULL,
1953                         NULL,
1954                         i_APCI3XXX_InsnWriteAnalogOutput,
1955                         NULL,
1956                         NULL,
1957                         NULL,
1958                         NULL,
1959                         NULL,
1960                         NULL,
1961                         NULL,
1962                         NULL,
1963                         NULL,
1964                         NULL,
1965                         NULL,
1966                         NULL,
1967                         NULL,
1968                         i_APCI3XXX_InsnConfigInitTTLIO,
1969                         i_APCI3XXX_InsnBitsTTLIO,
1970                         i_APCI3XXX_InsnReadTTLIO,
1971                 i_APCI3XXX_InsnWriteTTLIO},
1972
1973         {"apci3106-8-4",
1974                         PCI_VENDOR_ID_ADDIDATA,
1975                         0x301F,
1976                         256,
1977                         256,
1978                         256,
1979                         256,
1980                         ADDIDATA_NO_EEPROM,
1981                         ADDIDATA_9054,
1982                         8,
1983                         4,
1984                         8,
1985                         4,
1986                         65535,
1987                         4095,
1988                         &range_apci3XXX_ai,
1989                         &range_apci3XXX_ao,
1990                         0,
1991                         0,
1992                         0,
1993                         24,
1994                         &range_apci3XXX_ttl,
1995                         0,
1996                         0,
1997                         6,
1998                         10000,
1999                         0,
2000                         v_APCI3XXX_Interrupt,
2001                         i_APCI3XXX_Reset,
2002                         i_APCI3XXX_InsnConfigAnalogInput,
2003                         i_APCI3XXX_InsnReadAnalogInput,
2004                         NULL,
2005                         NULL,
2006                         NULL,
2007                         NULL,
2008                         NULL,
2009                         NULL,
2010                         i_APCI3XXX_InsnWriteAnalogOutput,
2011                         NULL,
2012                         NULL,
2013                         NULL,
2014                         NULL,
2015                         NULL,
2016                         NULL,
2017                         NULL,
2018                         NULL,
2019                         NULL,
2020                         NULL,
2021                         NULL,
2022                         NULL,
2023                         NULL,
2024                         i_APCI3XXX_InsnConfigInitTTLIO,
2025                         i_APCI3XXX_InsnBitsTTLIO,
2026                         i_APCI3XXX_InsnReadTTLIO,
2027                 i_APCI3XXX_InsnWriteTTLIO},
2028
2029         {"apci3110-16-4",
2030                         PCI_VENDOR_ID_ADDIDATA,
2031                         0x3020,
2032                         256,
2033                         256,
2034                         256,
2035                         256,
2036                         ADDIDATA_NO_EEPROM,
2037                         ADDIDATA_9054,
2038                         16,
2039                         8,
2040                         16,
2041                         4,
2042                         4095,
2043                         4095,
2044                         &range_apci3XXX_ai,
2045                         &range_apci3XXX_ao,
2046                         4,
2047                         4,
2048                         1,
2049                         24,
2050                         &range_apci3XXX_ttl,
2051                         0,
2052                         0,
2053                         6,
2054                         5000,
2055                         0,
2056                         v_APCI3XXX_Interrupt,
2057                         i_APCI3XXX_Reset,
2058                         i_APCI3XXX_InsnConfigAnalogInput,
2059                         i_APCI3XXX_InsnReadAnalogInput,
2060                         NULL,
2061                         NULL,
2062                         NULL,
2063                         NULL,
2064                         NULL,
2065                         NULL,
2066                         i_APCI3XXX_InsnWriteAnalogOutput,
2067                         NULL,
2068                         NULL,
2069                         i_APCI3XXX_InsnReadDigitalInput,
2070                         NULL,
2071                         i_APCI3XXX_InsnBitsDigitalInput,
2072                         NULL,
2073                         i_APCI3XXX_InsnWriteDigitalOutput,
2074                         i_APCI3XXX_InsnBitsDigitalOutput,
2075                         i_APCI3XXX_InsnReadDigitalOutput,
2076                         NULL,
2077                         NULL,
2078                         NULL,
2079                         NULL,
2080                         i_APCI3XXX_InsnConfigInitTTLIO,
2081                         i_APCI3XXX_InsnBitsTTLIO,
2082                         i_APCI3XXX_InsnReadTTLIO,
2083                 i_APCI3XXX_InsnWriteTTLIO},
2084
2085         {"apci3110-8-4",
2086                         PCI_VENDOR_ID_ADDIDATA,
2087                         0x3021,
2088                         256,
2089                         256,
2090                         256,
2091                         256,
2092                         ADDIDATA_NO_EEPROM,
2093                         ADDIDATA_9054,
2094                         8,
2095                         4,
2096                         8,
2097                         4,
2098                         4095,
2099                         4095,
2100                         &range_apci3XXX_ai,
2101                         &range_apci3XXX_ao,
2102                         4,
2103                         4,
2104                         1,
2105                         24,
2106                         &range_apci3XXX_ttl,
2107                         0,
2108                         0,
2109                         6,
2110                         5000,
2111                         0,
2112                         v_APCI3XXX_Interrupt,
2113                         i_APCI3XXX_Reset,
2114                         i_APCI3XXX_InsnConfigAnalogInput,
2115                         i_APCI3XXX_InsnReadAnalogInput,
2116                         NULL,
2117                         NULL,
2118                         NULL,
2119                         NULL,
2120                         NULL,
2121                         NULL,
2122                         i_APCI3XXX_InsnWriteAnalogOutput,
2123                         NULL,
2124                         NULL,
2125                         i_APCI3XXX_InsnReadDigitalInput,
2126                         NULL,
2127                         i_APCI3XXX_InsnBitsDigitalInput,
2128                         NULL,
2129                         i_APCI3XXX_InsnWriteDigitalOutput,
2130                         i_APCI3XXX_InsnBitsDigitalOutput,
2131                         i_APCI3XXX_InsnReadDigitalOutput,
2132                         NULL,
2133                         NULL,
2134                         NULL,
2135                         NULL,
2136                         i_APCI3XXX_InsnConfigInitTTLIO,
2137                         i_APCI3XXX_InsnBitsTTLIO,
2138                         i_APCI3XXX_InsnReadTTLIO,
2139                 i_APCI3XXX_InsnWriteTTLIO},
2140
2141         {"apci3116-16-4",
2142                         PCI_VENDOR_ID_ADDIDATA,
2143                         0x3022,
2144                         256,
2145                         256,
2146                         256,
2147                         256,
2148                         ADDIDATA_NO_EEPROM,
2149                         ADDIDATA_9054,
2150                         16,
2151                         8,
2152                         16,
2153                         4,
2154                         65535,
2155                         4095,
2156                         &range_apci3XXX_ai,
2157                         &range_apci3XXX_ao,
2158                         4,
2159                         4,
2160                         1,
2161                         24,
2162                         &range_apci3XXX_ttl,
2163                         0,
2164                         0,
2165                         6,
2166                         5000,
2167                         0,
2168                         v_APCI3XXX_Interrupt,
2169                         i_APCI3XXX_Reset,
2170                         i_APCI3XXX_InsnConfigAnalogInput,
2171                         i_APCI3XXX_InsnReadAnalogInput,
2172                         NULL,
2173                         NULL,
2174                         NULL,
2175                         NULL,
2176                         NULL,
2177                         NULL,
2178                         i_APCI3XXX_InsnWriteAnalogOutput,
2179                         NULL,
2180                         NULL,
2181                         i_APCI3XXX_InsnReadDigitalInput,
2182                         NULL,
2183                         i_APCI3XXX_InsnBitsDigitalInput,
2184                         NULL,
2185                         i_APCI3XXX_InsnWriteDigitalOutput,
2186                         i_APCI3XXX_InsnBitsDigitalOutput,
2187                         i_APCI3XXX_InsnReadDigitalOutput,
2188                         NULL,
2189                         NULL,
2190                         NULL,
2191                         NULL,
2192                         i_APCI3XXX_InsnConfigInitTTLIO,
2193                         i_APCI3XXX_InsnBitsTTLIO,
2194                         i_APCI3XXX_InsnReadTTLIO,
2195                 i_APCI3XXX_InsnWriteTTLIO},
2196
2197         {"apci3116-8-4",
2198                         PCI_VENDOR_ID_ADDIDATA,
2199                         0x3023,
2200                         256,
2201                         256,
2202                         256,
2203                         256,
2204                         ADDIDATA_NO_EEPROM,
2205                         ADDIDATA_9054,
2206                         8,
2207                         4,
2208                         8,
2209                         4,
2210                         65535,
2211                         4095,
2212                         &range_apci3XXX_ai,
2213                         &range_apci3XXX_ao,
2214                         4,
2215                         4,
2216                         1,
2217                         24,
2218                         &range_apci3XXX_ttl,
2219                         0,
2220                         0,
2221                         6,
2222                         5000,
2223                         0,
2224                         v_APCI3XXX_Interrupt,
2225                         i_APCI3XXX_Reset,
2226                         i_APCI3XXX_InsnConfigAnalogInput,
2227                         i_APCI3XXX_InsnReadAnalogInput,
2228                         NULL,
2229                         NULL,
2230                         NULL,
2231                         NULL,
2232                         NULL,
2233                         NULL,
2234                         i_APCI3XXX_InsnWriteAnalogOutput,
2235                         NULL,
2236                         NULL,
2237                         i_APCI3XXX_InsnReadDigitalInput,
2238                         NULL,
2239                         i_APCI3XXX_InsnBitsDigitalInput,
2240                         NULL,
2241                         i_APCI3XXX_InsnWriteDigitalOutput,
2242                         i_APCI3XXX_InsnBitsDigitalOutput,
2243                         i_APCI3XXX_InsnReadDigitalOutput,
2244                         NULL,
2245                         NULL,
2246                         NULL,
2247                         NULL,
2248                         i_APCI3XXX_InsnConfigInitTTLIO,
2249                         i_APCI3XXX_InsnBitsTTLIO,
2250                         i_APCI3XXX_InsnReadTTLIO,
2251                 i_APCI3XXX_InsnWriteTTLIO},
2252
2253         {"apci3003",
2254                         PCI_VENDOR_ID_ADDIDATA,
2255                         0x300B,
2256                         256,
2257                         256,
2258                         256,
2259                         256,
2260                         ADDIDATA_NO_EEPROM,
2261                         ADDIDATA_9054,
2262                         0,
2263                         4,
2264                         4,
2265                         0,
2266                         65535,
2267                         0,
2268                         &range_apci3XXX_ai,
2269                         NULL,
2270                         4,
2271                         4,
2272                         1,
2273                         0,
2274                         NULL,
2275                         0,
2276                         0,
2277                         7,
2278                         2500,
2279                         0,
2280                         v_APCI3XXX_Interrupt,
2281                         i_APCI3XXX_Reset,
2282                         i_APCI3XXX_InsnConfigAnalogInput,
2283                         i_APCI3XXX_InsnReadAnalogInput,
2284                         NULL,
2285                         NULL,
2286                         NULL,
2287                         NULL,
2288                         NULL,
2289                         NULL,
2290                         NULL,
2291                         NULL,
2292                         NULL,
2293                         i_APCI3XXX_InsnReadDigitalInput,
2294                         NULL,
2295                         i_APCI3XXX_InsnBitsDigitalInput,
2296                         NULL,
2297                         i_APCI3XXX_InsnWriteDigitalOutput,
2298                         i_APCI3XXX_InsnBitsDigitalOutput,
2299                         i_APCI3XXX_InsnReadDigitalOutput,
2300                         NULL,
2301                         NULL,
2302                         NULL,
2303                         NULL,
2304                         NULL,
2305                         NULL,
2306                 NULL},
2307
2308         {"apci3002-16",
2309                         PCI_VENDOR_ID_ADDIDATA,
2310                         0x3002,
2311                         256,
2312                         256,
2313                         256,
2314                         256,
2315                         ADDIDATA_NO_EEPROM,
2316                         ADDIDATA_9054,
2317                         0,
2318                         16,
2319                         16,
2320                         0,
2321                         65535,
2322                         0,
2323                         &range_apci3XXX_ai,
2324                         NULL,
2325                         4,
2326                         4,
2327                         1,
2328                         0,
2329                         NULL,
2330                         0,
2331                         0,
2332                         6,
2333                         5000,
2334                         0,
2335                         v_APCI3XXX_Interrupt,
2336                         i_APCI3XXX_Reset,
2337                         i_APCI3XXX_InsnConfigAnalogInput,
2338                         i_APCI3XXX_InsnReadAnalogInput,
2339                         NULL,
2340                         NULL,
2341                         NULL,
2342                         NULL,
2343                         NULL,
2344                         NULL,
2345                         NULL,
2346                         NULL,
2347                         NULL,
2348                         i_APCI3XXX_InsnReadDigitalInput,
2349                         NULL,
2350                         i_APCI3XXX_InsnBitsDigitalInput,
2351                         NULL,
2352                         i_APCI3XXX_InsnWriteDigitalOutput,
2353                         i_APCI3XXX_InsnBitsDigitalOutput,
2354                         i_APCI3XXX_InsnReadDigitalOutput,
2355                         NULL,
2356                         NULL,
2357                         NULL,
2358                         NULL,
2359                         NULL,
2360                         NULL,
2361                 NULL},
2362
2363         {"apci3002-8",
2364                         PCI_VENDOR_ID_ADDIDATA,
2365                         0x3003,
2366                         256,
2367                         256,
2368                         256,
2369                         256,
2370                         ADDIDATA_NO_EEPROM,
2371                         ADDIDATA_9054,
2372                         0,
2373                         8,
2374                         8,
2375                         0,
2376                         65535,
2377                         0,
2378                         &range_apci3XXX_ai,
2379                         NULL,
2380                         4,
2381                         4,
2382                         1,
2383                         0,
2384                         NULL,
2385                         0,
2386                         0,
2387                         6,
2388                         5000,
2389                         0,
2390                         v_APCI3XXX_Interrupt,
2391                         i_APCI3XXX_Reset,
2392                         i_APCI3XXX_InsnConfigAnalogInput,
2393                         i_APCI3XXX_InsnReadAnalogInput,
2394                         NULL,
2395                         NULL,
2396                         NULL,
2397                         NULL,
2398                         NULL,
2399                         NULL,
2400                         NULL,
2401                         NULL,
2402                         NULL,
2403                         i_APCI3XXX_InsnReadDigitalInput,
2404                         NULL,
2405                         i_APCI3XXX_InsnBitsDigitalInput,
2406                         NULL,
2407                         i_APCI3XXX_InsnWriteDigitalOutput,
2408                         i_APCI3XXX_InsnBitsDigitalOutput,
2409                         i_APCI3XXX_InsnReadDigitalOutput,
2410                         NULL,
2411                         NULL,
2412                         NULL,
2413                         NULL,
2414                         NULL,
2415                         NULL,
2416                 NULL},
2417
2418         {"apci3002-4",
2419                         PCI_VENDOR_ID_ADDIDATA,
2420                         0x3004,
2421                         256,
2422                         256,
2423                         256,
2424                         256,
2425                         ADDIDATA_NO_EEPROM,
2426                         ADDIDATA_9054,
2427                         0,
2428                         4,
2429                         4,
2430                         0,
2431                         65535,
2432                         0,
2433                         &range_apci3XXX_ai,
2434                         NULL,
2435                         4,
2436                         4,
2437                         1,
2438                         0,
2439                         NULL,
2440                         0,
2441                         0,
2442                         6,
2443                         5000,
2444                         0,
2445                         v_APCI3XXX_Interrupt,
2446                         i_APCI3XXX_Reset,
2447                         i_APCI3XXX_InsnConfigAnalogInput,
2448                         i_APCI3XXX_InsnReadAnalogInput,
2449                         NULL,
2450                         NULL,
2451                         NULL,
2452                         NULL,
2453                         NULL,
2454                         NULL,
2455                         NULL,
2456                         NULL,
2457                         NULL,
2458                         i_APCI3XXX_InsnReadDigitalInput,
2459                         NULL,
2460                         i_APCI3XXX_InsnBitsDigitalInput,
2461                         NULL,
2462                         i_APCI3XXX_InsnWriteDigitalOutput,
2463                         i_APCI3XXX_InsnBitsDigitalOutput,
2464                         i_APCI3XXX_InsnReadDigitalOutput,
2465                         NULL,
2466                         NULL,
2467                         NULL,
2468                         NULL,
2469                         NULL,
2470                         NULL,
2471                 NULL},
2472
2473         {"apci3500",
2474                         PCI_VENDOR_ID_ADDIDATA,
2475                         0x3024,
2476                         256,
2477                         256,
2478                         256,
2479                         256,
2480                         ADDIDATA_NO_EEPROM,
2481                         ADDIDATA_9054,
2482                         0,
2483                         0,
2484                         0,
2485                         4,
2486                         0,
2487                         4095,
2488                         NULL,
2489                         &range_apci3XXX_ao,
2490                         0,
2491                         0,
2492                         0,
2493                         24,
2494                         &range_apci3XXX_ttl,
2495                         0,
2496                         0,
2497                         0,
2498                         0,
2499                         0,
2500                         v_APCI3XXX_Interrupt,
2501                         i_APCI3XXX_Reset,
2502                         NULL,
2503                         NULL,
2504                         NULL,
2505                         NULL,
2506                         NULL,
2507                         NULL,
2508                         NULL,
2509                         NULL,
2510                         i_APCI3XXX_InsnWriteAnalogOutput,
2511                         NULL,
2512                         NULL,
2513                         NULL,
2514                         NULL,
2515                         NULL,
2516                         NULL,
2517                         NULL,
2518                         NULL,
2519                         NULL,
2520                         NULL,
2521                         NULL,
2522                         NULL,
2523                         NULL,
2524                         i_APCI3XXX_InsnConfigInitTTLIO,
2525                         i_APCI3XXX_InsnBitsTTLIO,
2526                         i_APCI3XXX_InsnReadTTLIO,
2527                 i_APCI3XXX_InsnWriteTTLIO},
2528 #endif
2529 };
2530
2531 #define n_boardtypes (sizeof(boardtypes)/sizeof(struct addi_board))
2532
2533 static struct comedi_driver driver_addi = {
2534         .driver_name = ADDIDATA_DRIVER_NAME,
2535         .module = THIS_MODULE,
2536         .attach = i_ADDI_Attach,
2537         .detach = i_ADDI_Detach,
2538         .num_names = n_boardtypes,
2539         .board_name = &boardtypes[0].pc_DriverName,
2540         .offset = sizeof(struct addi_board),
2541 };
2542
2543 static int __devinit driver_addi_pci_probe(struct pci_dev *dev,
2544                                            const struct pci_device_id *ent)
2545 {
2546         return comedi_pci_auto_config(dev, driver_addi.driver_name);
2547 }
2548
2549 static void __devexit driver_addi_pci_remove(struct pci_dev *dev)
2550 {
2551         comedi_pci_auto_unconfig(dev);
2552 }
2553
2554 static struct pci_driver driver_addi_pci_driver = {
2555         .id_table = addi_apci_tbl,
2556         .probe = &driver_addi_pci_probe,
2557         .remove = __devexit_p(&driver_addi_pci_remove)
2558 };
2559
2560 static int __init driver_addi_init_module(void)
2561 {
2562         int retval;
2563
2564         retval = comedi_driver_register(&driver_addi);
2565         if (retval < 0)
2566                 return retval;
2567
2568         driver_addi_pci_driver.name = (char *)driver_addi.driver_name;
2569         return pci_register_driver(&driver_addi_pci_driver);
2570 }
2571
2572 static void __exit driver_addi_cleanup_module(void)
2573 {
2574         pci_unregister_driver(&driver_addi_pci_driver);
2575         comedi_driver_unregister(&driver_addi);
2576 }
2577
2578 module_init(driver_addi_init_module);
2579 module_exit(driver_addi_cleanup_module);
2580
2581 /*
2582 +----------------------------------------------------------------------------+
2583 | Function name     :static int i_ADDI_Attach(struct comedi_device *dev,            |
2584 |                                                                               struct comedi_devconfig *it)        |
2585 |                                                                                                                |
2586 +----------------------------------------------------------------------------+
2587 | Task              :Detects the card.                                       |
2588 |                        Configure the driver for a particular board.            |
2589 |                        This function does all the initializations and memory   |
2590 |                        allocation of data structures for the driver.           |
2591 +----------------------------------------------------------------------------+
2592 | Input Parameters  :struct comedi_device *dev                                                                           |
2593 |                    struct comedi_devconfig *it                                                                         |
2594 |                                                                                                |
2595 +----------------------------------------------------------------------------+
2596 | Return Value      :  0                                                                     |
2597 |                                                                                                                            |
2598 +----------------------------------------------------------------------------+
2599 */
2600
2601 static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it)
2602 {
2603         struct comedi_subdevice *s;
2604         int ret, pages, i, n_subdevices;
2605         unsigned int dw_Dummy;
2606         resource_size_t io_addr[5];
2607         unsigned int irq;
2608         resource_size_t iobase_a, iobase_main, iobase_addon, iobase_reserved;
2609         struct pcilst_struct *card = NULL;
2610         unsigned char pci_bus, pci_slot, pci_func;
2611         int i_Dma = 0;
2612
2613         ret = alloc_private(dev, sizeof(struct addi_private));
2614         if (ret < 0)
2615                 return -ENOMEM;
2616
2617         if (!pci_list_builded) {
2618                 v_pci_card_list_init(this_board->i_VendorId, 1);        /* 1 for displaying the list.. */
2619                 pci_list_builded = 1;
2620         }
2621         /* printk("comedi%d: "ADDIDATA_DRIVER_NAME": board=%s",dev->minor,this_board->pc_DriverName); */
2622
2623         if ((this_board->i_Dma) && (it->options[2] == 0)) {
2624                 i_Dma = 1;
2625         }
2626
2627         card = ptr_select_and_alloc_pci_card(this_board->i_VendorId,
2628                                              this_board->i_DeviceId,
2629                                              it->options[0],
2630                                              it->options[1], i_Dma);
2631
2632         if (card == NULL)
2633                 return -EIO;
2634
2635         devpriv->allocated = 1;
2636
2637         if ((i_pci_card_data(card, &pci_bus, &pci_slot, &pci_func, &io_addr[0],
2638                                 &irq)) < 0) {
2639                 i_pci_card_free(card);
2640                 printk(" - Can't get AMCC data!\n");
2641                 return -EIO;
2642         }
2643
2644         iobase_a = io_addr[0];
2645         iobase_main = io_addr[1];
2646         iobase_addon = io_addr[2];
2647         iobase_reserved = io_addr[3];
2648         printk("\nBus %d: Slot %d: Funct%d\nBase0: 0x%8llx\nBase1: 0x%8llx\nBase2: 0x%8llx\nBase3: 0x%8llx\n", pci_bus, pci_slot, pci_func, (unsigned long long)io_addr[0], (unsigned long long)io_addr[1], (unsigned long long)io_addr[2], (unsigned long long)io_addr[3]);
2649
2650         if ((this_board->pc_EepromChip == NULL)
2651                 || (strcmp(this_board->pc_EepromChip, ADDIDATA_9054) != 0)) {
2652            /************************************/
2653                 /* Test if more that 1 address used */
2654            /************************************/
2655
2656                 if (this_board->i_IorangeBase1 != 0) {
2657                         dev->iobase = (unsigned long)iobase_main;       /*  DAQ base address... */
2658                 } else {
2659                         dev->iobase = (unsigned long)iobase_a;  /*  DAQ base address... */
2660                 }
2661
2662                 dev->board_name = this_board->pc_DriverName;
2663                 devpriv->amcc = card;
2664                 devpriv->iobase = (int) dev->iobase;
2665                 devpriv->i_IobaseAmcc = (int) iobase_a; /* AMCC base address... */
2666                 devpriv->i_IobaseAddon = (int) iobase_addon;    /* ADD ON base address.... */
2667                 devpriv->i_IobaseReserved = (int) iobase_reserved;
2668         } else {
2669                 dev->board_name = this_board->pc_DriverName;
2670                 dev->iobase = (unsigned long)io_addr[2];
2671                 devpriv->amcc = card;
2672                 devpriv->iobase = (int) io_addr[2];
2673                 devpriv->i_IobaseReserved = (int) io_addr[3];
2674                 printk("\nioremap begin");
2675                 devpriv->dw_AiBase = ioremap(io_addr[3],
2676                                              this_board->i_IorangeBase3);
2677                 printk("\nioremap end");
2678         }
2679
2680         /* Initialize parameters that can be overridden in EEPROM */
2681         devpriv->s_EeParameters.i_NbrAiChannel = this_board->i_NbrAiChannel;
2682         devpriv->s_EeParameters.i_NbrAoChannel = this_board->i_NbrAoChannel;
2683         devpriv->s_EeParameters.i_AiMaxdata = this_board->i_AiMaxdata;
2684         devpriv->s_EeParameters.i_AoMaxdata = this_board->i_AoMaxdata;
2685         devpriv->s_EeParameters.i_NbrDiChannel = this_board->i_NbrDiChannel;
2686         devpriv->s_EeParameters.i_NbrDoChannel = this_board->i_NbrDoChannel;
2687         devpriv->s_EeParameters.i_DoMaxdata = this_board->i_DoMaxdata;
2688         devpriv->s_EeParameters.i_Dma = this_board->i_Dma;
2689         devpriv->s_EeParameters.i_Timer = this_board->i_Timer;
2690         devpriv->s_EeParameters.ui_MinAcquisitiontimeNs =
2691                 this_board->ui_MinAcquisitiontimeNs;
2692         devpriv->s_EeParameters.ui_MinDelaytimeNs =
2693                 this_board->ui_MinDelaytimeNs;
2694
2695         /* ## */
2696
2697         if (irq > 0) {
2698                 if (request_irq(irq, v_ADDI_Interrupt, IRQF_SHARED,
2699                                 this_board->pc_DriverName, dev) < 0) {
2700                         printk(", unable to allocate IRQ %u, DISABLING IT",
2701                                 irq);
2702                         irq = 0;        /* Can't use IRQ */
2703                 } else {
2704                         printk("\nirq=%u", irq);
2705                 }
2706         } else {
2707                 printk(", IRQ disabled");
2708         }
2709
2710         printk("\nOption %d %d %d\n", it->options[0], it->options[1],
2711                 it->options[2]);
2712         dev->irq = irq;
2713
2714         /*  Read eepeom and fill addi_board Structure */
2715
2716         if (this_board->i_PCIEeprom) {
2717                 printk("\nPCI Eeprom used");
2718                 if (!(strcmp(this_board->pc_EepromChip, "S5920"))) {
2719                         /*  Set 3 wait stait */
2720                         if (!(strcmp(this_board->pc_DriverName, "apci035"))) {
2721                                 outl(0x80808082, devpriv->i_IobaseAmcc + 0x60);
2722                         } else {
2723                                 outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
2724                         }
2725                         /*  Enable the interrupt for the controller */
2726                         dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
2727                         outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
2728                         printk("\nEnable the interrupt for the controller");
2729                 }
2730                 printk("\nRead Eeprom");
2731                 i_EepromReadMainHeader(io_addr[0], this_board->pc_EepromChip,
2732                         dev);
2733         } else {
2734                 printk("\nPCI Eeprom unused");
2735         }
2736
2737         if (it->options[2] > 0) {
2738                 devpriv->us_UseDma = ADDI_DISABLE;
2739         } else {
2740                 devpriv->us_UseDma = ADDI_ENABLE;
2741         }
2742
2743         if (devpriv->s_EeParameters.i_Dma) {
2744                 printk("\nDMA used");
2745                 if (devpriv->us_UseDma == ADDI_ENABLE) {
2746                         /*  alloc DMA buffers */
2747                         devpriv->b_DmaDoubleBuffer = 0;
2748                         for (i = 0; i < 2; i++) {
2749                                 for (pages = 4; pages >= 0; pages--) {
2750                                         devpriv->ul_DmaBufferVirtual[i] =
2751                                                 (void *) __get_free_pages(GFP_KERNEL, pages);
2752
2753                                         if (devpriv->ul_DmaBufferVirtual[i])
2754                                                 break;
2755                                 }
2756                                 if (devpriv->ul_DmaBufferVirtual[i]) {
2757                                         devpriv->ui_DmaBufferPages[i] = pages;
2758                                         devpriv->ui_DmaBufferSize[i] =
2759                                                 PAGE_SIZE * pages;
2760                                         devpriv->ui_DmaBufferSamples[i] =
2761                                                 devpriv->
2762                                                 ui_DmaBufferSize[i] >> 1;
2763                                         devpriv->ul_DmaBufferHw[i] =
2764                                                 virt_to_bus((void *)devpriv->
2765                                                 ul_DmaBufferVirtual[i]);
2766                                 }
2767                         }
2768                         if (!devpriv->ul_DmaBufferVirtual[0]) {
2769                                 printk
2770                                         (", Can't allocate DMA buffer, DMA disabled!");
2771                                 devpriv->us_UseDma = ADDI_DISABLE;
2772                         }
2773
2774                         if (devpriv->ul_DmaBufferVirtual[1]) {
2775                                 devpriv->b_DmaDoubleBuffer = 1;
2776                         }
2777                 }
2778
2779                 if ((devpriv->us_UseDma == ADDI_ENABLE)) {
2780                         printk("\nDMA ENABLED\n");
2781                 } else {
2782                         printk("\nDMA DISABLED\n");
2783                 }
2784         }
2785
2786         if (!strcmp(this_board->pc_DriverName, "apci1710")) {
2787 #ifdef CONFIG_APCI_1710
2788                 i_ADDI_AttachPCI1710(dev);
2789
2790                 /*  save base address */
2791                 devpriv->s_BoardInfos.ui_Address = io_addr[2];
2792 #endif
2793         } else {
2794                 /* Update-0.7.57->0.7.68dev->n_subdevices = 7; */
2795                 n_subdevices = 7;
2796                 ret = alloc_subdevices(dev, n_subdevices);
2797                 if (ret < 0)
2798                         return ret;
2799
2800                 /*  Allocate and Initialise AI Subdevice Structures */
2801                 s = dev->subdevices + 0;
2802                 if ((devpriv->s_EeParameters.i_NbrAiChannel)
2803                         || (this_board->i_NbrAiChannelDiff)) {
2804                         dev->read_subdev = s;
2805                         s->type = COMEDI_SUBD_AI;
2806                         s->subdev_flags =
2807                                 SDF_READABLE | SDF_COMMON | SDF_GROUND
2808                                 | SDF_DIFF;
2809                         if (devpriv->s_EeParameters.i_NbrAiChannel) {
2810                                 s->n_chan =
2811                                         devpriv->s_EeParameters.i_NbrAiChannel;
2812                                 devpriv->b_SingelDiff = 0;
2813                         } else {
2814                                 s->n_chan = this_board->i_NbrAiChannelDiff;
2815                                 devpriv->b_SingelDiff = 1;
2816                         }
2817                         s->maxdata = devpriv->s_EeParameters.i_AiMaxdata;
2818                         s->len_chanlist = this_board->i_AiChannelList;
2819                         s->range_table = this_board->pr_AiRangelist;
2820
2821                         /* Set the initialisation flag */
2822                         devpriv->b_AiInitialisation = 1;
2823
2824                         s->insn_config =
2825                                 this_board->i_hwdrv_InsnConfigAnalogInput;
2826                         s->insn_read = this_board->i_hwdrv_InsnReadAnalogInput;
2827                         s->insn_write =
2828                                 this_board->i_hwdrv_InsnWriteAnalogInput;
2829                         s->insn_bits = this_board->i_hwdrv_InsnBitsAnalogInput;
2830                         s->do_cmdtest =
2831                                 this_board->i_hwdrv_CommandTestAnalogInput;
2832                         s->do_cmd = this_board->i_hwdrv_CommandAnalogInput;
2833                         s->cancel = this_board->i_hwdrv_CancelAnalogInput;
2834
2835                 } else {
2836                         s->type = COMEDI_SUBD_UNUSED;
2837                 }
2838
2839                 /*  Allocate and Initialise AO Subdevice Structures */
2840                 s = dev->subdevices + 1;
2841                 if (devpriv->s_EeParameters.i_NbrAoChannel) {
2842                         s->type = COMEDI_SUBD_AO;
2843                         s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2844                         s->n_chan = devpriv->s_EeParameters.i_NbrAoChannel;
2845                         s->maxdata = devpriv->s_EeParameters.i_AoMaxdata;
2846                         s->len_chanlist =
2847                                 devpriv->s_EeParameters.i_NbrAoChannel;
2848                         s->range_table = this_board->pr_AoRangelist;
2849                         s->insn_config =
2850                                 this_board->i_hwdrv_InsnConfigAnalogOutput;
2851                         s->insn_write =
2852                                 this_board->i_hwdrv_InsnWriteAnalogOutput;
2853                 } else {
2854                         s->type = COMEDI_SUBD_UNUSED;
2855                 }
2856                 /*  Allocate and Initialise DI Subdevice Structures */
2857                 s = dev->subdevices + 2;
2858                 if (devpriv->s_EeParameters.i_NbrDiChannel) {
2859                         s->type = COMEDI_SUBD_DI;
2860                         s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
2861                         s->n_chan = devpriv->s_EeParameters.i_NbrDiChannel;
2862                         s->maxdata = 1;
2863                         s->len_chanlist =
2864                                 devpriv->s_EeParameters.i_NbrDiChannel;
2865                         s->range_table = &range_digital;
2866                         s->io_bits = 0; /* all bits input */
2867                         s->insn_config =
2868                                 this_board->i_hwdrv_InsnConfigDigitalInput;
2869                         s->insn_read = this_board->i_hwdrv_InsnReadDigitalInput;
2870                         s->insn_write =
2871                                 this_board->i_hwdrv_InsnWriteDigitalInput;
2872                         s->insn_bits = this_board->i_hwdrv_InsnBitsDigitalInput;
2873                 } else {
2874                         s->type = COMEDI_SUBD_UNUSED;
2875                 }
2876                 /*  Allocate and Initialise DO Subdevice Structures */
2877                 s = dev->subdevices + 3;
2878                 if (devpriv->s_EeParameters.i_NbrDoChannel) {
2879                         s->type = COMEDI_SUBD_DO;
2880                         s->subdev_flags =
2881                                 SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2882                         s->n_chan = devpriv->s_EeParameters.i_NbrDoChannel;
2883                         s->maxdata = devpriv->s_EeParameters.i_DoMaxdata;
2884                         s->len_chanlist =
2885                                 devpriv->s_EeParameters.i_NbrDoChannel;
2886                         s->range_table = &range_digital;
2887                         s->io_bits = 0xf;       /* all bits output */
2888
2889                         s->insn_config = this_board->i_hwdrv_InsnConfigDigitalOutput;   /* for digital output memory.. */
2890                         s->insn_write =
2891                                 this_board->i_hwdrv_InsnWriteDigitalOutput;
2892                         s->insn_bits =
2893                                 this_board->i_hwdrv_InsnBitsDigitalOutput;
2894                         s->insn_read =
2895                                 this_board->i_hwdrv_InsnReadDigitalOutput;
2896                 } else {
2897                         s->type = COMEDI_SUBD_UNUSED;
2898                 }
2899
2900                 /*  Allocate and Initialise Timer Subdevice Structures */
2901                 s = dev->subdevices + 4;
2902                 if (devpriv->s_EeParameters.i_Timer) {
2903                         s->type = COMEDI_SUBD_TIMER;
2904                         s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2905                         s->n_chan = 1;
2906                         s->maxdata = 0;
2907                         s->len_chanlist = 1;
2908                         s->range_table = &range_digital;
2909
2910                         s->insn_write = this_board->i_hwdrv_InsnWriteTimer;
2911                         s->insn_read = this_board->i_hwdrv_InsnReadTimer;
2912                         s->insn_config = this_board->i_hwdrv_InsnConfigTimer;
2913                         s->insn_bits = this_board->i_hwdrv_InsnBitsTimer;
2914                 } else {
2915                         s->type = COMEDI_SUBD_UNUSED;
2916                 }
2917
2918                 /*  Allocate and Initialise TTL */
2919                 s = dev->subdevices + 5;
2920                 if (this_board->i_NbrTTLChannel) {
2921                         s->type = COMEDI_SUBD_TTLIO;
2922                         s->subdev_flags =
2923                                 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
2924                         s->n_chan = this_board->i_NbrTTLChannel;
2925                         s->maxdata = 1;
2926                         s->io_bits = 0; /* all bits input */
2927                         s->len_chanlist = this_board->i_NbrTTLChannel;
2928                         s->range_table = &range_digital;
2929                         s->insn_config = this_board->i_hwdr_ConfigInitTTLIO;
2930                         s->insn_bits = this_board->i_hwdr_ReadTTLIOBits;
2931                         s->insn_read = this_board->i_hwdr_ReadTTLIOAllPortValue;
2932                         s->insn_write = this_board->i_hwdr_WriteTTLIOChlOnOff;
2933                 } else {
2934                         s->type = COMEDI_SUBD_UNUSED;
2935                 }
2936
2937                 /* EEPROM */
2938                 s = dev->subdevices + 6;
2939                 if (this_board->i_PCIEeprom) {
2940                         s->type = COMEDI_SUBD_MEMORY;
2941                         s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
2942                         s->n_chan = 256;
2943                         s->maxdata = 0xffff;
2944                         s->insn_read = i_ADDIDATA_InsnReadEeprom;
2945                 } else {
2946                         s->type = COMEDI_SUBD_UNUSED;
2947                 }
2948         }
2949
2950         printk("\ni_ADDI_Attach end\n");
2951         i_ADDI_Reset(dev);
2952         devpriv->b_ValidDriver = 1;
2953         return 0;
2954 }
2955
2956 /*
2957 +----------------------------------------------------------------------------+
2958 | Function name     : static int i_ADDI_Detach(struct comedi_device *dev)           |
2959 |                                                                                                                |
2960 |                                                                                                |
2961 +----------------------------------------------------------------------------+
2962 | Task              : Deallocates resources of the addi_common driver        |
2963 |                         Free the DMA buffers, unregister irq.                              |
2964 |                                                                                                                |
2965 +----------------------------------------------------------------------------+
2966 | Input Parameters  : struct comedi_device *dev                                                                  |
2967 |                                                                                                                                |
2968 |                                                                                                |
2969 +----------------------------------------------------------------------------+
2970 | Return Value      : 0                                                                      |
2971 |                                                                                                                            |
2972 +----------------------------------------------------------------------------+
2973 */
2974
2975 static int i_ADDI_Detach(struct comedi_device *dev)
2976 {
2977
2978         if (dev->private) {
2979                 if (devpriv->b_ValidDriver) {
2980                         i_ADDI_Reset(dev);
2981                 }
2982
2983                 if (dev->irq) {
2984                         free_irq(dev->irq, dev);
2985                 }
2986
2987                 if ((this_board->pc_EepromChip == NULL)
2988                         || (strcmp(this_board->pc_EepromChip,
2989                                         ADDIDATA_9054) != 0)) {
2990                         if (devpriv->allocated) {
2991                                 i_pci_card_free(devpriv->amcc);
2992                         }
2993
2994                         if (devpriv->ul_DmaBufferVirtual[0]) {
2995                                 free_pages((unsigned long)devpriv->
2996                                         ul_DmaBufferVirtual[0],
2997                                         devpriv->ui_DmaBufferPages[0]);
2998                         }
2999
3000                         if (devpriv->ul_DmaBufferVirtual[1]) {
3001                                 free_pages((unsigned long)devpriv->
3002                                         ul_DmaBufferVirtual[1],
3003                                         devpriv->ui_DmaBufferPages[1]);
3004                         }
3005                 } else {
3006                         iounmap(devpriv->dw_AiBase);
3007
3008                         if (devpriv->allocated) {
3009                                 i_pci_card_free(devpriv->amcc);
3010                         }
3011                 }
3012
3013                 if (pci_list_builded) {
3014                         /* v_pci_card_list_cleanup(PCI_VENDOR_ID_AMCC); */
3015                         v_pci_card_list_cleanup(this_board->i_VendorId);
3016                         pci_list_builded = 0;
3017                 }
3018         }
3019
3020         return 0;
3021 }
3022
3023 /*
3024 +----------------------------------------------------------------------------+
3025 | Function name     : static int i_ADDI_Reset(struct comedi_device *dev)                         |
3026 |                                                                                                                |
3027 +----------------------------------------------------------------------------+
3028 | Task              : Disables all interrupts, Resets digital output to low, |
3029 |                               Set all analog output to low                                             |
3030 |                                                                                                                |
3031 +----------------------------------------------------------------------------+
3032 | Input Parameters  : struct comedi_device *dev                                                                  |
3033 |                                                                                                                                |
3034 |                                                                                                |
3035 +----------------------------------------------------------------------------+
3036 | Return Value      : 0                                                                          |
3037 |                                                                                                                            |
3038 +----------------------------------------------------------------------------+
3039 */
3040
3041 static int i_ADDI_Reset(struct comedi_device *dev)
3042 {
3043
3044         this_board->i_hwdrv_Reset(dev);
3045         return 0;
3046 }
3047
3048 /* Interrupt function */
3049 /*
3050 +----------------------------------------------------------------------------+
3051 | Function name     :                                                        |
3052 |static void v_ADDI_Interrupt(int irq, void *d)                 |
3053 |                                                                                                                |
3054 +----------------------------------------------------------------------------+
3055 | Task              : Registerd interrupt routine                                                    |
3056 |                                                                                                                |
3057 +----------------------------------------------------------------------------+
3058 | Input Parameters  :   int irq                                                                                          |
3059 |                                                                                                                                |
3060 |                                                                                                |
3061 +----------------------------------------------------------------------------+
3062 | Return Value      :                                                                            |
3063 |                                                                                                                            |
3064 +----------------------------------------------------------------------------+
3065 */
3066
3067 static irqreturn_t v_ADDI_Interrupt(int irq, void *d)
3068 {
3069         struct comedi_device *dev = d;
3070         this_board->v_hwdrv_Interrupt(irq, d);
3071         return IRQ_RETVAL(1);
3072 }
3073
3074 /* EEPROM Read Function */
3075 /*
3076 +----------------------------------------------------------------------------+
3077 | Function name     :                                                        |
3078 |INT i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,struct comedi_subdevice *s,
3079                                                         struct comedi_insn *insn,unsigned int *data)
3080 |                                                                                                                |
3081 +----------------------------------------------------------------------------+
3082 | Task              : Read 256 words from EEPROM                                             |
3083 |                                                                                                                |
3084 +----------------------------------------------------------------------------+
3085 | Input Parameters  :(struct comedi_device *dev,struct comedi_subdevice *s,
3086                         struct comedi_insn *insn,unsigned int *data)                                             |
3087 |                                                                                                                                |
3088 |                                                                                                |
3089 +----------------------------------------------------------------------------+
3090 | Return Value      :                                                                            |
3091 |                                                                                                                            |
3092 +----------------------------------------------------------------------------+
3093 */
3094
3095 static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, struct comedi_subdevice *s,
3096         struct comedi_insn *insn, unsigned int *data)
3097 {
3098         unsigned short w_Data;
3099         unsigned short w_Address;
3100         w_Address = CR_CHAN(insn->chanspec);    /*  address to be read as 0,1,2,3...255 */
3101
3102         w_Data = w_EepromReadWord(devpriv->i_IobaseAmcc,
3103                 this_board->pc_EepromChip, 0x100 + (2 * w_Address));
3104         data[0] = w_Data;
3105         /* multiplied by 2 bcozinput will be like 0,1,2...255 */
3106         return insn->n;
3107
3108 }