addi_apci_3xxx.c revision 98d3385dd68381dd2738a825f8513366c44018b2
133782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten#include <linux/pci.h>
233782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten
33d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "../comedidev.h"
43d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "comedi_fc.h"
5bf36f012c7ddaff083bb0ef187feddf4d85507a0H Hartley Sweeten#include "amcc_s5933.h"
63d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten
73d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "addi-data/addi_common.h"
83d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten
9bf6a1578c10a4f3ef94a3c744267f18f9c3642bdH Hartley Sweeten#include "addi-data/addi_eeprom.c"
10bf6a1578c10a4f3ef94a3c744267f18f9c3642bdH Hartley Sweeten#include "addi-data/hwdrv_apci3xxx.c"
1198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
1298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten#ifndef COMEDI_SUBD_TTLIO
1398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten#define COMEDI_SUBD_TTLIO   11	/* Digital Input Output But TTL */
1498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten#endif
15c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten
16dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenenum apci3xxx_boardid {
17dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_16,
18dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_8,
19dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_4,
20dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_16,
21dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_8,
22dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_4,
23dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_16,
24dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_8,
25dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_4,
26dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_16,
27dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_8,
28dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_4,
29dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3100_16_4,
30dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3100_8_4,
31dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3106_16_4,
32dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3106_8_4,
33dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3110_16_4,
34dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3110_8_4,
35dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3116_16_4,
36dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3116_8_4,
37dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3003,
38dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_16,
39dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_8,
40dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_4,
41dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3500,
42dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten};
43dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
4420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic const struct addi_board apci3xxx_boardtypes[] = {
45dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_16] = {
46c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3000-16",
47c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
48c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
49c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
50c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
51c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
52c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
53c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
54c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
55c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
56c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
57c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
58c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
597fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
60c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
61c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
62c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
63c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
64c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
65c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
66dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
67dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_8] = {
68c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3000-8",
69c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
70c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
71c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
72c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
73c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
74c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
75c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
76c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
77c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
78c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
79c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
80c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
817fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
82c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
83c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
84c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
85c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
86c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
87c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
88dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
89dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_4] = {
90c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3000-4",
91c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
92c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
93c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
94c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
95c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
96c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
97c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
98c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
99c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
100c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
101c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
102c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
1037fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
104c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
105c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
106c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
107c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
108c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
109c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
110dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
111dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_16] = {
112c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3006-16",
113c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
114c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
115c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
116c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
117c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
118c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
119c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
120c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
121c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
122c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
123c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
124c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
1257fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
126c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
127c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
128c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
129c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
130c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
131c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
132dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
133dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_8] = {
134c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3006-8",
135c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
136c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
137c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
138c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
139c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
140c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
141c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
142c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
143c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
144c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
145c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
146c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
1477fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
148c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
149c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
150c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
151c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
152c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
153c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
154dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
155dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_4] = {
156c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3006-4",
157c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
158c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
159c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
160c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
161c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
162c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
163c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
164c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
165c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
166c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
167c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
168c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
1697fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
170c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
171c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
172c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
173c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
174c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
175c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
176dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
177dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_16] = {
178c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3010-16",
179c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
180c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
181c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
182c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
183c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
184c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
185c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
186c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
187c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
188c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
189c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
190c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
191c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
192c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
193c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
1947fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
195c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
196c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
19710f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
1982b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
199c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
200c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
201c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
202c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
203dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
204dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_8] = {
205c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3010-8",
206c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
207c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
208c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
209c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
210c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
211c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
212c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
213c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
214c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
215c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
216c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
217c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
218c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
219c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
220c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
2217fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
222c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
223c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
22410f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
2252b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
226c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
227c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
228c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
229c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
230dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
231dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_4] = {
232c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3010-4",
233c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
234c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
235c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
236c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
237c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
238c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
239c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
240c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
241c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
242c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
243c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
244c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
245c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
246c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
247c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
2487fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
249c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
250c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
25110f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
2522b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
253c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
254c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
255c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
256c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
257dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
258dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_16] = {
259c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3016-16",
260c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
261c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
262c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
263c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
264c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
265c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
266c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
267c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
268c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
269c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
270c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
271c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
272c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
273c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
274c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
2757fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
276c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
277c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
27810f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
2792b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
280c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
281c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
282c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
283c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
284dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
285dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_8] = {
286c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3016-8",
287c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
288c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
289c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
290c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
291c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
292c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
293c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
294c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
295c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
296c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
297c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
298c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
299c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
300c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
301c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
3027fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
303c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
304c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
30510f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
3062b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
307c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
308c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
309c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
310c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
311dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
312dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_4] = {
313c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3016-4",
314c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
315c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
316c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
317c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
318c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
319c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
320c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
321c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
322c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
323c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
324c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
325c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
326c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
327c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
328c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
3297fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
330c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
331c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
33210f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
3332b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
334c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
335c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
336c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
337c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
338dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
339dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3100_16_4] = {
340c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3100-16-4",
341c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
342c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
343c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
344c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
345c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
346c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
347c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
348c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
349c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
350c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
351c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AoRangelist		= &range_apci3XXX_ao,
352c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
353c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
354c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
355c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
3567fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
357c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
358c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
359c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
360c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
361c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
362c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
363c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
364dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
365dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3100_8_4] = {
366c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3100-8-4",
367c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
368c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
369c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
370c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
371c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
372c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
373c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
374c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
375c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
376c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
377c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AoRangelist		= &range_apci3XXX_ao,
378c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
379c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
380c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
381c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
3827fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
383c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
384c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
385c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
386c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
387c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
388c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
389c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
390dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
391dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3106_16_4] = {
392c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3106-16-4",
393c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
394c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
395c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
396c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
397c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
398c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
399c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
400c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
401c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
402c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
403c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AoRangelist		= &range_apci3XXX_ao,
404c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
405c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
406c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
407c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
4087fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
409c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
410c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
411c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
412c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
413c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
414c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
415c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
416dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
417dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3106_8_4] = {
418c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3106-8-4",
419c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
420c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
421c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
422c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
423c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
424c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
425c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
426c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
427c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
428c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
429c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AoRangelist		= &range_apci3XXX_ao,
430c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
431c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
432c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
433c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
4347fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
435c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
436c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
437c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
438c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
439c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
440c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
441c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
442dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
443dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3110_16_4] = {
444c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3110-16-4",
445c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
446c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
447c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
448c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
449c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
450c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
451c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
452c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
453c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
454c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
455c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AoRangelist		= &range_apci3XXX_ao,
456c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
457c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
458c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
459c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
460c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
461c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
462c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
4637fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
464c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
465c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
466c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
46710f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
4682b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
469c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
470c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
471c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
472c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
473dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
474dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3110_8_4] = {
475c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3110-8-4",
476c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
477c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
478c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
479c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
480c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
481c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
482c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
483c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
484c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
485c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
486c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AoRangelist		= &range_apci3XXX_ao,
487c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
488c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
489c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
490c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
491c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
492c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
493c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
4947fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
495c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
496c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
497c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
49810f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
4992b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
500c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
501c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
502c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
503c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
504dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
505dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3116_16_4] = {
506c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3116-16-4",
507c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
508c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
509c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
510c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
511c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
512c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
513c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
514c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
515c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
516c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
517c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AoRangelist		= &range_apci3XXX_ao,
518c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
519c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
520c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
521c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
522c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
523c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
524c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
5257fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
526c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
527c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
528c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
52910f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
5302b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
531c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
532c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
533c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
534c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
535dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
536dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3116_8_4] = {
537c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3116-8-4",
538c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
539c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
540c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
541c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
542c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
543c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
544c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
545c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
546c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
547c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
548c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AoRangelist		= &range_apci3XXX_ao,
549c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
550c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
551c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
552c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
553c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
554c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
555c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
5567fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
557c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
558c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
559c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
56010f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
5612b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
562c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
563c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
564c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
565c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
566dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
567dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3003] = {
568c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3003",
569c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
570c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
571c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
572c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
573c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
574c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
575c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
576c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
577c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
578c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
579c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 7,
580c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 2500,
581c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
5827fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
583c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
584c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
58510f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
5862b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
587dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
588dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_16] = {
589c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3002-16",
590c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
591c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
592c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
593c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 16,
594c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
595c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
596c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
597c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
598c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
599c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
600c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
601c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
602c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
6037fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
604c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
605c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
60610f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
6072b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
608dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
609dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_8] = {
610c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3002-8",
611c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
612c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
613c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
614c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
615c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
616c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
617c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
618c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
619c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
620c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
621c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
622c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
623c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
6247fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
625c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
626c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
62710f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
6282b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
629dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
630dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_4] = {
631c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3002-4",
632c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
633c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
634c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
635c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
636c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
637c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
638c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AiRangelist		= &range_apci3XXX_ai,
639c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
640c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
641c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_DoMaxdata		= 1,
642c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
643c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
644c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
6457fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
646c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_config		= i_APCI3XXX_InsnConfigAnalogInput,
647c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ai_read		= i_APCI3XXX_InsnReadAnalogInput,
64810f71c7845686b7f93113f1fe6dbc3718d8a8673H Hartley Sweeten		.di_bits		= apci3xxx_di_insn_bits,
6492b70a4f4f97b70e8cd9d8a16983758aa4fc3450bH Hartley Sweeten		.do_bits		= apci3xxx_do_insn_bits,
650dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
651dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3500] = {
652c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3500",
653c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
654c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_PCIEeprom		= ADDIDATA_NO_EEPROM,
655c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_EepromChip		= ADDIDATA_9054,
656c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
657c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
658c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pr_AoRangelist		= &range_apci3XXX_ao,
659c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
660c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.interrupt		= v_APCI3XXX_Interrupt,
6617fd1fd30fd9a12b037045c2e9eba120479e0f329H Hartley Sweeten		.reset			= apci3xxx_reset,
662c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ao_write		= i_APCI3XXX_InsnWriteAnalogOutput,
663c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_config		= i_APCI3XXX_InsnConfigInitTTLIO,
664c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_bits		= i_APCI3XXX_InsnBitsTTLIO,
665c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_read		= i_APCI3XXX_InsnReadTTLIO,
666c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ttl_write		= i_APCI3XXX_InsnWriteTTLIO,
667c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten	},
668c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten};
669c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten
67098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,
67198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten				     struct comedi_subdevice *s,
67298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten				     struct comedi_insn *insn,
67398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten				     unsigned int *data)
67498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
67598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	const struct addi_board *this_board = comedi_board(dev);
67698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct addi_private *devpriv = dev->private;
67798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	unsigned short w_Address = CR_CHAN(insn->chanspec);
67898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	unsigned short w_Data;
67998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
68098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	w_Data = addi_eeprom_readw(devpriv->i_IobaseAmcc,
68198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		this_board->pc_EepromChip, 2 * w_Address);
68298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	data[0] = w_Data;
68398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
68498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return insn->n;
68598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
68698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
68798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic irqreturn_t v_ADDI_Interrupt(int irq, void *d)
68898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
68998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct comedi_device *dev = d;
69098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	const struct addi_board *this_board = comedi_board(dev);
69198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
69298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	this_board->interrupt(irq, d);
69398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return IRQ_RETVAL(1);
69498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
69598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
69698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic int i_ADDI_Reset(struct comedi_device *dev)
69798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
69898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	const struct addi_board *this_board = comedi_board(dev);
69998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
70098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	this_board->reset(dev);
70198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return 0;
70298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
70398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
704dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev,
705dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten				unsigned long context)
706dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{
70798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct pci_dev *pcidev = comedi_to_pci_dev(dev);
708dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	const struct addi_board *board = NULL;
70998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct addi_private *devpriv;
71098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct comedi_subdevice *s;
71198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	int ret, n_subdevices;
71298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	unsigned int dw_Dummy;
713dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
714dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	if (context < ARRAY_SIZE(apci3xxx_boardtypes))
715dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten		board = &apci3xxx_boardtypes[context];
716dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	if (!board)
717dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten		return -ENODEV;
718dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	dev->board_ptr = board;
71998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	dev->board_name = board->pc_DriverName;
72098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
72198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
72298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (!devpriv)
72398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return -ENOMEM;
72498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	dev->private = devpriv;
72598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
72698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	ret = comedi_pci_enable(dev);
72798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (ret)
72898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return ret;
72998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
73098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (!board->pc_EepromChip ||
73198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	    strcmp(board->pc_EepromChip, ADDIDATA_9054)) {
73298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		/* board does not have an eeprom or is not ADDIDATA_9054 */
73398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (board->i_IorangeBase1)
73498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			dev->iobase = pci_resource_start(pcidev, 1);
73598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		else
73698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			dev->iobase = pci_resource_start(pcidev, 0);
73798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
73898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		devpriv->iobase = dev->iobase;
73998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		devpriv->i_IobaseAmcc = pci_resource_start(pcidev, 0);
74098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		devpriv->i_IobaseAddon = pci_resource_start(pcidev, 2);
74198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
74298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		/* board has an ADDIDATA_9054 eeprom */
74398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		dev->iobase = pci_resource_start(pcidev, 2);
74498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		devpriv->iobase = pci_resource_start(pcidev, 2);
74598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		devpriv->dw_AiBase = pci_ioremap_bar(pcidev, 3);
74698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
74798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->i_IobaseReserved = pci_resource_start(pcidev, 3);
74898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
74998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/* Initialize parameters that can be overridden in EEPROM */
75098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.i_NbrAiChannel = board->i_NbrAiChannel;
75198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.i_NbrAoChannel = board->i_NbrAoChannel;
75298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.i_AiMaxdata = board->i_AiMaxdata;
75398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.i_AoMaxdata = board->i_AoMaxdata;
75498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.i_NbrDiChannel = board->i_NbrDiChannel;
75598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.i_NbrDoChannel = board->i_NbrDoChannel;
75698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.i_DoMaxdata = board->i_DoMaxdata;
75798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.i_Dma = board->i_Dma;
75898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.i_Timer = board->i_Timer;
75998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.ui_MinAcquisitiontimeNs =
76098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten						board->ui_MinAcquisitiontimeNs;
76198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->s_EeParameters.ui_MinDelaytimeNs = board->ui_MinDelaytimeNs;
76298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
76398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/* ## */
76498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
76598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (pcidev->irq > 0) {
76698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		ret = request_irq(pcidev->irq, v_ADDI_Interrupt, IRQF_SHARED,
76798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten				  dev->board_name, dev);
76898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (ret == 0)
76998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			dev->irq = pcidev->irq;
77098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
77198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
77298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Read eepeom and fill addi_board Structure */
77398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
77498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (board->i_PCIEeprom) {
77598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (!(strcmp(board->pc_EepromChip, "S5920"))) {
77698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			/*  Set 3 wait stait */
77798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			if (!(strcmp(dev->board_name, "apci035")))
77898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten				outl(0x80808082, devpriv->i_IobaseAmcc + 0x60);
77998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			else
78098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten				outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
78198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
78298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			/*  Enable the interrupt for the controller */
78398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
78498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
78598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		}
78698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		addi_eeprom_read_info(dev, pci_resource_start(pcidev, 0));
78798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
78898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
78998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	n_subdevices = 7;
79098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	ret = comedi_alloc_subdevices(dev, n_subdevices);
79198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (ret)
79298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return ret;
79398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
79498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise AI Subdevice Structures */
79598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[0];
79698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (devpriv->s_EeParameters.i_NbrAiChannel ||
79798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	    board->i_NbrAiChannelDiff) {
79898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		dev->read_subdev = s;
79998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_AI;
80098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_READABLE | SDF_COMMON | SDF_GROUND |
80198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten				  SDF_DIFF;
80298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (devpriv->s_EeParameters.i_NbrAiChannel) {
80398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			s->n_chan = devpriv->s_EeParameters.i_NbrAiChannel;
80498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			devpriv->b_SingelDiff = 0;
80598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		} else {
80698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			s->n_chan = board->i_NbrAiChannelDiff;
80798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			devpriv->b_SingelDiff = 1;
80898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		}
80998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = devpriv->s_EeParameters.i_AiMaxdata;
81098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->len_chanlist = board->i_AiChannelList;
81198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = board->pr_AiRangelist;
81298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
81398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		/* Set the initialisation flag */
81498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		devpriv->b_AiInitialisation = 1;
81598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
81698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_config = board->ai_config;
81798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_read = board->ai_read;
81898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_write = board->ai_write;
81998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_bits = board->ai_bits;
82098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->do_cmdtest = board->ai_cmdtest;
82198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->do_cmd = board->ai_cmd;
82298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->cancel = board->ai_cancel;
82398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
82498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
82598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
82698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
82798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
82898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise AO Subdevice Structures */
82998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[1];
83098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (devpriv->s_EeParameters.i_NbrAoChannel) {
83198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_AO;
83298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
83398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->n_chan = devpriv->s_EeParameters.i_NbrAoChannel;
83498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = devpriv->s_EeParameters.i_AoMaxdata;
83598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->len_chanlist = devpriv->s_EeParameters.i_NbrAoChannel;
83698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = board->pr_AoRangelist;
83798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_config = board->ao_config;
83898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_write = board->ao_write;
83998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
84098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
84198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
84298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise DI Subdevice Structures */
84398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[2];
84498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (devpriv->s_EeParameters.i_NbrDiChannel) {
84598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_DI;
84698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
84798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->n_chan = devpriv->s_EeParameters.i_NbrDiChannel;
84898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = 1;
84998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->len_chanlist = devpriv->s_EeParameters.i_NbrDiChannel;
85098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = &range_digital;
85198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->io_bits = 0;	/* all bits input */
85298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_config = board->di_config;
85398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_read = board->di_read;
85498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_write = board->di_write;
85598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_bits = board->di_bits;
85698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
85798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
85898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
85998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise DO Subdevice Structures */
86098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[3];
86198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (devpriv->s_EeParameters.i_NbrDoChannel) {
86298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_DO;
86398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags =
86498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
86598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->n_chan = devpriv->s_EeParameters.i_NbrDoChannel;
86698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = devpriv->s_EeParameters.i_DoMaxdata;
86798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->len_chanlist = devpriv->s_EeParameters.i_NbrDoChannel;
86898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = &range_digital;
86998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->io_bits = 0xf;	/* all bits output */
87098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
87198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		/* insn_config - for digital output memory */
87298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_config = board->do_config;
87398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_write = board->do_write;
87498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_bits = board->do_bits;
87598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_read = board->do_read;
87698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
87798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
87898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
87998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
88098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise Timer Subdevice Structures */
88198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[4];
88298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (devpriv->s_EeParameters.i_Timer) {
88398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_TIMER;
88498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
88598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->n_chan = 1;
88698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = 0;
88798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->len_chanlist = 1;
88898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = &range_digital;
88998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
89098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_write = board->timer_write;
89198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_read = board->timer_read;
89298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_config = board->timer_config;
89398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_bits = board->timer_bits;
89498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
89598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
89698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
89798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
89898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise TTL */
89998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[5];
90098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (board->i_NbrTTLChannel) {
90198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_TTLIO;
90298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags =
90398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
90498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->n_chan = board->i_NbrTTLChannel;
90598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = 1;
90698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->io_bits = 0;	/* all bits input */
90798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->len_chanlist = board->i_NbrTTLChannel;
90898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = &range_digital;
90998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_config = board->ttl_config;
91098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_bits = board->ttl_bits;
91198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_read = board->ttl_read;
91298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_write = board->ttl_write;
91398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
91498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
91598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
91698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
91798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/* EEPROM */
91898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[6];
91998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (board->i_PCIEeprom) {
92098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_MEMORY;
92198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
92298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->n_chan = 256;
92398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = 0xffff;
92498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->insn_read = i_ADDIDATA_InsnReadEeprom;
92598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
92698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
92798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
92898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
92998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	i_ADDI_Reset(dev);
93098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return 0;
93198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
93298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
93398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev)
93498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
93598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct addi_private *devpriv = dev->private;
936dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
93798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (devpriv) {
93898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (dev->iobase)
93998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			i_ADDI_Reset(dev);
94098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (dev->irq)
94198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			free_irq(dev->irq, dev);
94298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (devpriv->dw_AiBase)
94398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			iounmap(devpriv->dw_AiBase);
94498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
94598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	comedi_pci_disable(dev);
946dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten}
947dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
94820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = {
94920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.driver_name	= "addi_apci_3xxx",
95020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.module		= THIS_MODULE,
951dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	.auto_attach	= apci3xxx_auto_attach,
95298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	.detach		= apci3xxx_detach,
95320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten};
95420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten
955a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev,
956b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten			      const struct pci_device_id *id)
95720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{
958b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten	return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data);
95920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}
96020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten
96120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = {
962dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 },
963dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 },
964dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 },
965dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 },
966dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 },
967dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 },
968dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 },
969dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 },
970dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 },
971dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 },
972dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 },
973dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 },
974dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 },
975dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 },
976dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 },
977dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 },
978dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 },
979dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 },
980dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 },
981dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 },
982dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 },
983dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 },
984dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 },
985dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 },
986dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 },
987317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten	{ 0 }
988317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten};
98920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table);
990317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten
99120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = {
99220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.name		= "addi_apci_3xxx",
99320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.id_table	= apci3xxx_pci_table,
99420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.probe		= apci3xxx_pci_probe,
9959901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe	.remove		= comedi_pci_auto_unconfig,
99620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten};
99720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver);
99890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas
99990f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org");
100090f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver");
100190f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL");
1002