addi_apci_3xxx.c revision e053b2419f5f0cff8ced6a8e39a93d113d9cd86a
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
998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten#ifndef COMEDI_SUBD_TTLIO
1098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten#define COMEDI_SUBD_TTLIO   11	/* Digital Input Output But TTL */
1198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten#endif
12c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten
1398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ai_range = {
1498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	8, {
1598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(10),
1698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(5),
1798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(2),
1898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(1),
1998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(10),
2098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(5),
2198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(2),
2298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(1)
2398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	}
2498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten};
2598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten
2698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ao_range = {
2798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	2, {
2898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(10),
2998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(10)
3098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	}
3198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten};
3298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten
33dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenenum apci3xxx_boardid {
34dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_16,
35dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_8,
36dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_4,
37dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_16,
38dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_8,
39dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_4,
40dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_16,
41dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_8,
42dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_4,
43dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_16,
44dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_8,
45dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_4,
46dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3100_16_4,
47dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3100_8_4,
48dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3106_16_4,
49dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3106_8_4,
50dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3110_16_4,
51dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3110_8_4,
52dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3116_16_4,
53dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3116_8_4,
54dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3003,
55dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_16,
56dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_8,
57dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_4,
58dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3500,
59dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten};
60dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
61e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstruct apci3xxx_boardinfo {
62e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	const char *pc_DriverName;
63e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_IorangeBase1;
64e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrAiChannel;
65e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrAiChannelDiff;
66e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_AiChannelList;
67e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrAoChannel;
68e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_AiMaxdata;
69e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_AoMaxdata;
70e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrDiChannel;
71e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrDoChannel;
72e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrTTLChannel;
73e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	unsigned char b_AvailableConvertUnit;
74e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	unsigned int ui_MinAcquisitiontimeNs;
75e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten};
76e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten
77e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstatic const struct apci3xxx_boardinfo apci3xxx_boardtypes[] = {
78dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_16] = {
79c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3000-16",
80c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
81c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
82c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
83c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
84c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
85c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
86c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
87c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
88dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
89dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_8] = {
90c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3000-8",
91c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
92c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
93c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
94c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
95c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
96c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
97c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
98c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
99dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
100dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_4] = {
101c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3000-4",
102c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
103c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
104c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
105c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
106c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
107c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
108c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
109c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
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_NbrAiChannel		= 16,
115c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
116c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
117c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
118c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
119c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
120c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
121dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
122dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_8] = {
123c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3006-8",
124c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
125c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
126c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
127c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
128c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
129c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
130c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
131c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
132dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
133dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_4] = {
134c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3006-4",
135c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
136c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
137c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
138c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
139c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
140c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
141c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
142c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
143dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
144dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_16] = {
145c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3010-16",
146c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
147c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
148c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
149c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
150c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
151c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
152c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
153c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
154c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
155c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
156dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
157dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_8] = {
158c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3010-8",
159c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
160c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
161c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
162c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
163c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
164c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
165c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
166c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
167c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
168c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
169dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
170dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_4] = {
171c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3010-4",
172c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
173c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
174c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
175c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
176c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
177c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
178c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
179c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
180c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
181c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
182dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
183dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_16] = {
184c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3016-16",
185c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
186c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
187c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
188c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
189c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
190c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
191c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
192c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
193c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
194c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
195dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
196dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_8] = {
197c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3016-8",
198c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
199c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
200c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
201c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
202c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
203c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
204c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
205c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
206c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
207c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
208dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
209dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_4] = {
210c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3016-4",
211c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
212c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
213c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
214c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
215c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
216c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
217c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
218c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
219c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
220c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
221dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
222dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3100_16_4] = {
223c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3100-16-4",
224c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
225c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
226c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
227c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
228c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
229c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
230c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
231c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
232c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
233c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
234dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
235dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3100_8_4] = {
236c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3100-8-4",
237c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
238c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
239c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
240c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
241c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
242c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
243c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
244c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
245c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
246c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
247dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
248dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3106_16_4] = {
249c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3106-16-4",
250c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
251c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
252c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
253c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
254c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
255c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
256c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
257c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
258c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
259c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
260dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
261dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3106_8_4] = {
262c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3106-8-4",
263c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
264c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
265c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
266c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
267c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
268c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
269c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
270c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
271c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
272c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
273dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
274dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3110_16_4] = {
275c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3110-16-4",
276c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
277c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
278c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
279c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
280c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
281c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
282c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
283c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
284c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
285c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
286c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
287c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
288dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
289dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3110_8_4] = {
290c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3110-8-4",
291c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
292c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
293c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
294c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
295c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
296c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
297c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
298c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
299c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
300c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
301c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
302c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
303dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
304dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3116_16_4] = {
305c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3116-16-4",
306c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
307c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
308c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
309c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
310c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
311c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
312c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
313c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
314c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
315c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
316c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
317c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
318dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
319dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3116_8_4] = {
320c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3116-8-4",
321c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
322c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
323c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
324c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
325c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
326c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
327c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
328c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
329c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
330c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
331c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
332c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
333dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
334dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3003] = {
335c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3003",
336c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
337c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
338c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
339c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
340c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
341c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
342c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 7,
343c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 2500,
344dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
345dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_16] = {
346c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3002-16",
347c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
348c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 16,
349c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
350c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
351c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
352c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
353c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
354c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
355dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
356dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_8] = {
357c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3002-8",
358c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
359c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
360c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
361c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
362c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
363c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
364c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
365c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
366dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
367dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_4] = {
368c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3002-4",
369c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
370c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
371c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
372c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
373c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
374c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
375c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
376c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
377dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
378dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3500] = {
379c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3500",
380c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
381c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
382c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
383c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
384c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten	},
385c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten};
386c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten
387e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten#include "addi-data/hwdrv_apci3xxx.c"
388e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten
3896c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweetenstatic irqreturn_t apci3xxx_irq_handler(int irq, void *d)
3906c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten{
3916c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	struct comedi_device *dev = d;
3926c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	struct addi_private *devpriv = dev->private;
3936c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	unsigned int status;
3946c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	int i;
3956c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
3966c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	/* Test if interrupt occur */
3976c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	status = readl(devpriv->dw_AiBase + 16);
3986c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	if ((status & 0x2) == 0x2) {
3996c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		/* Reset the interrupt */
4006c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		writel(status, devpriv->dw_AiBase + 16);
4016c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4026c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		/* Test if interrupt enabled */
4036c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		if (devpriv->b_EocEosInterrupt == 1) {
4046c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			/* Read all analog inputs value */
4056c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			for (i = 0; i < devpriv->ui_AiNbrofChannels; i++) {
4066c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				unsigned int val;
4076c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4086c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				val = readl(devpriv->dw_AiBase + 28);
4096c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				devpriv->ui_AiReadData[i] = val;
4106c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			}
4116c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4126c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			/* Set the interrupt flag */
4136c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			devpriv->b_EocEosInterrupt = 2;
4146c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4156c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			/* Send a signal to from kernel to user space */
4166c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			send_sig(SIGIO, devpriv->tsk_Current, 0);
4176c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		}
4186c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	}
4196c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	return IRQ_RETVAL(1);
4206c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten}
4216c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
422ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweetenstatic int apci3xxx_di_insn_bits(struct comedi_device *dev,
423ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 struct comedi_subdevice *s,
424ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 struct comedi_insn *insn,
425ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 unsigned int *data)
426ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten{
427ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten	struct addi_private *devpriv = dev->private;
428ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten
429ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten	data[1] = inl(devpriv->iobase + 32) & 0xf;
430ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten
431ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten	return insn->n;
432ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten}
433ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten
434c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweetenstatic int apci3xxx_do_insn_bits(struct comedi_device *dev,
435c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 struct comedi_subdevice *s,
436c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 struct comedi_insn *insn,
437c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 unsigned int *data)
438c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten{
439c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	struct addi_private *devpriv = dev->private;
440c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	unsigned int mask = data[0];
441c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	unsigned int bits = data[1];
442c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
443c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	s->state = inl(devpriv->iobase + 48) & 0xf;
444c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	if (mask) {
445c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		s->state &= ~mask;
446c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		s->state |= (bits & mask);
447c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
448c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		outl(s->state, devpriv->iobase + 48);
449c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	}
450c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
451c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	data[1] = s->state;
452c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
453c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	return insn->n;
454c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten}
455c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
4565e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev)
45798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
4585e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	struct addi_private *devpriv = dev->private;
4595e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	unsigned int val;
4605e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	int i;
4615e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
4625e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Disable the interrupt */
4635e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	disable_irq(dev->irq);
4645e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
4655e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Reset the interrupt flag */
4665e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	devpriv->b_EocEosInterrupt = 0;
4675e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
4685e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Clear the start command */
4695e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	writel(0, devpriv->dw_AiBase + 8);
4705e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
4715e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Reset the interrupt flags */
4725e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	val = readl(devpriv->dw_AiBase + 16);
4735e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	writel(val, devpriv->dw_AiBase + 16);
4745e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
4755e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* clear the EOS */
4765e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	readl(devpriv->dw_AiBase + 20);
4775e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
4785e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Clear the FIFO */
4795e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	for (i = 0; i < 16; i++)
4805e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten		val = readl(devpriv->dw_AiBase + 28);
4815e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
4825e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Enable the interrupt */
4835e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	enable_irq(dev->irq);
48498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
48598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return 0;
48698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
48798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
488dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev,
489dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten				unsigned long context)
490dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{
49198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct pci_dev *pcidev = comedi_to_pci_dev(dev);
492e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	const struct apci3xxx_boardinfo *board = NULL;
49398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct addi_private *devpriv;
49498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct comedi_subdevice *s;
49598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	int ret, n_subdevices;
496dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
497dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	if (context < ARRAY_SIZE(apci3xxx_boardtypes))
498dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten		board = &apci3xxx_boardtypes[context];
499dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	if (!board)
500dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten		return -ENODEV;
501dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	dev->board_ptr = board;
50298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	dev->board_name = board->pc_DriverName;
50398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
50498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
50598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (!devpriv)
50698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return -ENOMEM;
50798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	dev->private = devpriv;
50898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
50998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	ret = comedi_pci_enable(dev);
51098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (ret)
51198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return ret;
51298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
5132107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten	/* board has an ADDIDATA_9054 eeprom */
5142107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten	dev->iobase = pci_resource_start(pcidev, 2);
5152107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten	devpriv->iobase = pci_resource_start(pcidev, 2);
5162107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten	devpriv->dw_AiBase = pci_ioremap_bar(pcidev, 3);
51798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->i_IobaseReserved = pci_resource_start(pcidev, 3);
51898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
51998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (pcidev->irq > 0) {
5206c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		ret = request_irq(pcidev->irq, apci3xxx_irq_handler,
5216c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				  IRQF_SHARED, dev->board_name, dev);
52298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (ret == 0)
52398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			dev->irq = pcidev->irq;
52498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
52598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
52698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	n_subdevices = 7;
52798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	ret = comedi_alloc_subdevices(dev, n_subdevices);
52898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (ret)
52998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return ret;
53098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
53198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise AI Subdevice Structures */
53298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[0];
533f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten	if (board->i_NbrAiChannel || board->i_NbrAiChannelDiff) {
53498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		dev->read_subdev = s;
53598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_AI;
53698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_READABLE | SDF_COMMON | SDF_GROUND |
53798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten				  SDF_DIFF;
538f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		if (board->i_NbrAiChannel) {
539f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten			s->n_chan = board->i_NbrAiChannel;
54098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			devpriv->b_SingelDiff = 0;
54198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		} else {
54298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			s->n_chan = board->i_NbrAiChannelDiff;
54398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			devpriv->b_SingelDiff = 1;
54498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		}
545f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		s->maxdata = board->i_AiMaxdata;
54698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->len_chanlist = board->i_AiChannelList;
54798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		s->range_table = &apci3xxx_ai_range;
54898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
54998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		/* Set the initialisation flag */
55098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		devpriv->b_AiInitialisation = 1;
55198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
552b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_config = i_APCI3XXX_InsnConfigAnalogInput;
553b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_read = i_APCI3XXX_InsnReadAnalogInput;
55498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
55598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
55698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
55798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
55898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
55998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise AO Subdevice Structures */
56098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[1];
561f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten	if (board->i_NbrAoChannel) {
56298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_AO;
56398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
564f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		s->n_chan = board->i_NbrAoChannel;
565f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		s->maxdata = board->i_AoMaxdata;
56698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		s->range_table = &apci3xxx_ao_range;
567b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_write = i_APCI3XXX_InsnWriteAnalogOutput;
56898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
56998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
57098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
57198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise DI Subdevice Structures */
57298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[2];
573f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten	if (board->i_NbrDiChannel) {
57498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_DI;
57598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
576f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		s->n_chan = board->i_NbrDiChannel;
57798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = 1;
57898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = &range_digital;
57998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->io_bits = 0;	/* all bits input */
580ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten		s->insn_bits = apci3xxx_di_insn_bits;
58198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
58298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
58398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
58498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise DO Subdevice Structures */
58598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[3];
586f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten	if (board->i_NbrDoChannel) {
58798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_DO;
58898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags =
58998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
590f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		s->n_chan = board->i_NbrDoChannel;
59156e18770ae2991d315c4e164fab47171fc74c96aH Hartley Sweeten		s->maxdata = 1;
59298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = &range_digital;
59398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->io_bits = 0xf;	/* all bits output */
594c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		s->insn_bits = apci3xxx_do_insn_bits;
59598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
59698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
59798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
59898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
59998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise Timer Subdevice Structures */
60098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[4];
601178bd8d3a61432ce24399604b13cc756293d1ac8H Hartley Sweeten	s->type = COMEDI_SUBD_UNUSED;
60298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
60398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise TTL */
60498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[5];
60598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (board->i_NbrTTLChannel) {
60698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_TTLIO;
60798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags =
60898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
60998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->n_chan = board->i_NbrTTLChannel;
61098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = 1;
61198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->io_bits = 0;	/* all bits input */
61298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->len_chanlist = board->i_NbrTTLChannel;
61398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = &range_digital;
614b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_config = i_APCI3XXX_InsnConfigInitTTLIO;
615b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_bits = i_APCI3XXX_InsnBitsTTLIO;
616b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_read = i_APCI3XXX_InsnReadTTLIO;
617b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_write = i_APCI3XXX_InsnWriteTTLIO;
61898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
61998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
62098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
62198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
62298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/* EEPROM */
62398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[6];
62493c0dc284dff2e2fec320662d8ef01b933096e36H Hartley Sweeten	s->type = COMEDI_SUBD_UNUSED;
62598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
6265e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	apci3xxx_reset(dev);
62798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return 0;
62898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
62998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
63098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev)
63198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
63298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct addi_private *devpriv = dev->private;
633dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
63498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (devpriv) {
63598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (dev->iobase)
6365e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten			apci3xxx_reset(dev);
63798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (dev->irq)
63898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			free_irq(dev->irq, dev);
63998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (devpriv->dw_AiBase)
64098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			iounmap(devpriv->dw_AiBase);
64198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
64298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	comedi_pci_disable(dev);
643dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten}
644dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
64520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = {
64620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.driver_name	= "addi_apci_3xxx",
64720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.module		= THIS_MODULE,
648dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	.auto_attach	= apci3xxx_auto_attach,
64998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	.detach		= apci3xxx_detach,
65020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten};
65120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten
652a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev,
653b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten			      const struct pci_device_id *id)
65420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{
655b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten	return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data);
65620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}
65720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten
65820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = {
659dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 },
660dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 },
661dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 },
662dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 },
663dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 },
664dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 },
665dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 },
666dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 },
667dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 },
668dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 },
669dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 },
670dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 },
671dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 },
672dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 },
673dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 },
674dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 },
675dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 },
676dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 },
677dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 },
678dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 },
679dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 },
680dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 },
681dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 },
682dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 },
683dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 },
684317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten	{ 0 }
685317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten};
68620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table);
687317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten
68820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = {
68920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.name		= "addi_apci_3xxx",
69020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.id_table	= apci3xxx_pci_table,
69120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.probe		= apci3xxx_pci_probe,
6929901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe	.remove		= comedi_pci_auto_unconfig,
69320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten};
69420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver);
69590f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas
69690f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org");
69790f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver");
69890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL");
699