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