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