addi_common.c revision 57517878df4e5769885e80aba895f4e69b1ddbe9
1/**
2@verbatim
3
4Copyright (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
14This 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
16This 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
18You 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
20You 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 ((const struct addi_board *)dev->board_ptr)
81
82#if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300)
83/* BYTE b_SaveFPUReg [94]; */
84
85void fpu_begin(void)
86{
87	/* asm ("fstenv b_SaveFPUReg"); */
88	kernel_fpu_begin();
89}
90
91void 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
146static 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
224MODULE_DEVICE_TABLE(pci, addi_apci_tbl);
225
226static 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
2534static 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
2544static 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
2550static void __devexit driver_addi_pci_remove(struct pci_dev *dev)
2551{
2552	comedi_pci_auto_unconfig(dev);
2553}
2554
2555static 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
2561static 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
2573static void __exit driver_addi_cleanup_module(void)
2574{
2575	pci_unregister_driver(&driver_addi_pci_driver);
2576	comedi_driver_unregister(&driver_addi);
2577}
2578
2579module_init(driver_addi_init_module);
2580module_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
2602static 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	/* Initialize parameters that can be overridden in EEPROM */
2684	devpriv->s_EeParameters.i_NbrAiChannel = this_board->i_NbrAiChannel;
2685	devpriv->s_EeParameters.i_NbrAoChannel = this_board->i_NbrAoChannel;
2686	devpriv->s_EeParameters.i_AiMaxdata = this_board->i_AiMaxdata;
2687	devpriv->s_EeParameters.i_AoMaxdata = this_board->i_AoMaxdata;
2688	devpriv->s_EeParameters.i_NbrDiChannel = this_board->i_NbrDiChannel;
2689	devpriv->s_EeParameters.i_NbrDoChannel = this_board->i_NbrDoChannel;
2690	devpriv->s_EeParameters.i_DoMaxdata = this_board->i_DoMaxdata;
2691	devpriv->s_EeParameters.i_Dma = this_board->i_Dma;
2692	devpriv->s_EeParameters.i_Timer = this_board->i_Timer;
2693	devpriv->s_EeParameters.ui_MinAcquisitiontimeNs =
2694		this_board->ui_MinAcquisitiontimeNs;
2695	devpriv->s_EeParameters.ui_MinDelaytimeNs =
2696		this_board->ui_MinDelaytimeNs;
2697
2698	/* ## */
2699
2700	if (irq > 0) {
2701		if (request_irq(irq, v_ADDI_Interrupt, IRQF_SHARED,
2702				this_board->pc_DriverName, dev) < 0) {
2703			printk(", unable to allocate IRQ %u, DISABLING IT",
2704				irq);
2705			irq = 0;	/* Can't use IRQ */
2706		} else {
2707			printk("\nirq=%u", irq);
2708		}
2709	} else {
2710		printk(", IRQ disabled");
2711	}
2712
2713	printk("\nOption %d %d %d\n", it->options[0], it->options[1],
2714		it->options[2]);
2715	dev->irq = irq;
2716
2717	/*  Read eepeom and fill addi_board Structure */
2718
2719	if (this_board->i_PCIEeprom) {
2720		printk("\nPCI Eeprom used");
2721		if (!(strcmp(this_board->pc_EepromChip, "S5920"))) {
2722			/*  Set 3 wait stait */
2723			if (!(strcmp(this_board->pc_DriverName, "apci035"))) {
2724				outl(0x80808082, devpriv->i_IobaseAmcc + 0x60);
2725			} else {
2726				outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
2727			}
2728			/*  Enable the interrupt for the controller */
2729			dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
2730			outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
2731			printk("\nEnable the interrupt for the controller");
2732		}
2733		printk("\nRead Eeprom");
2734		i_EepromReadMainHeader(io_addr[0], this_board->pc_EepromChip,
2735			dev);
2736	} else {
2737		printk("\nPCI Eeprom unused");
2738	}
2739
2740	if (it->options[2] > 0) {
2741		devpriv->us_UseDma = ADDI_DISABLE;
2742	} else {
2743		devpriv->us_UseDma = ADDI_ENABLE;
2744	}
2745
2746	if (devpriv->s_EeParameters.i_Dma) {
2747		printk("\nDMA used");
2748		if (devpriv->us_UseDma == ADDI_ENABLE) {
2749			/*  alloc DMA buffers */
2750			devpriv->b_DmaDoubleBuffer = 0;
2751			for (i = 0; i < 2; i++) {
2752				for (pages = 4; pages >= 0; pages--) {
2753					devpriv->ul_DmaBufferVirtual[i] =
2754						(void *) __get_free_pages(GFP_KERNEL, pages);
2755
2756					if (devpriv->ul_DmaBufferVirtual[i])
2757						break;
2758				}
2759				if (devpriv->ul_DmaBufferVirtual[i]) {
2760					devpriv->ui_DmaBufferPages[i] = pages;
2761					devpriv->ui_DmaBufferSize[i] =
2762						PAGE_SIZE * pages;
2763					devpriv->ui_DmaBufferSamples[i] =
2764						devpriv->
2765						ui_DmaBufferSize[i] >> 1;
2766					devpriv->ul_DmaBufferHw[i] =
2767						virt_to_bus((void *)devpriv->
2768						ul_DmaBufferVirtual[i]);
2769				}
2770			}
2771			if (!devpriv->ul_DmaBufferVirtual[0]) {
2772				printk
2773					(", Can't allocate DMA buffer, DMA disabled!");
2774				devpriv->us_UseDma = ADDI_DISABLE;
2775			}
2776
2777			if (devpriv->ul_DmaBufferVirtual[1]) {
2778				devpriv->b_DmaDoubleBuffer = 1;
2779			}
2780		}
2781
2782		if ((devpriv->us_UseDma == ADDI_ENABLE)) {
2783			printk("\nDMA ENABLED\n");
2784		} else {
2785			printk("\nDMA DISABLED\n");
2786		}
2787	}
2788
2789	if (!strcmp(this_board->pc_DriverName, "apci1710")) {
2790#ifdef CONFIG_APCI_1710
2791		i_ADDI_AttachPCI1710(dev);
2792
2793		/*  save base address */
2794		devpriv->s_BoardInfos.ui_Address = io_addr[2];
2795#endif
2796	} else {
2797		/* Update-0.7.57->0.7.68dev->n_subdevices = 7; */
2798		n_subdevices = 7;
2799		ret = alloc_subdevices(dev, n_subdevices);
2800		if (ret < 0)
2801			return ret;
2802
2803		/*  Allocate and Initialise AI Subdevice Structures */
2804		s = dev->subdevices + 0;
2805		if ((devpriv->s_EeParameters.i_NbrAiChannel)
2806			|| (this_board->i_NbrAiChannelDiff)) {
2807			dev->read_subdev = s;
2808			s->type = COMEDI_SUBD_AI;
2809			s->subdev_flags =
2810				SDF_READABLE | SDF_COMMON | SDF_GROUND
2811				| SDF_DIFF;
2812			if (devpriv->s_EeParameters.i_NbrAiChannel) {
2813				s->n_chan =
2814					devpriv->s_EeParameters.i_NbrAiChannel;
2815				devpriv->b_SingelDiff = 0;
2816			} else {
2817				s->n_chan = this_board->i_NbrAiChannelDiff;
2818				devpriv->b_SingelDiff = 1;
2819			}
2820			s->maxdata = devpriv->s_EeParameters.i_AiMaxdata;
2821			s->len_chanlist = this_board->i_AiChannelList;
2822			s->range_table = this_board->pr_AiRangelist;
2823
2824			/* Set the initialisation flag */
2825			devpriv->b_AiInitialisation = 1;
2826
2827			s->insn_config =
2828				this_board->i_hwdrv_InsnConfigAnalogInput;
2829			s->insn_read = this_board->i_hwdrv_InsnReadAnalogInput;
2830			s->insn_write =
2831				this_board->i_hwdrv_InsnWriteAnalogInput;
2832			s->insn_bits = this_board->i_hwdrv_InsnBitsAnalogInput;
2833			s->do_cmdtest =
2834				this_board->i_hwdrv_CommandTestAnalogInput;
2835			s->do_cmd = this_board->i_hwdrv_CommandAnalogInput;
2836			s->cancel = this_board->i_hwdrv_CancelAnalogInput;
2837
2838		} else {
2839			s->type = COMEDI_SUBD_UNUSED;
2840		}
2841
2842		/*  Allocate and Initialise AO Subdevice Structures */
2843		s = dev->subdevices + 1;
2844		if (devpriv->s_EeParameters.i_NbrAoChannel) {
2845			s->type = COMEDI_SUBD_AO;
2846			s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2847			s->n_chan = devpriv->s_EeParameters.i_NbrAoChannel;
2848			s->maxdata = devpriv->s_EeParameters.i_AoMaxdata;
2849			s->len_chanlist =
2850				devpriv->s_EeParameters.i_NbrAoChannel;
2851			s->range_table = this_board->pr_AoRangelist;
2852			s->insn_config =
2853				this_board->i_hwdrv_InsnConfigAnalogOutput;
2854			s->insn_write =
2855				this_board->i_hwdrv_InsnWriteAnalogOutput;
2856		} else {
2857			s->type = COMEDI_SUBD_UNUSED;
2858		}
2859		/*  Allocate and Initialise DI Subdevice Structures */
2860		s = dev->subdevices + 2;
2861		if (devpriv->s_EeParameters.i_NbrDiChannel) {
2862			s->type = COMEDI_SUBD_DI;
2863			s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
2864			s->n_chan = devpriv->s_EeParameters.i_NbrDiChannel;
2865			s->maxdata = 1;
2866			s->len_chanlist =
2867				devpriv->s_EeParameters.i_NbrDiChannel;
2868			s->range_table = &range_digital;
2869			s->io_bits = 0;	/* all bits input */
2870			s->insn_config =
2871				this_board->i_hwdrv_InsnConfigDigitalInput;
2872			s->insn_read = this_board->i_hwdrv_InsnReadDigitalInput;
2873			s->insn_write =
2874				this_board->i_hwdrv_InsnWriteDigitalInput;
2875			s->insn_bits = this_board->i_hwdrv_InsnBitsDigitalInput;
2876		} else {
2877			s->type = COMEDI_SUBD_UNUSED;
2878		}
2879		/*  Allocate and Initialise DO Subdevice Structures */
2880		s = dev->subdevices + 3;
2881		if (devpriv->s_EeParameters.i_NbrDoChannel) {
2882			s->type = COMEDI_SUBD_DO;
2883			s->subdev_flags =
2884				SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2885			s->n_chan = devpriv->s_EeParameters.i_NbrDoChannel;
2886			s->maxdata = devpriv->s_EeParameters.i_DoMaxdata;
2887			s->len_chanlist =
2888				devpriv->s_EeParameters.i_NbrDoChannel;
2889			s->range_table = &range_digital;
2890			s->io_bits = 0xf;	/* all bits output */
2891
2892			s->insn_config = this_board->i_hwdrv_InsnConfigDigitalOutput;	/* for digital output memory.. */
2893			s->insn_write =
2894				this_board->i_hwdrv_InsnWriteDigitalOutput;
2895			s->insn_bits =
2896				this_board->i_hwdrv_InsnBitsDigitalOutput;
2897			s->insn_read =
2898				this_board->i_hwdrv_InsnReadDigitalOutput;
2899		} else {
2900			s->type = COMEDI_SUBD_UNUSED;
2901		}
2902
2903		/*  Allocate and Initialise Timer Subdevice Structures */
2904		s = dev->subdevices + 4;
2905		if (devpriv->s_EeParameters.i_Timer) {
2906			s->type = COMEDI_SUBD_TIMER;
2907			s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2908			s->n_chan = 1;
2909			s->maxdata = 0;
2910			s->len_chanlist = 1;
2911			s->range_table = &range_digital;
2912
2913			s->insn_write = this_board->i_hwdrv_InsnWriteTimer;
2914			s->insn_read = this_board->i_hwdrv_InsnReadTimer;
2915			s->insn_config = this_board->i_hwdrv_InsnConfigTimer;
2916			s->insn_bits = this_board->i_hwdrv_InsnBitsTimer;
2917		} else {
2918			s->type = COMEDI_SUBD_UNUSED;
2919		}
2920
2921		/*  Allocate and Initialise TTL */
2922		s = dev->subdevices + 5;
2923		if (this_board->i_NbrTTLChannel) {
2924			s->type = COMEDI_SUBD_TTLIO;
2925			s->subdev_flags =
2926				SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
2927			s->n_chan = this_board->i_NbrTTLChannel;
2928			s->maxdata = 1;
2929			s->io_bits = 0;	/* all bits input */
2930			s->len_chanlist = this_board->i_NbrTTLChannel;
2931			s->range_table = &range_digital;
2932			s->insn_config = this_board->i_hwdr_ConfigInitTTLIO;
2933			s->insn_bits = this_board->i_hwdr_ReadTTLIOBits;
2934			s->insn_read = this_board->i_hwdr_ReadTTLIOAllPortValue;
2935			s->insn_write = this_board->i_hwdr_WriteTTLIOChlOnOff;
2936		} else {
2937			s->type = COMEDI_SUBD_UNUSED;
2938		}
2939
2940		/* EEPROM */
2941		s = dev->subdevices + 6;
2942		if (this_board->i_PCIEeprom) {
2943			s->type = COMEDI_SUBD_MEMORY;
2944			s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
2945			s->n_chan = 256;
2946			s->maxdata = 0xffff;
2947			s->insn_read = i_ADDIDATA_InsnReadEeprom;
2948		} else {
2949			s->type = COMEDI_SUBD_UNUSED;
2950		}
2951	}
2952
2953	printk("\ni_ADDI_Attach end\n");
2954	i_ADDI_Reset(dev);
2955	devpriv->b_ValidDriver = 1;
2956	return 0;
2957}
2958
2959/*
2960+----------------------------------------------------------------------------+
2961| Function name     : static int i_ADDI_Detach(struct comedi_device *dev)           |
2962|                                        									 |
2963|                                            						         |
2964+----------------------------------------------------------------------------+
2965| Task              : Deallocates resources of the addi_common driver        |
2966|			  Free the DMA buffers, unregister irq.				     |
2967|                     										                 |
2968+----------------------------------------------------------------------------+
2969| Input Parameters  : struct comedi_device *dev									 |
2970|                     														 |
2971|                                                 					         |
2972+----------------------------------------------------------------------------+
2973| Return Value      : 0             					                     |
2974|                    													     |
2975+----------------------------------------------------------------------------+
2976*/
2977
2978static int i_ADDI_Detach(struct comedi_device *dev)
2979{
2980
2981	if (dev->private) {
2982		if (devpriv->b_ValidDriver) {
2983			i_ADDI_Reset(dev);
2984		}
2985
2986		if (dev->irq) {
2987			free_irq(dev->irq, dev);
2988		}
2989
2990		if ((devpriv->ps_BoardInfo->pc_EepromChip == NULL)
2991			|| (strcmp(devpriv->ps_BoardInfo->pc_EepromChip,
2992					ADDIDATA_9054) != 0)) {
2993			if (devpriv->allocated) {
2994				i_pci_card_free(devpriv->amcc);
2995			}
2996
2997			if (devpriv->ul_DmaBufferVirtual[0]) {
2998				free_pages((unsigned long)devpriv->
2999					ul_DmaBufferVirtual[0],
3000					devpriv->ui_DmaBufferPages[0]);
3001			}
3002
3003			if (devpriv->ul_DmaBufferVirtual[1]) {
3004				free_pages((unsigned long)devpriv->
3005					ul_DmaBufferVirtual[1],
3006					devpriv->ui_DmaBufferPages[1]);
3007			}
3008		} else {
3009			iounmap(devpriv->dw_AiBase);
3010
3011			if (devpriv->allocated) {
3012				i_pci_card_free(devpriv->amcc);
3013			}
3014		}
3015
3016		if (pci_list_builded) {
3017			/* v_pci_card_list_cleanup(PCI_VENDOR_ID_AMCC); */
3018			v_pci_card_list_cleanup(this_board->i_VendorId);
3019			pci_list_builded = 0;
3020		}
3021	}
3022
3023	return 0;
3024}
3025
3026/*
3027+----------------------------------------------------------------------------+
3028| Function name     : static int i_ADDI_Reset(struct comedi_device *dev)			 |
3029|                                        									 |
3030+----------------------------------------------------------------------------+
3031| Task              : Disables all interrupts, Resets digital output to low, |
3032|				Set all analog output to low						 |
3033|                     										                 |
3034+----------------------------------------------------------------------------+
3035| Input Parameters  : struct comedi_device *dev									 |
3036|                     														 |
3037|                                                 					         |
3038+----------------------------------------------------------------------------+
3039| Return Value      : 0           					                         |
3040|                    													     |
3041+----------------------------------------------------------------------------+
3042*/
3043
3044static int i_ADDI_Reset(struct comedi_device *dev)
3045{
3046
3047	this_board->i_hwdrv_Reset(dev);
3048	return 0;
3049}
3050
3051/* Interrupt function */
3052/*
3053+----------------------------------------------------------------------------+
3054| Function name     :                                                        |
3055|static void v_ADDI_Interrupt(int irq, void *d)                 |
3056|                                        									 |
3057+----------------------------------------------------------------------------+
3058| Task              : Registerd interrupt routine						     |
3059|                     										                 |
3060+----------------------------------------------------------------------------+
3061| Input Parameters  : 	int irq												 |
3062|                     														 |
3063|                                                 					         |
3064+----------------------------------------------------------------------------+
3065| Return Value      :              					                         |
3066|                    													     |
3067+----------------------------------------------------------------------------+
3068*/
3069
3070static irqreturn_t v_ADDI_Interrupt(int irq, void *d)
3071{
3072	struct comedi_device *dev = d;
3073	this_board->v_hwdrv_Interrupt(irq, d);
3074	return IRQ_RETVAL(1);
3075}
3076
3077/* EEPROM Read Function */
3078/*
3079+----------------------------------------------------------------------------+
3080| Function name     :                                                        |
3081|INT i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,struct comedi_subdevice *s,
3082							struct comedi_insn *insn,unsigned int *data)
3083|                                        									 |
3084+----------------------------------------------------------------------------+
3085| Task              : Read 256 words from EEPROM          				     |
3086|                     										                 |
3087+----------------------------------------------------------------------------+
3088| Input Parameters  :(struct comedi_device *dev,struct comedi_subdevice *s,
3089			struct comedi_insn *insn,unsigned int *data) 						 |
3090|                     														 |
3091|                                                 					         |
3092+----------------------------------------------------------------------------+
3093| Return Value      :              					                         |
3094|                    													     |
3095+----------------------------------------------------------------------------+
3096*/
3097
3098static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, struct comedi_subdevice *s,
3099	struct comedi_insn *insn, unsigned int *data)
3100{
3101	unsigned short w_Data;
3102	unsigned short w_Address;
3103	w_Address = CR_CHAN(insn->chanspec);	/*  address to be read as 0,1,2,3...255 */
3104
3105	w_Data = w_EepromReadWord(devpriv->i_IobaseAmcc,
3106		this_board->pc_EepromChip, 0x100 + (2 * w_Address));
3107	data[0] = w_Data;
3108	/* multiplied by 2 bcozinput will be like 0,1,2...255 */
3109	return insn->n;
3110
3111}
3112