addi_apci_3xxx.c revision dcc8adb28638c0c09b29a551f3745f7182b1a04b
1#include <linux/pci.h>
2
3#include "../comedidev.h"
4#include "comedi_fc.h"
5#include "amcc_s5933.h"
6
7#include "addi-data/addi_common.h"
8
9#include "addi-data/addi_eeprom.c"
10#include "addi-data/hwdrv_apci3xxx.c"
11#include "addi-data/addi_common.c"
12
13enum apci3xxx_boardid {
14	BOARD_APCI3000_16,
15	BOARD_APCI3000_8,
16	BOARD_APCI3000_4,
17	BOARD_APCI3006_16,
18	BOARD_APCI3006_8,
19	BOARD_APCI3006_4,
20	BOARD_APCI3010_16,
21	BOARD_APCI3010_8,
22	BOARD_APCI3010_4,
23	BOARD_APCI3016_16,
24	BOARD_APCI3016_8,
25	BOARD_APCI3016_4,
26	BOARD_APCI3100_16_4,
27	BOARD_APCI3100_8_4,
28	BOARD_APCI3106_16_4,
29	BOARD_APCI3106_8_4,
30	BOARD_APCI3110_16_4,
31	BOARD_APCI3110_8_4,
32	BOARD_APCI3116_16_4,
33	BOARD_APCI3116_8_4,
34	BOARD_APCI3003,
35	BOARD_APCI3002_16,
36	BOARD_APCI3002_8,
37	BOARD_APCI3002_4,
38	BOARD_APCI3500,
39};
40
41static const struct addi_board apci3xxx_boardtypes[] = {
42	[BOARD_APCI3000_16] = {
43		.pc_DriverName		= "apci3000-16",
44		.i_IorangeBase0		= 256,
45		.i_IorangeBase1		= 256,
46		.i_IorangeBase2		= 256,
47		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
48		.pc_EepromChip		= ADDIDATA_9054,
49		.i_NbrAiChannel		= 16,
50		.i_NbrAiChannelDiff	= 8,
51		.i_AiChannelList	= 16,
52		.i_AiMaxdata		= 4095,
53		.pr_AiRangelist		= &range_apci3XXX_ai,
54		.i_NbrTTLChannel	= 24,
55		.b_AvailableConvertUnit	= 6,
56		.ui_MinAcquisitiontimeNs = 10000,
57		.interrupt		= v_APCI3XXX_Interrupt,
58		.reset			= i_APCI3XXX_Reset,
59		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
60		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
61		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
62		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
63		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
64		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
65	},
66	[BOARD_APCI3000_8] = {
67		.pc_DriverName		= "apci3000-8",
68		.i_IorangeBase0		= 256,
69		.i_IorangeBase1		= 256,
70		.i_IorangeBase2		= 256,
71		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
72		.pc_EepromChip		= ADDIDATA_9054,
73		.i_NbrAiChannel		= 8,
74		.i_NbrAiChannelDiff	= 4,
75		.i_AiChannelList	= 8,
76		.i_AiMaxdata		= 4095,
77		.pr_AiRangelist		= &range_apci3XXX_ai,
78		.i_NbrTTLChannel	= 24,
79		.b_AvailableConvertUnit	= 6,
80		.ui_MinAcquisitiontimeNs = 10000,
81		.interrupt		= v_APCI3XXX_Interrupt,
82		.reset			= i_APCI3XXX_Reset,
83		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
84		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
85		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
86		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
87		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
88		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
89	},
90	[BOARD_APCI3000_4] = {
91		.pc_DriverName		= "apci3000-4",
92		.i_IorangeBase0		= 256,
93		.i_IorangeBase1		= 256,
94		.i_IorangeBase2		= 256,
95		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
96		.pc_EepromChip		= ADDIDATA_9054,
97		.i_NbrAiChannel		= 4,
98		.i_NbrAiChannelDiff	= 2,
99		.i_AiChannelList	= 4,
100		.i_AiMaxdata		= 4095,
101		.pr_AiRangelist		= &range_apci3XXX_ai,
102		.i_NbrTTLChannel	= 24,
103		.b_AvailableConvertUnit	= 6,
104		.ui_MinAcquisitiontimeNs = 10000,
105		.interrupt		= v_APCI3XXX_Interrupt,
106		.reset			= i_APCI3XXX_Reset,
107		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
108		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
109		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
110		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
111		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
112		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
113	},
114	[BOARD_APCI3006_16] = {
115		.pc_DriverName		= "apci3006-16",
116		.i_IorangeBase0		= 256,
117		.i_IorangeBase1		= 256,
118		.i_IorangeBase2		= 256,
119		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
120		.pc_EepromChip		= ADDIDATA_9054,
121		.i_NbrAiChannel		= 16,
122		.i_NbrAiChannelDiff	= 8,
123		.i_AiChannelList	= 16,
124		.i_AiMaxdata		= 65535,
125		.pr_AiRangelist		= &range_apci3XXX_ai,
126		.i_NbrTTLChannel	= 24,
127		.b_AvailableConvertUnit	= 6,
128		.ui_MinAcquisitiontimeNs = 10000,
129		.interrupt		= v_APCI3XXX_Interrupt,
130		.reset			= i_APCI3XXX_Reset,
131		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
132		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
133		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
134		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
135		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
136		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
137	},
138	[BOARD_APCI3006_8] = {
139		.pc_DriverName		= "apci3006-8",
140		.i_IorangeBase0		= 256,
141		.i_IorangeBase1		= 256,
142		.i_IorangeBase2		= 256,
143		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
144		.pc_EepromChip		= ADDIDATA_9054,
145		.i_NbrAiChannel		= 8,
146		.i_NbrAiChannelDiff	= 4,
147		.i_AiChannelList	= 8,
148		.i_AiMaxdata		= 65535,
149		.pr_AiRangelist		= &range_apci3XXX_ai,
150		.i_NbrTTLChannel	= 24,
151		.b_AvailableConvertUnit	= 6,
152		.ui_MinAcquisitiontimeNs = 10000,
153		.interrupt		= v_APCI3XXX_Interrupt,
154		.reset			= i_APCI3XXX_Reset,
155		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
156		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
157		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
158		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
159		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
160		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
161	},
162	[BOARD_APCI3006_4] = {
163		.pc_DriverName		= "apci3006-4",
164		.i_IorangeBase0		= 256,
165		.i_IorangeBase1		= 256,
166		.i_IorangeBase2		= 256,
167		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
168		.pc_EepromChip		= ADDIDATA_9054,
169		.i_NbrAiChannel		= 4,
170		.i_NbrAiChannelDiff	= 2,
171		.i_AiChannelList	= 4,
172		.i_AiMaxdata		= 65535,
173		.pr_AiRangelist		= &range_apci3XXX_ai,
174		.i_NbrTTLChannel	= 24,
175		.b_AvailableConvertUnit	= 6,
176		.ui_MinAcquisitiontimeNs = 10000,
177		.interrupt		= v_APCI3XXX_Interrupt,
178		.reset			= i_APCI3XXX_Reset,
179		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
180		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
181		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
182		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
183		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
184		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
185	},
186	[BOARD_APCI3010_16] = {
187		.pc_DriverName		= "apci3010-16",
188		.i_IorangeBase0		= 256,
189		.i_IorangeBase1		= 256,
190		.i_IorangeBase2		= 256,
191		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
192		.pc_EepromChip		= ADDIDATA_9054,
193		.i_NbrAiChannel		= 16,
194		.i_NbrAiChannelDiff	= 8,
195		.i_AiChannelList	= 16,
196		.i_AiMaxdata		= 4095,
197		.pr_AiRangelist		= &range_apci3XXX_ai,
198		.i_NbrDiChannel		= 4,
199		.i_NbrDoChannel		= 4,
200		.i_DoMaxdata		= 1,
201		.i_NbrTTLChannel	= 24,
202		.b_AvailableConvertUnit	= 6,
203		.ui_MinAcquisitiontimeNs = 5000,
204		.interrupt		= v_APCI3XXX_Interrupt,
205		.reset			= i_APCI3XXX_Reset,
206		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
207		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
208		.di_bits		= apci3xxx_di_insn_bits,
209		.do_bits		= apci3xxx_do_insn_bits,
210		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
211		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
212		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
213		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
214	},
215	[BOARD_APCI3010_8] = {
216		.pc_DriverName		= "apci3010-8",
217		.i_IorangeBase0		= 256,
218		.i_IorangeBase1		= 256,
219		.i_IorangeBase2		= 256,
220		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
221		.pc_EepromChip		= ADDIDATA_9054,
222		.i_NbrAiChannel		= 8,
223		.i_NbrAiChannelDiff	= 4,
224		.i_AiChannelList	= 8,
225		.i_AiMaxdata		= 4095,
226		.pr_AiRangelist		= &range_apci3XXX_ai,
227		.i_NbrDiChannel		= 4,
228		.i_NbrDoChannel		= 4,
229		.i_DoMaxdata		= 1,
230		.i_NbrTTLChannel	= 24,
231		.b_AvailableConvertUnit	= 6,
232		.ui_MinAcquisitiontimeNs = 5000,
233		.interrupt		= v_APCI3XXX_Interrupt,
234		.reset			= i_APCI3XXX_Reset,
235		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
236		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
237		.di_bits		= apci3xxx_di_insn_bits,
238		.do_bits		= apci3xxx_do_insn_bits,
239		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
240		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
241		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
242		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
243	},
244	[BOARD_APCI3010_4] = {
245		.pc_DriverName		= "apci3010-4",
246		.i_IorangeBase0		= 256,
247		.i_IorangeBase1		= 256,
248		.i_IorangeBase2		= 256,
249		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
250		.pc_EepromChip		= ADDIDATA_9054,
251		.i_NbrAiChannel		= 4,
252		.i_NbrAiChannelDiff	= 2,
253		.i_AiChannelList	= 4,
254		.i_AiMaxdata		= 4095,
255		.pr_AiRangelist		= &range_apci3XXX_ai,
256		.i_NbrDiChannel		= 4,
257		.i_NbrDoChannel		= 4,
258		.i_DoMaxdata		= 1,
259		.i_NbrTTLChannel	= 24,
260		.b_AvailableConvertUnit	= 6,
261		.ui_MinAcquisitiontimeNs = 5000,
262		.interrupt		= v_APCI3XXX_Interrupt,
263		.reset			= i_APCI3XXX_Reset,
264		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
265		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
266		.di_bits		= apci3xxx_di_insn_bits,
267		.do_bits		= apci3xxx_do_insn_bits,
268		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
269		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
270		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
271		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
272	},
273	[BOARD_APCI3016_16] = {
274		.pc_DriverName		= "apci3016-16",
275		.i_IorangeBase0		= 256,
276		.i_IorangeBase1		= 256,
277		.i_IorangeBase2		= 256,
278		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
279		.pc_EepromChip		= ADDIDATA_9054,
280		.i_NbrAiChannel		= 16,
281		.i_NbrAiChannelDiff	= 8,
282		.i_AiChannelList	= 16,
283		.i_AiMaxdata		= 65535,
284		.pr_AiRangelist		= &range_apci3XXX_ai,
285		.i_NbrDiChannel		= 4,
286		.i_NbrDoChannel		= 4,
287		.i_DoMaxdata		= 1,
288		.i_NbrTTLChannel	= 24,
289		.b_AvailableConvertUnit	= 6,
290		.ui_MinAcquisitiontimeNs = 5000,
291		.interrupt		= v_APCI3XXX_Interrupt,
292		.reset			= i_APCI3XXX_Reset,
293		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
294		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
295		.di_bits		= apci3xxx_di_insn_bits,
296		.do_bits		= apci3xxx_do_insn_bits,
297		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
298		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
299		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
300		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
301	},
302	[BOARD_APCI3016_8] = {
303		.pc_DriverName		= "apci3016-8",
304		.i_IorangeBase0		= 256,
305		.i_IorangeBase1		= 256,
306		.i_IorangeBase2		= 256,
307		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
308		.pc_EepromChip		= ADDIDATA_9054,
309		.i_NbrAiChannel		= 8,
310		.i_NbrAiChannelDiff	= 4,
311		.i_AiChannelList	= 8,
312		.i_AiMaxdata		= 65535,
313		.pr_AiRangelist		= &range_apci3XXX_ai,
314		.i_NbrDiChannel		= 4,
315		.i_NbrDoChannel		= 4,
316		.i_DoMaxdata		= 1,
317		.i_NbrTTLChannel	= 24,
318		.b_AvailableConvertUnit	= 6,
319		.ui_MinAcquisitiontimeNs = 5000,
320		.interrupt		= v_APCI3XXX_Interrupt,
321		.reset			= i_APCI3XXX_Reset,
322		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
323		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
324		.di_bits		= apci3xxx_di_insn_bits,
325		.do_bits		= apci3xxx_do_insn_bits,
326		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
327		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
328		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
329		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
330	},
331	[BOARD_APCI3016_4] = {
332		.pc_DriverName		= "apci3016-4",
333		.i_IorangeBase0		= 256,
334		.i_IorangeBase1		= 256,
335		.i_IorangeBase2		= 256,
336		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
337		.pc_EepromChip		= ADDIDATA_9054,
338		.i_NbrAiChannel		= 4,
339		.i_NbrAiChannelDiff	= 2,
340		.i_AiChannelList	= 4,
341		.i_AiMaxdata		= 65535,
342		.pr_AiRangelist		= &range_apci3XXX_ai,
343		.i_NbrDiChannel		= 4,
344		.i_NbrDoChannel		= 4,
345		.i_DoMaxdata		= 1,
346		.i_NbrTTLChannel	= 24,
347		.b_AvailableConvertUnit	= 6,
348		.ui_MinAcquisitiontimeNs = 5000,
349		.interrupt		= v_APCI3XXX_Interrupt,
350		.reset			= i_APCI3XXX_Reset,
351		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
352		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
353		.di_bits		= apci3xxx_di_insn_bits,
354		.do_bits		= apci3xxx_do_insn_bits,
355		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
356		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
357		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
358		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
359	},
360	[BOARD_APCI3100_16_4] = {
361		.pc_DriverName		= "apci3100-16-4",
362		.i_IorangeBase0		= 256,
363		.i_IorangeBase1		= 256,
364		.i_IorangeBase2		= 256,
365		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
366		.pc_EepromChip		= ADDIDATA_9054,
367		.i_NbrAiChannel		= 16,
368		.i_NbrAiChannelDiff	= 8,
369		.i_AiChannelList	= 16,
370		.i_NbrAoChannel		= 4,
371		.i_AiMaxdata		= 4095,
372		.i_AoMaxdata		= 4095,
373		.pr_AiRangelist		= &range_apci3XXX_ai,
374		.pr_AoRangelist		= &range_apci3XXX_ao,
375		.i_NbrTTLChannel	= 24,
376		.b_AvailableConvertUnit	= 6,
377		.ui_MinAcquisitiontimeNs = 10000,
378		.interrupt		= v_APCI3XXX_Interrupt,
379		.reset			= i_APCI3XXX_Reset,
380		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
381		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
382		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
383		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
384		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
385		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
386		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
387	},
388	[BOARD_APCI3100_8_4] = {
389		.pc_DriverName		= "apci3100-8-4",
390		.i_IorangeBase0		= 256,
391		.i_IorangeBase1		= 256,
392		.i_IorangeBase2		= 256,
393		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
394		.pc_EepromChip		= ADDIDATA_9054,
395		.i_NbrAiChannel		= 8,
396		.i_NbrAiChannelDiff	= 4,
397		.i_AiChannelList	= 8,
398		.i_NbrAoChannel		= 4,
399		.i_AiMaxdata		= 4095,
400		.i_AoMaxdata		= 4095,
401		.pr_AiRangelist		= &range_apci3XXX_ai,
402		.pr_AoRangelist		= &range_apci3XXX_ao,
403		.i_NbrTTLChannel	= 24,
404		.b_AvailableConvertUnit	= 6,
405		.ui_MinAcquisitiontimeNs = 10000,
406		.interrupt		= v_APCI3XXX_Interrupt,
407		.reset			= i_APCI3XXX_Reset,
408		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
409		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
410		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
411		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
412		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
413		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
414		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
415	},
416	[BOARD_APCI3106_16_4] = {
417		.pc_DriverName		= "apci3106-16-4",
418		.i_IorangeBase0		= 256,
419		.i_IorangeBase1		= 256,
420		.i_IorangeBase2		= 256,
421		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
422		.pc_EepromChip		= ADDIDATA_9054,
423		.i_NbrAiChannel		= 16,
424		.i_NbrAiChannelDiff	= 8,
425		.i_AiChannelList	= 16,
426		.i_NbrAoChannel		= 4,
427		.i_AiMaxdata		= 65535,
428		.i_AoMaxdata		= 4095,
429		.pr_AiRangelist		= &range_apci3XXX_ai,
430		.pr_AoRangelist		= &range_apci3XXX_ao,
431		.i_NbrTTLChannel	= 24,
432		.b_AvailableConvertUnit	= 6,
433		.ui_MinAcquisitiontimeNs = 10000,
434		.interrupt		= v_APCI3XXX_Interrupt,
435		.reset			= i_APCI3XXX_Reset,
436		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
437		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
438		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
439		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
440		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
441		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
442		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
443	},
444	[BOARD_APCI3106_8_4] = {
445		.pc_DriverName		= "apci3106-8-4",
446		.i_IorangeBase0		= 256,
447		.i_IorangeBase1		= 256,
448		.i_IorangeBase2		= 256,
449		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
450		.pc_EepromChip		= ADDIDATA_9054,
451		.i_NbrAiChannel		= 8,
452		.i_NbrAiChannelDiff	= 4,
453		.i_AiChannelList	= 8,
454		.i_NbrAoChannel		= 4,
455		.i_AiMaxdata		= 65535,
456		.i_AoMaxdata		= 4095,
457		.pr_AiRangelist		= &range_apci3XXX_ai,
458		.pr_AoRangelist		= &range_apci3XXX_ao,
459		.i_NbrTTLChannel	= 24,
460		.b_AvailableConvertUnit	= 6,
461		.ui_MinAcquisitiontimeNs = 10000,
462		.interrupt		= v_APCI3XXX_Interrupt,
463		.reset			= i_APCI3XXX_Reset,
464		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
465		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
466		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
467		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
468		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
469		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
470		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
471	},
472	[BOARD_APCI3110_16_4] = {
473		.pc_DriverName		= "apci3110-16-4",
474		.i_IorangeBase0		= 256,
475		.i_IorangeBase1		= 256,
476		.i_IorangeBase2		= 256,
477		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
478		.pc_EepromChip		= ADDIDATA_9054,
479		.i_NbrAiChannel		= 16,
480		.i_NbrAiChannelDiff	= 8,
481		.i_AiChannelList	= 16,
482		.i_NbrAoChannel		= 4,
483		.i_AiMaxdata		= 4095,
484		.i_AoMaxdata		= 4095,
485		.pr_AiRangelist		= &range_apci3XXX_ai,
486		.pr_AoRangelist		= &range_apci3XXX_ao,
487		.i_NbrDiChannel		= 4,
488		.i_NbrDoChannel		= 4,
489		.i_DoMaxdata		= 1,
490		.i_NbrTTLChannel	= 24,
491		.b_AvailableConvertUnit	= 6,
492		.ui_MinAcquisitiontimeNs = 5000,
493		.interrupt		= v_APCI3XXX_Interrupt,
494		.reset			= i_APCI3XXX_Reset,
495		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
496		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
497		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
498		.di_bits		= apci3xxx_di_insn_bits,
499		.do_bits		= apci3xxx_do_insn_bits,
500		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
501		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
502		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
503		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
504	},
505	[BOARD_APCI3110_8_4] = {
506		.pc_DriverName		= "apci3110-8-4",
507		.i_IorangeBase0		= 256,
508		.i_IorangeBase1		= 256,
509		.i_IorangeBase2		= 256,
510		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
511		.pc_EepromChip		= ADDIDATA_9054,
512		.i_NbrAiChannel		= 8,
513		.i_NbrAiChannelDiff	= 4,
514		.i_AiChannelList	= 8,
515		.i_NbrAoChannel		= 4,
516		.i_AiMaxdata		= 4095,
517		.i_AoMaxdata		= 4095,
518		.pr_AiRangelist		= &range_apci3XXX_ai,
519		.pr_AoRangelist		= &range_apci3XXX_ao,
520		.i_NbrDiChannel		= 4,
521		.i_NbrDoChannel		= 4,
522		.i_DoMaxdata		= 1,
523		.i_NbrTTLChannel	= 24,
524		.b_AvailableConvertUnit	= 6,
525		.ui_MinAcquisitiontimeNs = 5000,
526		.interrupt		= v_APCI3XXX_Interrupt,
527		.reset			= i_APCI3XXX_Reset,
528		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
529		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
530		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
531		.di_bits		= apci3xxx_di_insn_bits,
532		.do_bits		= apci3xxx_do_insn_bits,
533		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
534		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
535		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
536		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
537	},
538	[BOARD_APCI3116_16_4] = {
539		.pc_DriverName		= "apci3116-16-4",
540		.i_IorangeBase0		= 256,
541		.i_IorangeBase1		= 256,
542		.i_IorangeBase2		= 256,
543		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
544		.pc_EepromChip		= ADDIDATA_9054,
545		.i_NbrAiChannel		= 16,
546		.i_NbrAiChannelDiff	= 8,
547		.i_AiChannelList	= 16,
548		.i_NbrAoChannel		= 4,
549		.i_AiMaxdata		= 65535,
550		.i_AoMaxdata		= 4095,
551		.pr_AiRangelist		= &range_apci3XXX_ai,
552		.pr_AoRangelist		= &range_apci3XXX_ao,
553		.i_NbrDiChannel		= 4,
554		.i_NbrDoChannel		= 4,
555		.i_DoMaxdata		= 1,
556		.i_NbrTTLChannel	= 24,
557		.b_AvailableConvertUnit	= 6,
558		.ui_MinAcquisitiontimeNs = 5000,
559		.interrupt		= v_APCI3XXX_Interrupt,
560		.reset			= i_APCI3XXX_Reset,
561		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
562		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
563		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
564		.di_bits		= apci3xxx_di_insn_bits,
565		.do_bits		= apci3xxx_do_insn_bits,
566		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
567		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
568		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
569		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
570	},
571	[BOARD_APCI3116_8_4] = {
572		.pc_DriverName		= "apci3116-8-4",
573		.i_IorangeBase0		= 256,
574		.i_IorangeBase1		= 256,
575		.i_IorangeBase2		= 256,
576		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
577		.pc_EepromChip		= ADDIDATA_9054,
578		.i_NbrAiChannel		= 8,
579		.i_NbrAiChannelDiff	= 4,
580		.i_AiChannelList	= 8,
581		.i_NbrAoChannel		= 4,
582		.i_AiMaxdata		= 65535,
583		.i_AoMaxdata		= 4095,
584		.pr_AiRangelist		= &range_apci3XXX_ai,
585		.pr_AoRangelist		= &range_apci3XXX_ao,
586		.i_NbrDiChannel		= 4,
587		.i_NbrDoChannel		= 4,
588		.i_DoMaxdata		= 1,
589		.i_NbrTTLChannel	= 24,
590		.b_AvailableConvertUnit	= 6,
591		.ui_MinAcquisitiontimeNs = 5000,
592		.interrupt		= v_APCI3XXX_Interrupt,
593		.reset			= i_APCI3XXX_Reset,
594		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
595		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
596		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
597		.di_bits		= apci3xxx_di_insn_bits,
598		.do_bits		= apci3xxx_do_insn_bits,
599		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
600		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
601		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
602		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
603	},
604	[BOARD_APCI3003] = {
605		.pc_DriverName		= "apci3003",
606		.i_IorangeBase0		= 256,
607		.i_IorangeBase1		= 256,
608		.i_IorangeBase2		= 256,
609		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
610		.pc_EepromChip		= ADDIDATA_9054,
611		.i_NbrAiChannelDiff	= 4,
612		.i_AiChannelList	= 4,
613		.i_AiMaxdata		= 65535,
614		.pr_AiRangelist		= &range_apci3XXX_ai,
615		.i_NbrDiChannel		= 4,
616		.i_NbrDoChannel		= 4,
617		.i_DoMaxdata		= 1,
618		.b_AvailableConvertUnit	= 7,
619		.ui_MinAcquisitiontimeNs = 2500,
620		.interrupt		= v_APCI3XXX_Interrupt,
621		.reset			= i_APCI3XXX_Reset,
622		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
623		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
624		.di_bits		= apci3xxx_di_insn_bits,
625		.do_bits		= apci3xxx_do_insn_bits,
626	},
627	[BOARD_APCI3002_16] = {
628		.pc_DriverName		= "apci3002-16",
629		.i_IorangeBase0		= 256,
630		.i_IorangeBase1		= 256,
631		.i_IorangeBase2		= 256,
632		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
633		.pc_EepromChip		= ADDIDATA_9054,
634		.i_NbrAiChannelDiff	= 16,
635		.i_AiChannelList	= 16,
636		.i_AiMaxdata		= 65535,
637		.pr_AiRangelist		= &range_apci3XXX_ai,
638		.i_NbrDiChannel		= 4,
639		.i_NbrDoChannel		= 4,
640		.i_DoMaxdata		= 1,
641		.b_AvailableConvertUnit	= 6,
642		.ui_MinAcquisitiontimeNs = 5000,
643		.interrupt		= v_APCI3XXX_Interrupt,
644		.reset			= i_APCI3XXX_Reset,
645		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
646		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
647		.di_bits		= apci3xxx_di_insn_bits,
648		.do_bits		= apci3xxx_do_insn_bits,
649	},
650	[BOARD_APCI3002_8] = {
651		.pc_DriverName		= "apci3002-8",
652		.i_IorangeBase0		= 256,
653		.i_IorangeBase1		= 256,
654		.i_IorangeBase2		= 256,
655		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
656		.pc_EepromChip		= ADDIDATA_9054,
657		.i_NbrAiChannelDiff	= 8,
658		.i_AiChannelList	= 8,
659		.i_AiMaxdata		= 65535,
660		.pr_AiRangelist		= &range_apci3XXX_ai,
661		.i_NbrDiChannel		= 4,
662		.i_NbrDoChannel		= 4,
663		.i_DoMaxdata		= 1,
664		.b_AvailableConvertUnit	= 6,
665		.ui_MinAcquisitiontimeNs = 5000,
666		.interrupt		= v_APCI3XXX_Interrupt,
667		.reset			= i_APCI3XXX_Reset,
668		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
669		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
670		.di_bits		= apci3xxx_di_insn_bits,
671		.do_bits		= apci3xxx_do_insn_bits,
672	},
673	[BOARD_APCI3002_4] = {
674		.pc_DriverName		= "apci3002-4",
675		.i_IorangeBase0		= 256,
676		.i_IorangeBase1		= 256,
677		.i_IorangeBase2		= 256,
678		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
679		.pc_EepromChip		= ADDIDATA_9054,
680		.i_NbrAiChannelDiff	= 4,
681		.i_AiChannelList	= 4,
682		.i_AiMaxdata		= 65535,
683		.pr_AiRangelist		= &range_apci3XXX_ai,
684		.i_NbrDiChannel		= 4,
685		.i_NbrDoChannel		= 4,
686		.i_DoMaxdata		= 1,
687		.b_AvailableConvertUnit	= 6,
688		.ui_MinAcquisitiontimeNs = 5000,
689		.interrupt		= v_APCI3XXX_Interrupt,
690		.reset			= i_APCI3XXX_Reset,
691		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
692		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
693		.di_bits		= apci3xxx_di_insn_bits,
694		.do_bits		= apci3xxx_do_insn_bits,
695	},
696	[BOARD_APCI3500] = {
697		.pc_DriverName		= "apci3500",
698		.i_IorangeBase0		= 256,
699		.i_IorangeBase1		= 256,
700		.i_IorangeBase2		= 256,
701		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
702		.pc_EepromChip		= ADDIDATA_9054,
703		.i_NbrAoChannel		= 4,
704		.i_AoMaxdata		= 4095,
705		.pr_AoRangelist		= &range_apci3XXX_ao,
706		.i_NbrTTLChannel	= 24,
707		.interrupt		= v_APCI3XXX_Interrupt,
708		.reset			= i_APCI3XXX_Reset,
709		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
710		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
711		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
712		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
713		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
714	},
715};
716
717static int apci3xxx_auto_attach(struct comedi_device *dev,
718				unsigned long context)
719{
720	const struct addi_board *board = NULL;
721
722	if (context < ARRAY_SIZE(apci3xxx_boardtypes))
723		board = &apci3xxx_boardtypes[context];
724	if (!board)
725		return -ENODEV;
726	dev->board_ptr = board;
727
728	return addi_auto_attach(dev, context);
729}
730
731static struct comedi_driver apci3xxx_driver = {
732	.driver_name	= "addi_apci_3xxx",
733	.module		= THIS_MODULE,
734	.auto_attach	= apci3xxx_auto_attach,
735	.detach		= i_ADDI_Detach,
736};
737
738static int apci3xxx_pci_probe(struct pci_dev *dev,
739			      const struct pci_device_id *id)
740{
741	return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data);
742}
743
744static DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = {
745	{ PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 },
746	{ PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 },
747	{ PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 },
748	{ PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 },
749	{ PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 },
750	{ PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 },
751	{ PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 },
752	{ PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 },
753	{ PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 },
754	{ PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 },
755	{ PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 },
756	{ PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 },
757	{ PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 },
758	{ PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 },
759	{ PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 },
760	{ PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 },
761	{ PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 },
762	{ PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 },
763	{ PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 },
764	{ PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 },
765	{ PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 },
766	{ PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 },
767	{ PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 },
768	{ PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 },
769	{ PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 },
770	{ 0 }
771};
772MODULE_DEVICE_TABLE(pci, apci3xxx_pci_table);
773
774static struct pci_driver apci3xxx_pci_driver = {
775	.name		= "addi_apci_3xxx",
776	.id_table	= apci3xxx_pci_table,
777	.probe		= apci3xxx_pci_probe,
778	.remove		= comedi_pci_auto_unconfig,
779};
780module_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver);
781
782MODULE_AUTHOR("Comedi http://www.comedi.org");
783MODULE_DESCRIPTION("Comedi low-level driver");
784MODULE_LICENSE("GPL");
785