addi_apci_3xxx.c revision a67e0cc7aa3f15a4aa3e88945cd1d2476149191f
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>
2733782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten
283d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "../comedidev.h"
293d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten
30a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten#define CONV_UNIT_NS		(1 << 0)
31a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten#define CONV_UNIT_US		(1 << 1)
32a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten#define CONV_UNIT_MS		(1 << 2)
33a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten
3498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ai_range = {
3598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	8, {
3698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(10),
3798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(5),
3898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(2),
3998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(1),
4098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(10),
4198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(5),
4298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(2),
4398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(1)
4498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	}
4598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten};
4698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten
4798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ao_range = {
4898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	2, {
4998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		BIP_RANGE(10),
5098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		UNI_RANGE(10)
5198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten	}
5298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten};
5398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten
54dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenenum apci3xxx_boardid {
55dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_16,
56dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_8,
57dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3000_4,
58dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_16,
59dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_8,
60dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3006_4,
61dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_16,
62dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_8,
63dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3010_4,
64dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_16,
65dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_8,
66dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3016_4,
67dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3100_16_4,
68dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3100_8_4,
69dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3106_16_4,
70dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3106_8_4,
71dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3110_16_4,
72dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3110_8_4,
73dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3116_16_4,
74dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3116_8_4,
75dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3003,
76dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_16,
77dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_8,
78dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3002_4,
79dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	BOARD_APCI3500,
80dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten};
81dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
82e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstruct apci3xxx_boardinfo {
836abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten	const char *name;
848a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten	int ai_subdev_flags;
85e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrAiChannel;
86e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	int i_NbrAiChannelDiff;
875469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten	unsigned int ai_maxdata;
88a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten	unsigned char ai_conv_units;
89e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	unsigned int ui_MinAcquisitiontimeNs;
90fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten	unsigned int has_ao:1;
914aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten	unsigned int has_dig_in:1;
924aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten	unsigned int has_dig_out:1;
930ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten	unsigned int has_ttl_io:1;
94e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten};
95e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten
96e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstatic const struct apci3xxx_boardinfo apci3xxx_boardtypes[] = {
97dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_16] = {
986abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3000-16",
998a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
100c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
101c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
1025469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
103a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
104c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
1050ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
106dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
107dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_8] = {
1086abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3000-8",
1098a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
110c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
111c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
1125469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
113a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
114c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
1150ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
116dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
117dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_4] = {
1186abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3000-4",
1198a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
120c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
121c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
1225469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
123a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
124c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
1250ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
126dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
127dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_16] = {
1286abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3006-16",
1298a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
130c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
131c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
1325469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
133a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
134c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
1350ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
136dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
137dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_8] = {
1386abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3006-8",
1398a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
140c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
141c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
1425469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
143a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
144c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
1450ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
146dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
147dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_4] = {
1486abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3006-4",
1498a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
150c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
151c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
1525469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
153a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
154c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
1550ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
156dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
157dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_16] = {
1586abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3010-16",
1598a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
160c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
161c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
1625469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
163a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
164c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
1654aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
1664aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
1670ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
168dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
169dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_8] = {
1706abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3010-8",
1718a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
172c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
173c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
1745469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
175a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
176c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
1774aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
1784aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
1790ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
180dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
181dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_4] = {
1826abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3010-4",
1838a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
184c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
185c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
1865469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
187a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
188c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
1894aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
1904aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
1910ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
192dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
193dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_16] = {
1946abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3016-16",
1958a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
196c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
197c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
1985469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
199a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
200c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
2014aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
2024aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
2030ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
204dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
205dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_8] = {
2066abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3016-8",
2078a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
208c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
209c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
2105469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
211a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
212c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
2134aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
2144aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
2150ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
216dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
217dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_4] = {
2186abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3016-4",
2198a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
220c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 4,
221c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 2,
2225469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
223a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
224c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
2254aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
2264aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
2270ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
228dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
229dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3100_16_4] = {
2306abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3100-16-4",
2318a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
232c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
233c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
2345469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
235a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
236c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
237fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2380ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
239dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
240dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3100_8_4] = {
2416abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3100-8-4",
2428a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
243c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
244c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
2455469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
246a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
247c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
248fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2490ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
250dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
251dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3106_16_4] = {
2526abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3106-16-4",
2538a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
254c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
255c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
2565469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
257a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
258c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
259fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2600ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
261dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
262dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3106_8_4] = {
2636abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3106-8-4",
2648a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
265c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
266c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
2675469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
268a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
269c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 10000,
270fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2710ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
272dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
273dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3110_16_4] = {
2746abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3110-16-4",
2758a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
276c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
277c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
2785469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
279a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
280c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
281fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2824aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
2834aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
2840ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
285dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
286dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3110_8_4] = {
2876abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3110-8-4",
2888a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
289c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
290c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
2915469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
292a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
293c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
294fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2954aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
2964aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
2970ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
298dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
299dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3116_16_4] = {
3006abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3116-16-4",
3018a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
302c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 16,
303c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
3045469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
305a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
306c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
307fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
3084aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3094aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
3100ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
311dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
312dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3116_8_4] = {
3136abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3116-8-4",
3148a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
315c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannel		= 8,
316c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
3175469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
318a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
319c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
320fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
3214aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3224aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
3230ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
324dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
325dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3003] = {
3266abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3003",
3278a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_DIFF,
328c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
3295469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
330a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US |
331a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten					  CONV_UNIT_NS,
332c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 2500,
3334aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3344aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
335dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
336dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_16] = {
3376abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3002-16",
3388a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_DIFF,
339c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 16,
3405469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
341a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
342c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
3434aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3444aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
345dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
346dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_8] = {
3476abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3002-8",
3488a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_DIFF,
349c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 8,
3505469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
351a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
352c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
3534aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3544aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
355dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
356dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_4] = {
3576abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3002-4",
3588a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_DIFF,
359c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.i_NbrAiChannelDiff	= 4,
3605469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
361a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
362c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten		.ui_MinAcquisitiontimeNs = 5000,
3634aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3644aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
365dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
366dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3500] = {
3676abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3500",
368fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
3690ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
370c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten	},
371c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten};
372c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten
3731867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweetenstruct apci3xxx_private {
374f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	void __iomem *mmio;
3751867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned int ui_AiNbrofChannels;	/*  how many channels is measured */
3761867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned int ui_AiReadData[32];
3771867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned char b_EocEosInterrupt;
3781867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned int ui_EocEosConversionTime;
3791867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned char b_EocEosConversionTimeBase;
3801867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned char b_SingelDiff;
3811867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten};
3821867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten
383e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten#include "addi-data/hwdrv_apci3xxx.c"
384e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten
3856c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweetenstatic irqreturn_t apci3xxx_irq_handler(int irq, void *d)
3866c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten{
3876c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	struct comedi_device *dev = d;
3881867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
3896c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	unsigned int status;
3906c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	int i;
3916c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
3926c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	/* Test if interrupt occur */
393f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	status = readl(devpriv->mmio + 16);
3946c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	if ((status & 0x2) == 0x2) {
3956c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		/* Reset the interrupt */
396f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten		writel(status, devpriv->mmio + 16);
3976c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
3986c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		/* Test if interrupt enabled */
3996c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		if (devpriv->b_EocEosInterrupt == 1) {
4006c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			/* Read all analog inputs value */
4016c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			for (i = 0; i < devpriv->ui_AiNbrofChannels; i++) {
4026c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				unsigned int val;
4036c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
404f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten				val = readl(devpriv->mmio + 28);
4056c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				devpriv->ui_AiReadData[i] = val;
4066c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			}
4076c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4086c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			/* Set the interrupt flag */
4096c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			devpriv->b_EocEosInterrupt = 2;
4106c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
411283ce669268da5a51eaf62efe92d5dd4625817a2H Hartley Sweeten			/* FIXME: comedi_event() */
4126c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		}
4136c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	}
4146c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	return IRQ_RETVAL(1);
4156c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten}
4166c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
4170e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweetenstatic int apci3xxx_ao_insn_write(struct comedi_device *dev,
4180e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten				  struct comedi_subdevice *s,
4190e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten				  struct comedi_insn *insn,
4200e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten				  unsigned int *data)
4210e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten{
4220e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
4230e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	unsigned int chan = CR_CHAN(insn->chanspec);
4240e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	unsigned int range = CR_RANGE(insn->chanspec);
4250e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	unsigned int status;
4260e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	int i;
4270e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten
4280e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	for (i = 0; i < insn->n; i++) {
4290e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		/* Set the range selection */
430f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten		writel(range, devpriv->mmio + 96);
4310e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten
4320e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		/* Write the analog value to the selected channel */
433f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten		writel((data[i] << 8) | chan, devpriv->mmio + 100);
4340e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten
4350e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		/* Wait the end of transfer */
4360e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		do {
437f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten			status = readl(devpriv->mmio + 96);
4380e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		} while ((status & 0x100) != 0x100);
4390e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	}
4400e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten
4410e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	return insn->n;
4420e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten}
4430e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten
444ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweetenstatic int apci3xxx_di_insn_bits(struct comedi_device *dev,
445ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 struct comedi_subdevice *s,
446ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 struct comedi_insn *insn,
447ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 unsigned int *data)
448ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten{
449dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten	data[1] = inl(dev->iobase + 32) & 0xf;
450ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten
451ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten	return insn->n;
452ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten}
453ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten
454c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweetenstatic int apci3xxx_do_insn_bits(struct comedi_device *dev,
455c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 struct comedi_subdevice *s,
456c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 struct comedi_insn *insn,
457c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 unsigned int *data)
458c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten{
459c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	unsigned int mask = data[0];
460c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	unsigned int bits = data[1];
461c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
462dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten	s->state = inl(dev->iobase + 48) & 0xf;
463c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	if (mask) {
464c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		s->state &= ~mask;
465c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		s->state |= (bits & mask);
466c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
467dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten		outl(s->state, dev->iobase + 48);
468c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	}
469c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
470c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	data[1] = s->state;
471c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
472c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	return insn->n;
473c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten}
474c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
475da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_config(struct comedi_device *dev,
476da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				    struct comedi_subdevice *s,
477da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				    struct comedi_insn *insn,
478da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				    unsigned int *data)
479da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{
480da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int chan = CR_CHAN(insn->chanspec);
481da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int mask = 1 << chan;
482da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int bits;
483da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
484da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	/*
485da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 * Port 0 (channels 0-7) are always inputs
486da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 * Port 1 (channels 8-15) are always outputs
487da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 * Port 2 (channels 16-23) are programmable i/o
488da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 *
489da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 * Changing any channel in port 2 changes the entire port.
490da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 */
491da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	if (mask & 0xff0000)
492da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		bits = 0xff0000;
493da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	else
494da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		bits = 0;
495da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
496da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	switch (data[0]) {
497da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	case INSN_CONFIG_DIO_INPUT:
498da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->io_bits &= ~bits;
499da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		break;
500da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	case INSN_CONFIG_DIO_OUTPUT:
501da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->io_bits |= bits;
502da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		break;
503da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	case INSN_CONFIG_DIO_QUERY:
504da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT;
505da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		return insn->n;
506da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	default:
507da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		return -EINVAL;
508da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	}
509da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
510da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	/* update port 2 configuration */
511da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	if (bits)
512dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten		outl((s->io_bits >> 24) & 0xff, dev->iobase + 224);
513da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
514da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	return insn->n;
515da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten}
516da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
517da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_bits(struct comedi_device *dev,
518da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				  struct comedi_subdevice *s,
519da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				  struct comedi_insn *insn,
520da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				  unsigned int *data)
521da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{
522da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int mask = data[0];
523da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int bits = data[1];
524da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int val;
525da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
526da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	/* only update output channels */
527da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	mask &= s->io_bits;
528da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	if (mask) {
529da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->state &= ~mask;
530da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->state |= (bits & mask);
531da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
532da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		if (mask & 0xff)
533dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten			outl(s->state & 0xff, dev->iobase + 80);
534da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		if (mask & 0xff0000)
535dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten			outl((s->state >> 16) & 0xff, dev->iobase + 112);
536da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	}
537da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
538dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten	val = inl(dev->iobase + 80);
539dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten	val |= (inl(dev->iobase + 64) << 8);
540da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	if (s->io_bits & 0xff0000)
541dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten		val |= (inl(dev->iobase + 112) << 16);
542da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	else
543dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten		val |= (inl(dev->iobase + 96) << 16);
544da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
545da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	data[1] = val;
546da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
547da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	return insn->n;
548da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten}
549da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
5505e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev)
55198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
5521867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
5535e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	unsigned int val;
5545e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	int i;
5555e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5565e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Disable the interrupt */
5575e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	disable_irq(dev->irq);
5585e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5595e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Reset the interrupt flag */
5605e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	devpriv->b_EocEosInterrupt = 0;
5615e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5625e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Clear the start command */
563f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	writel(0, devpriv->mmio + 8);
5645e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5655e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Reset the interrupt flags */
566f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	val = readl(devpriv->mmio + 16);
567f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	writel(val, devpriv->mmio + 16);
5685e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5695e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* clear the EOS */
570f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	readl(devpriv->mmio + 20);
5715e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5725e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Clear the FIFO */
5735e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	for (i = 0; i < 16; i++)
574f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten		val = readl(devpriv->mmio + 28);
5755e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5765e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Enable the interrupt */
5775e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	enable_irq(dev->irq);
57898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
57998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return 0;
58098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
58198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
582dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev,
583dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten				unsigned long context)
584dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{
58598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct pci_dev *pcidev = comedi_to_pci_dev(dev);
586e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	const struct apci3xxx_boardinfo *board = NULL;
5871867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv;
58898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct comedi_subdevice *s;
58998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	int ret, n_subdevices;
590dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
591dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	if (context < ARRAY_SIZE(apci3xxx_boardtypes))
592dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten		board = &apci3xxx_boardtypes[context];
593dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	if (!board)
594dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten		return -ENODEV;
595dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	dev->board_ptr = board;
5966abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten	dev->board_name = board->name;
59798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
59898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
59998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (!devpriv)
60098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return -ENOMEM;
60198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	dev->private = devpriv;
60298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
60398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	ret = comedi_pci_enable(dev);
60498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (ret)
60598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return ret;
60698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
6072107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten	dev->iobase = pci_resource_start(pcidev, 2);
608f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	devpriv->mmio = pci_ioremap_bar(pcidev, 3);
60998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
61098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (pcidev->irq > 0) {
6116c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		ret = request_irq(pcidev->irq, apci3xxx_irq_handler,
6126c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				  IRQF_SHARED, dev->board_name, dev);
61398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (ret == 0)
61498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			dev->irq = pcidev->irq;
61598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
61698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
61798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	n_subdevices = 7;
61898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	ret = comedi_alloc_subdevices(dev, n_subdevices);
61998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (ret)
62098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return ret;
62198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
62298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise AI Subdevice Structures */
62398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[0];
624f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten	if (board->i_NbrAiChannel || board->i_NbrAiChannelDiff) {
62598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		dev->read_subdev = s;
62698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_AI;
6278a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		s->subdev_flags = SDF_READABLE | board->ai_subdev_flags;
628f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten		if (board->i_NbrAiChannel) {
629f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten			s->n_chan = board->i_NbrAiChannel;
63098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			devpriv->b_SingelDiff = 0;
63198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		} else {
63298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			s->n_chan = board->i_NbrAiChannelDiff;
63398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			devpriv->b_SingelDiff = 1;
63498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		}
6355469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		s->maxdata = board->ai_maxdata;
63679518d9f9c2025449e66a9f00f18d6962f859627H Hartley Sweeten		s->len_chanlist = s->n_chan;
63798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		s->range_table = &apci3xxx_ai_range;
63898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
63946572bad94f97cbd16097a7b807f418c474d4ebeH Hartley Sweeten		s->insn_config = apci3xxx_ai_insn_config;
640088e2e053d285553cb988ca50177d266d5494243H Hartley Sweeten		s->insn_read = apci3xxx_ai_insn_read;
64198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
64298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
64398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
64498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
64598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
6460e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	/* Analog Output subdevice */
64798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[1];
648fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten	if (board->has_ao) {
6490e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->type		= COMEDI_SUBD_AO;
6500e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->subdev_flags	= SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
6510e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->n_chan	= 4;
6520e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->maxdata	= 0x0fff;
6530e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->range_table	= &apci3xxx_ao_range;
6540e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->insn_write	= apci3xxx_ao_insn_write;
65598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
6560e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->type		= COMEDI_SUBD_UNUSED;
65798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
658ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten
659ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten	/* Digital Input subdevice */
66098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[2];
6614aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten	if (board->has_dig_in) {
662ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->type		= COMEDI_SUBD_DI;
663ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->subdev_flags	= SDF_READABLE;
664ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->n_chan	= 4;
665ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->maxdata	= 1;
666ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->range_table	= &range_digital;
667ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->insn_bits	= apci3xxx_di_insn_bits;
66898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
669ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->type		= COMEDI_SUBD_UNUSED;
67098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
671ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten
672ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten	/* Digital Output subdevice */
67398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[3];
6744aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten	if (board->has_dig_out) {
675ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->type		= COMEDI_SUBD_DO;
676ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->subdev_flags	= SDF_WRITEABLE;
677ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->n_chan	= 4;
678ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->maxdata	= 1;
679ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->range_table	= &range_digital;
680ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->insn_bits	= apci3xxx_do_insn_bits;
68198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
682ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->type		= COMEDI_SUBD_UNUSED;
68398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
68498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
68598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise Timer Subdevice Structures */
68698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[4];
687178bd8d3a61432ce24399604b13cc756293d1ac8H Hartley Sweeten	s->type = COMEDI_SUBD_UNUSED;
68898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
689383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten	/* TTL Digital I/O subdevice */
69098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[5];
6910ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten	if (board->has_ttl_io) {
692383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->type		= COMEDI_SUBD_DIO;
693383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->subdev_flags	= SDF_READABLE | SDF_WRITEABLE;
694383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->n_chan	= 24;
695383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->maxdata	= 1;
696383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->io_bits	= 0xff;	/* channels 0-7 are always outputs */
697383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->range_table	= &range_digital;
698da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->insn_config	= apci3xxx_dio_insn_config;
699da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->insn_bits	= apci3xxx_dio_insn_bits;
70098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
70198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
70298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
70398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
70498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/* EEPROM */
70598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[6];
70693c0dc284dff2e2fec320662d8ef01b933096e36H Hartley Sweeten	s->type = COMEDI_SUBD_UNUSED;
70798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
7085e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	apci3xxx_reset(dev);
70998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return 0;
71098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
71198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
71298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev)
71398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
7141867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
715dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
71698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (devpriv) {
71798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (dev->iobase)
7185e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten			apci3xxx_reset(dev);
71998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (dev->irq)
72098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			free_irq(dev->irq, dev);
721f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten		if (devpriv->mmio)
722f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten			iounmap(devpriv->mmio);
72398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
72498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	comedi_pci_disable(dev);
725dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten}
726dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
72720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = {
72820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.driver_name	= "addi_apci_3xxx",
72920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.module		= THIS_MODULE,
730dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	.auto_attach	= apci3xxx_auto_attach,
73198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	.detach		= apci3xxx_detach,
73220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten};
73320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten
734a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev,
735b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten			      const struct pci_device_id *id)
73620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{
737b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten	return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data);
73820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}
73920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten
74020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = {
741dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 },
742dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 },
743dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 },
744dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 },
745dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 },
746dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 },
747dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 },
748dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 },
749dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 },
750dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 },
751dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 },
752dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 },
753dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 },
754dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 },
755dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 },
756dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 },
757dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 },
758dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 },
759dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 },
760dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 },
761dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 },
762dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 },
763dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 },
764dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 },
765dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 },
766317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten	{ 0 }
767317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten};
76820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table);
769317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten
77020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = {
77120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.name		= "addi_apci_3xxx",
77220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.id_table	= apci3xxx_pci_table,
77320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.probe		= apci3xxx_pci_probe,
7749901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe	.remove		= comedi_pci_auto_unconfig,
77520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten};
77620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver);
77790f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas
77890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org");
77990f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver");
78090f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL");
781