addi_apci_3xxx.c revision 5c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1
15c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten/*
25c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * addi_apci_3xxx.c
35c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.
45c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * Project manager: S. Weber
55c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten *
65c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten *	ADDI-DATA GmbH
75c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten *	Dieselstrasse 3
85c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten *	D-77833 Ottersweier
95c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten *	Tel: +19(0)7223/9493-0
105c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten *	Fax: +49(0)7223/9493-92
115c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten *	http://www.addi-data.com
125c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten *	info@addi-data.com
135c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten *
145c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * This program is free software; you can redistribute it and/or modify it
155c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * under the terms of the GNU General Public License as published by the
165c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * Free Software Foundation; either version 2 of the License, or (at your
175c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * option) any later version.
185c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten *
195c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * This program is distributed in the hope that it will be useful, but WITHOUT
205c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
215c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
225c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * more details.
235c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten */
245c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten
2533782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten#include <linux/pci.h>
261867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten#include <linux/interrupt.h>
271867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten#include <linux/sched.h>
2833782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten
293d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "../comedidev.h"
303d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten
3198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ai_range = {
3298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	8, {
3398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(10),
3498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(5),
3598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(2),
3698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(1),
3798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(10),
3898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(5),
3998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(2),
4098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(1)
4198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	}
4298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten};
4398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten
4498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ao_range = {
4598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	2, {
4698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(10),
4798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(10)
4898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	}
4998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten};
5098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten
51dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenenum apci3xxx_boardid {
52dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_16,
53dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_8,
54dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_4,
55dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_16,
56dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_8,
57dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_4,
58dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_16,
59dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_8,
60dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_4,
61dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_16,
62dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_8,
63dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_4,
64dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3100_16_4,
65dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3100_8_4,
66dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3106_16_4,
67dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3106_8_4,
68dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3110_16_4,
69dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3110_8_4,
70dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3116_16_4,
71dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3116_8_4,
72dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3003,
73dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_16,
74dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_8,
75dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_4,
76dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3500,
77dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten};
78dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
79e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstruct apci3xxx_boardinfo {
80e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	const char *pc_DriverName;
81e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_IorangeBase1;
82e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrAiChannel;
83e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrAiChannelDiff;
84e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_AiChannelList;
85e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrAoChannel;
86e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_AiMaxdata;
87e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_AoMaxdata;
88e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrDiChannel;
89e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrDoChannel;
90e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrTTLChannel;
91e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	unsigned char b_AvailableConvertUnit;
92e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	unsigned int ui_MinAcquisitiontimeNs;
93e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten};
94e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten
95e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstatic const struct apci3xxx_boardinfo apci3xxx_boardtypes[] = {
96dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_16] = {
97c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3000-16",
98c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
99c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
100c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
101c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
102c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
103c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
104c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
105c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
106dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
107dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_8] = {
108c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3000-8",
109c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
110c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
111c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
112c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
113c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
114c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
115c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
116c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
117dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
118dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_4] = {
119c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3000-4",
120c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
121c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
122c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
123c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
124c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
125c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
126c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
127c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
128dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
129dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_16] = {
130c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3006-16",
131c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
132c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
133c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
134c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
135c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
136c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
137c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
138c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
139dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
140dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_8] = {
141c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3006-8",
142c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
143c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
144c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
145c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
146c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
147c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
148c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
149c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
150dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
151dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_4] = {
152c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3006-4",
153c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
154c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
155c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
156c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
157c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
158c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
159c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
160c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
161dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
162dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_16] = {
163c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3010-16",
164c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
165c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
166c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
167c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
168c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
169c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
170c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
171c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
172c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
173c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
174dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
175dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_8] = {
176c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3010-8",
177c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
178c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
179c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
180c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
181c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
182c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
183c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
184c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
185c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
186c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
187dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
188dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_4] = {
189c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3010-4",
190c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
191c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
192c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
193c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
194c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
195c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
196c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
197c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
198c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
199c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
200dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
201dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_16] = {
202c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3016-16",
203c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
204c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
205c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
206c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
207c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
208c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
209c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
210c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
211c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
212c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
213dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
214dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_8] = {
215c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3016-8",
216c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
217c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
218c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
219c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
220c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
221c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
222c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
223c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
224c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
225c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
226dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
227dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_4] = {
228c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3016-4",
229c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
230c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
231c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
232c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
233c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
234c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
235c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
236c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
237c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
238c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
239dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
240dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3100_16_4] = {
241c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3100-16-4",
242c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
243c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
244c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
245c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
246c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
247c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
248c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
249c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
250c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
251c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
252dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
253dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3100_8_4] = {
254c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3100-8-4",
255c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
256c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
257c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
258c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
259c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
260c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
261c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
262c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
263c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
264c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
265dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
266dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3106_16_4] = {
267c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3106-16-4",
268c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
269c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
270c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
271c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
272c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
273c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
274c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
275c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
276c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
277c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
278dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
279dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3106_8_4] = {
280c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3106-8-4",
281c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
282c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
283c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
284c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
285c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
286c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
287c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
288c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
289c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
290c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
291dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
292dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3110_16_4] = {
293c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3110-16-4",
294c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
295c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
296c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
297c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
298c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
299c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
300c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
301c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
302c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
303c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
304c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
305c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
306dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
307dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3110_8_4] = {
308c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3110-8-4",
309c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
310c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
311c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
312c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
313c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
314c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 4095,
315c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
316c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
317c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
318c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
319c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
320c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
321dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
322dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3116_16_4] = {
323c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3116-16-4",
324c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
325c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
326c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
327c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
328c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
329c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
330c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
331c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
332c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
333c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
334c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
335c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
336dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
337dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3116_8_4] = {
338c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3116-8-4",
339c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
340c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
341c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
342c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
343c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
344c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
345c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
346c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
347c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
348c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
349c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
350c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
351dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
352dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3003] = {
353c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3003",
354c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
355c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
356c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
357c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
358c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
359c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
360c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 7,
361c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 2500,
362dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
363dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_16] = {
364c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3002-16",
365c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
366c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 16,
367c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 16,
368c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
369c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
370c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
371c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
372c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
373dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
374dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_8] = {
375c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3002-8",
376c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
377c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
378c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 8,
379c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
380c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
381c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
382c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
383c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
384dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
385dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_4] = {
386c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3002-4",
387c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
388c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
389c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiChannelList	= 4,
390c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AiMaxdata		= 65535,
391c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDiChannel		= 4,
392c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrDoChannel		= 4,
393c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.b_AvailableConvertUnit	= 6,
394c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
395dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
396dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3500] = {
397c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.pc_DriverName		= "apci3500",
398c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_IorangeBase1		= 256,
399c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAoChannel		= 4,
400c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_AoMaxdata		= 4095,
401c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrTTLChannel	= 24,
402c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten	},
403c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten};
404c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten
4051867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweetenstruct apci3xxx_private {
4061867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	int iobase;
4071867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	int i_IobaseReserved;
4081867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	void __iomem *dw_AiBase;
4091867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned char b_AiInitialisation;
4101867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned int ui_AiNbrofChannels;	/*  how many channels is measured */
4111867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned int ui_AiReadData[32];
4121867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned char b_EocEosInterrupt;
4131867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned int ui_EocEosConversionTime;
4141867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned char b_EocEosConversionTimeBase;
4151867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned char b_SingelDiff;
4161867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct task_struct *tsk_Current;
4171867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned int ul_TTLPortConfiguration[10];
4181867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten};
4191867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten
420e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten#include "addi-data/hwdrv_apci3xxx.c"
421e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten
4226c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweetenstatic irqreturn_t apci3xxx_irq_handler(int irq, void *d)
4236c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten{
4246c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	struct comedi_device *dev = d;
4251867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
4266c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	unsigned int status;
4276c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	int i;
4286c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4296c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	/* Test if interrupt occur */
4306c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	status = readl(devpriv->dw_AiBase + 16);
4316c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	if ((status & 0x2) == 0x2) {
4326c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		/* Reset the interrupt */
4336c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		writel(status, devpriv->dw_AiBase + 16);
4346c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4356c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		/* Test if interrupt enabled */
4366c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		if (devpriv->b_EocEosInterrupt == 1) {
4376c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			/* Read all analog inputs value */
4386c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			for (i = 0; i < devpriv->ui_AiNbrofChannels; i++) {
4396c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				unsigned int val;
4406c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4416c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				val = readl(devpriv->dw_AiBase + 28);
4426c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				devpriv->ui_AiReadData[i] = val;
4436c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			}
4446c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4456c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			/* Set the interrupt flag */
4466c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			devpriv->b_EocEosInterrupt = 2;
4476c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4486c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			/* Send a signal to from kernel to user space */
4496c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			send_sig(SIGIO, devpriv->tsk_Current, 0);
4506c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		}
4516c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	}
4526c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	return IRQ_RETVAL(1);
4536c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten}
4546c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
455ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweetenstatic int apci3xxx_di_insn_bits(struct comedi_device *dev,
456ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 struct comedi_subdevice *s,
457ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 struct comedi_insn *insn,
458ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 unsigned int *data)
459ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten{
4601867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
461ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten
462ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten	data[1] = inl(devpriv->iobase + 32) & 0xf;
463ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten
464ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten	return insn->n;
465ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten}
466ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten
467c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweetenstatic int apci3xxx_do_insn_bits(struct comedi_device *dev,
468c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 struct comedi_subdevice *s,
469c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 struct comedi_insn *insn,
470c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 unsigned int *data)
471c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten{
4721867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
473c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	unsigned int mask = data[0];
474c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	unsigned int bits = data[1];
475c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
476c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	s->state = inl(devpriv->iobase + 48) & 0xf;
477c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	if (mask) {
478c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		s->state &= ~mask;
479c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		s->state |= (bits & mask);
480c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
481c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		outl(s->state, devpriv->iobase + 48);
482c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	}
483c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
484c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	data[1] = s->state;
485c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
486c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	return insn->n;
487c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten}
488c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
4895e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev)
49098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
4911867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
4925e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	unsigned int val;
4935e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	int i;
4945e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
4955e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Disable the interrupt */
4965e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	disable_irq(dev->irq);
4975e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
4985e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Reset the interrupt flag */
4995e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	devpriv->b_EocEosInterrupt = 0;
5005e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5015e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Clear the start command */
5025e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	writel(0, devpriv->dw_AiBase + 8);
5035e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5045e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Reset the interrupt flags */
5055e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	val = readl(devpriv->dw_AiBase + 16);
5065e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	writel(val, devpriv->dw_AiBase + 16);
5075e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5085e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* clear the EOS */
5095e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	readl(devpriv->dw_AiBase + 20);
5105e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5115e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Clear the FIFO */
5125e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	for (i = 0; i < 16; i++)
5135e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten		val = readl(devpriv->dw_AiBase + 28);
5145e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5155e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Enable the interrupt */
5165e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	enable_irq(dev->irq);
51798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
51898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return 0;
51998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
52098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
521dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev,
522dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten				unsigned long context)
523dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{
52498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct pci_dev *pcidev = comedi_to_pci_dev(dev);
525e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	const struct apci3xxx_boardinfo *board = NULL;
5261867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv;
52798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct comedi_subdevice *s;
52898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	int ret, n_subdevices;
529dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
530dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	if (context < ARRAY_SIZE(apci3xxx_boardtypes))
531dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten		board = &apci3xxx_boardtypes[context];
532dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	if (!board)
533dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten		return -ENODEV;
534dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	dev->board_ptr = board;
53598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	dev->board_name = board->pc_DriverName;
53698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
53798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
53898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (!devpriv)
53998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return -ENOMEM;
54098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	dev->private = devpriv;
54198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
54298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	ret = comedi_pci_enable(dev);
54398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (ret)
54498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return ret;
54598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
5462107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten	/* board has an ADDIDATA_9054 eeprom */
5472107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten	dev->iobase = pci_resource_start(pcidev, 2);
5482107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten	devpriv->iobase = pci_resource_start(pcidev, 2);
5492107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten	devpriv->dw_AiBase = pci_ioremap_bar(pcidev, 3);
55098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv->i_IobaseReserved = pci_resource_start(pcidev, 3);
55198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
55298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (pcidev->irq > 0) {
5536c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		ret = request_irq(pcidev->irq, apci3xxx_irq_handler,
5546c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				  IRQF_SHARED, dev->board_name, dev);
55598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (ret == 0)
55698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			dev->irq = pcidev->irq;
55798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
55898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
55998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	n_subdevices = 7;
56098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	ret = comedi_alloc_subdevices(dev, n_subdevices);
56198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (ret)
56298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return ret;
56398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
56498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise AI Subdevice Structures */
56598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[0];
566f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten	if (board->i_NbrAiChannel || board->i_NbrAiChannelDiff) {
56798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		dev->read_subdev = s;
56898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_AI;
56998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_READABLE | SDF_COMMON | SDF_GROUND |
57098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten				  SDF_DIFF;
571f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		if (board->i_NbrAiChannel) {
572f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten			s->n_chan = board->i_NbrAiChannel;
57398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			devpriv->b_SingelDiff = 0;
57498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		} else {
57598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			s->n_chan = board->i_NbrAiChannelDiff;
57698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			devpriv->b_SingelDiff = 1;
57798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		}
578f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		s->maxdata = board->i_AiMaxdata;
57998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->len_chanlist = board->i_AiChannelList;
58098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		s->range_table = &apci3xxx_ai_range;
58198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
58298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		/* Set the initialisation flag */
58398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		devpriv->b_AiInitialisation = 1;
58498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
585b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_config = i_APCI3XXX_InsnConfigAnalogInput;
586b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_read = i_APCI3XXX_InsnReadAnalogInput;
58798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
58898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
58998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
59098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
59198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
59298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise AO Subdevice Structures */
59398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[1];
594f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten	if (board->i_NbrAoChannel) {
59598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_AO;
59698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
597f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		s->n_chan = board->i_NbrAoChannel;
598f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		s->maxdata = board->i_AoMaxdata;
59998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		s->range_table = &apci3xxx_ao_range;
600b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_write = i_APCI3XXX_InsnWriteAnalogOutput;
60198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
60298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
60398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
60498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise DI Subdevice Structures */
60598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[2];
606f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten	if (board->i_NbrDiChannel) {
60798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_DI;
60898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
609f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		s->n_chan = board->i_NbrDiChannel;
61098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = 1;
61198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = &range_digital;
61298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->io_bits = 0;	/* all bits input */
613ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten		s->insn_bits = apci3xxx_di_insn_bits;
61498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
61598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
61698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
61798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise DO Subdevice Structures */
61898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[3];
619f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten	if (board->i_NbrDoChannel) {
62098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_DO;
62198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags =
62298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
623f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		s->n_chan = board->i_NbrDoChannel;
62456e18770ae2991d315c4e164fab47171fc74c96aH Hartley Sweeten		s->maxdata = 1;
62598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = &range_digital;
62698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->io_bits = 0xf;	/* all bits output */
627c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		s->insn_bits = apci3xxx_do_insn_bits;
62898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
62998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
63098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
63198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
63298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise Timer Subdevice Structures */
63398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[4];
634178bd8d3a61432ce24399604b13cc756293d1ac8H Hartley Sweeten	s->type = COMEDI_SUBD_UNUSED;
63598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
63698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise TTL */
63798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[5];
63898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (board->i_NbrTTLChannel) {
639641abdac09f30d3c1bf99f5a938b61336ced7988H Hartley Sweeten		s->type = COMEDI_SUBD_DIO;
64098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->subdev_flags =
64198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
64298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->n_chan = board->i_NbrTTLChannel;
64398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->maxdata = 1;
64498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->io_bits = 0;	/* all bits input */
64598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->len_chanlist = board->i_NbrTTLChannel;
64698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->range_table = &range_digital;
647b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_config = i_APCI3XXX_InsnConfigInitTTLIO;
648b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_bits = i_APCI3XXX_InsnBitsTTLIO;
649b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_read = i_APCI3XXX_InsnReadTTLIO;
650b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten		s->insn_write = i_APCI3XXX_InsnWriteTTLIO;
65198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
65298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
65398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
65498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
65598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/* EEPROM */
65698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[6];
65793c0dc284dff2e2fec320662d8ef01b933096e36H Hartley Sweeten	s->type = COMEDI_SUBD_UNUSED;
65898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
6595e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	apci3xxx_reset(dev);
66098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return 0;
66198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
66298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
66398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev)
66498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
6651867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
666dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
66798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (devpriv) {
66898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (dev->iobase)
6695e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten			apci3xxx_reset(dev);
67098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (dev->irq)
67198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			free_irq(dev->irq, dev);
67298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (devpriv->dw_AiBase)
67398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			iounmap(devpriv->dw_AiBase);
67498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
67598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	comedi_pci_disable(dev);
676dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten}
677dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
67820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = {
67920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.driver_name	= "addi_apci_3xxx",
68020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.module		= THIS_MODULE,
681dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	.auto_attach	= apci3xxx_auto_attach,
68298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	.detach		= apci3xxx_detach,
68320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten};
68420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten
685a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev,
686b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten			      const struct pci_device_id *id)
68720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{
688b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten	return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data);
68920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}
69020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten
69120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = {
692dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 },
693dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 },
694dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 },
695dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 },
696dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 },
697dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 },
698dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 },
699dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 },
700dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 },
701dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 },
702dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 },
703dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 },
704dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 },
705dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 },
706dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 },
707dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 },
708dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 },
709dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 },
710dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 },
711dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 },
712dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 },
713dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 },
714dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 },
715dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 },
716dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 },
717317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten	{ 0 }
718317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten};
71920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table);
720317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten
72120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = {
72220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.name		= "addi_apci_3xxx",
72320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.id_table	= apci3xxx_pci_table,
72420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.probe		= apci3xxx_pci_probe,
7259901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe	.remove		= comedi_pci_auto_unconfig,
72620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten};
72720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver);
72890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas
72990f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org");
73090f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver");
73190f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL");
732