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