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