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