addi_apci_3xxx.c revision 8d4729066cde58c730573d6aad2ea29f8048fcb3
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;
8547bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten	int ai_n_chan;
865469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten	unsigned int ai_maxdata;
87a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten	unsigned char ai_conv_units;
888edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten	unsigned int ai_min_acq_ns;
89fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten	unsigned int has_ao:1;
904aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten	unsigned int has_dig_in:1;
914aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten	unsigned int has_dig_out:1;
920ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten	unsigned int has_ttl_io:1;
93e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten};
94e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten
95e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstatic const struct apci3xxx_boardinfo apci3xxx_boardtypes[] = {
96dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_16] = {
976abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3000-16",
988a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
9947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 16,
1005469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
101a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
1028edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 10000,
1030ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
104dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
105dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_8] = {
1066abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3000-8",
1078a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
10847bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 8,
1095469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
110a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
1118edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 10000,
1120ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
113dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
114dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3000_4] = {
1156abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3000-4",
1168a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
11747bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 4,
1185469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
119a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
1208edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 10000,
1210ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
122dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
123dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_16] = {
1246abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3006-16",
1258a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
12647bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 16,
1275469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
128a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
1298edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 10000,
1300ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
131dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
132dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_8] = {
1336abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3006-8",
1348a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
13547bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 8,
1365469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
137a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
1388edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 10000,
1390ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
140dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
141dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3006_4] = {
1426abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3006-4",
1438a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
14447bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 4,
1455469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
146a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
1478edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 10000,
1480ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
149dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
150dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_16] = {
1516abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3010-16",
1528a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
15347bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 16,
1545469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
155a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
1568edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
1574aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
1584aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
1590ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
160dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
161dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_8] = {
1626abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3010-8",
1638a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
16447bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 8,
1655469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
166a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
1678edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
1684aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
1694aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
1700ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
171dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
172dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3010_4] = {
1736abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3010-4",
1748a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
17547bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 4,
1765469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
177a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
1788edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
1794aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
1804aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
1810ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
182dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
183dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_16] = {
1846abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3016-16",
1858a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
18647bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 16,
1875469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
188a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
1898edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
1904aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
1914aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
1920ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
193dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
194dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3016_8] = {
1956abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3016-8",
1968a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
19747bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 8,
1985469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
199a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
2008edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 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_4] = {
2066abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3016-4",
2078a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
20847bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 4,
2095469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
210a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
2118edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
2124aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
2134aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
2140ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
215dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
216dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3100_16_4] = {
2176abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3100-16-4",
2188a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
21947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 16,
2205469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
221a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
2228edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 10000,
223fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2240ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
225dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
226dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3100_8_4] = {
2276abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3100-8-4",
2288a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
22947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 8,
2305469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
231a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
2328edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 10000,
233fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2340ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
235dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
236dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3106_16_4] = {
2376abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3106-16-4",
2388a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
23947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 16,
2405469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
241a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
2428edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 10000,
243fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2440ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
245dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
246dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3106_8_4] = {
2476abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3106-8-4",
2488a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
24947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 8,
2505469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
251a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
2528edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 10000,
253fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2540ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
255dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
256dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3110_16_4] = {
2576abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3110-16-4",
2588a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
25947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 16,
2605469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
261a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
2628edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
263fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2644aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
2654aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
2660ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
267dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
268dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3110_8_4] = {
2696abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3110-8-4",
2708a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
27147bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 8,
2725469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0x0fff,
273a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
2748edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
275fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2764aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
2774aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
2780ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
279dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
280dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3116_16_4] = {
2816abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3116-16-4",
2828a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
28347bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 16,
2845469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
285a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
2868edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
287fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
2884aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
2894aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
2900ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
291dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
292dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3116_8_4] = {
2936abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3116-8-4",
2948a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_COMMON | SDF_GROUND | SDF_DIFF,
29547bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten		.ai_n_chan		= 8,
2965469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
297a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
2988edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
299fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
3004aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3014aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
3020ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
303dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
304dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3003] = {
3056abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3003",
3068a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_DIFF,
3078d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten		.ai_n_chan		= 4,
3085469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
309a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US |
310a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten					  CONV_UNIT_NS,
3118edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 2500,
3124aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3134aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
314dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
315dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_16] = {
3166abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3002-16",
3178a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_DIFF,
3188d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten		.ai_n_chan		= 16,
3195469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
320a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
3218edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
3224aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3234aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
324dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
325dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_8] = {
3266abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3002-8",
3278a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_DIFF,
3288d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten		.ai_n_chan		= 8,
3295469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
330a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
3318edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
3324aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3334aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
334dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
335dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3002_4] = {
3366abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3002-4",
3378a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		.ai_subdev_flags	= SDF_DIFF,
3388d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten		.ai_n_chan		= 4,
3395469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		.ai_maxdata		= 0xffff,
340a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten		.ai_conv_units		= CONV_UNIT_MS | CONV_UNIT_US,
3418edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten		.ai_min_acq_ns		= 5000,
3424aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_in		= 1,
3434aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten		.has_dig_out		= 1,
344dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	},
345dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	[BOARD_APCI3500] = {
3466abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten		.name			= "apci3500",
347fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten		.has_ao			= 1,
3480ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten		.has_ttl_io		= 1,
349c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten	},
350c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten};
351c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten
3521867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweetenstruct apci3xxx_private {
353f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	void __iomem *mmio;
3541867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned int ui_AiNbrofChannels;	/*  how many channels is measured */
3551867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned int ui_AiReadData[32];
3561867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned char b_EocEosInterrupt;
3571867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned int ui_EocEosConversionTime;
3581867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned char b_EocEosConversionTimeBase;
3591867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	unsigned char b_SingelDiff;
3601867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten};
3611867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten
362e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten#include "addi-data/hwdrv_apci3xxx.c"
363e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten
3646c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweetenstatic irqreturn_t apci3xxx_irq_handler(int irq, void *d)
3656c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten{
3666c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	struct comedi_device *dev = d;
3671867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
3686c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	unsigned int status;
3696c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	int i;
3706c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
3716c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	/* Test if interrupt occur */
372f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	status = readl(devpriv->mmio + 16);
3736c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	if ((status & 0x2) == 0x2) {
3746c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		/* Reset the interrupt */
375f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten		writel(status, devpriv->mmio + 16);
3766c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
3776c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		/* Test if interrupt enabled */
3786c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		if (devpriv->b_EocEosInterrupt == 1) {
3796c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			/* Read all analog inputs value */
3806c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			for (i = 0; i < devpriv->ui_AiNbrofChannels; i++) {
3816c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				unsigned int val;
3826c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
383f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten				val = readl(devpriv->mmio + 28);
3846c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				devpriv->ui_AiReadData[i] = val;
3856c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			}
3866c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
3876c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			/* Set the interrupt flag */
3886c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten			devpriv->b_EocEosInterrupt = 2;
3896c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
390283ce669268da5a51eaf62efe92d5dd4625817a2H Hartley Sweeten			/* FIXME: comedi_event() */
3916c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		}
3926c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	}
3936c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten	return IRQ_RETVAL(1);
3946c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten}
3956c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten
3960e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweetenstatic int apci3xxx_ao_insn_write(struct comedi_device *dev,
3970e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten				  struct comedi_subdevice *s,
3980e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten				  struct comedi_insn *insn,
3990e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten				  unsigned int *data)
4000e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten{
4010e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
4020e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	unsigned int chan = CR_CHAN(insn->chanspec);
4030e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	unsigned int range = CR_RANGE(insn->chanspec);
4040e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	unsigned int status;
4050e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	int i;
4060e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten
4070e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	for (i = 0; i < insn->n; i++) {
4080e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		/* Set the range selection */
409f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten		writel(range, devpriv->mmio + 96);
4100e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten
4110e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		/* Write the analog value to the selected channel */
412f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten		writel((data[i] << 8) | chan, devpriv->mmio + 100);
4130e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten
4140e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		/* Wait the end of transfer */
4150e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		do {
416f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten			status = readl(devpriv->mmio + 96);
4170e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		} while ((status & 0x100) != 0x100);
4180e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	}
4190e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten
4200e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	return insn->n;
4210e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten}
4220e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten
423ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweetenstatic int apci3xxx_di_insn_bits(struct comedi_device *dev,
424ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 struct comedi_subdevice *s,
425ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 struct comedi_insn *insn,
426ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten				 unsigned int *data)
427ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten{
428dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten	data[1] = inl(dev->iobase + 32) & 0xf;
429ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten
430ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten	return insn->n;
431ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten}
432ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten
433c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweetenstatic int apci3xxx_do_insn_bits(struct comedi_device *dev,
434c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 struct comedi_subdevice *s,
435c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 struct comedi_insn *insn,
436c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten				 unsigned int *data)
437c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten{
438c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	unsigned int mask = data[0];
439c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	unsigned int bits = data[1];
440c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
441dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten	s->state = inl(dev->iobase + 48) & 0xf;
442c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	if (mask) {
443c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		s->state &= ~mask;
444c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten		s->state |= (bits & mask);
445c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
446dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten		outl(s->state, dev->iobase + 48);
447c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	}
448c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
449c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	data[1] = s->state;
450c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
451c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten	return insn->n;
452c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten}
453c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten
454da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_config(struct comedi_device *dev,
455da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				    struct comedi_subdevice *s,
456da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				    struct comedi_insn *insn,
457da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				    unsigned int *data)
458da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{
459da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int chan = CR_CHAN(insn->chanspec);
460da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int mask = 1 << chan;
461da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int bits;
462da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
463da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	/*
464da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 * Port 0 (channels 0-7) are always inputs
465da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 * Port 1 (channels 8-15) are always outputs
466da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 * Port 2 (channels 16-23) are programmable i/o
467da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 *
468da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 * Changing any channel in port 2 changes the entire port.
469da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	 */
470da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	if (mask & 0xff0000)
471da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		bits = 0xff0000;
472da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	else
473da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		bits = 0;
474da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
475da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	switch (data[0]) {
476da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	case INSN_CONFIG_DIO_INPUT:
477da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->io_bits &= ~bits;
478da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		break;
479da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	case INSN_CONFIG_DIO_OUTPUT:
480da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->io_bits |= bits;
481da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		break;
482da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	case INSN_CONFIG_DIO_QUERY:
483da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT;
484da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		return insn->n;
485da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	default:
486da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		return -EINVAL;
487da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	}
488da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
489da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	/* update port 2 configuration */
490da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	if (bits)
491dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten		outl((s->io_bits >> 24) & 0xff, dev->iobase + 224);
492da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
493da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	return insn->n;
494da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten}
495da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
496da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_bits(struct comedi_device *dev,
497da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				  struct comedi_subdevice *s,
498da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				  struct comedi_insn *insn,
499da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten				  unsigned int *data)
500da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{
501da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int mask = data[0];
502da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int bits = data[1];
503da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	unsigned int val;
504da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
505da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	/* only update output channels */
506da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	mask &= s->io_bits;
507da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	if (mask) {
508da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->state &= ~mask;
509da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->state |= (bits & mask);
510da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
511da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		if (mask & 0xff)
512dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten			outl(s->state & 0xff, dev->iobase + 80);
513da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		if (mask & 0xff0000)
514dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten			outl((s->state >> 16) & 0xff, dev->iobase + 112);
515da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	}
516da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
517dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten	val = inl(dev->iobase + 80);
518dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten	val |= (inl(dev->iobase + 64) << 8);
519da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	if (s->io_bits & 0xff0000)
520dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten		val |= (inl(dev->iobase + 112) << 16);
521da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	else
522dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten		val |= (inl(dev->iobase + 96) << 16);
523da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
524da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	data[1] = val;
525da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
526da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten	return insn->n;
527da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten}
528da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten
5295e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev)
53098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
5311867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
5325e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	unsigned int val;
5335e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	int i;
5345e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5355e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Disable the interrupt */
5365e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	disable_irq(dev->irq);
5375e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5385e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Reset the interrupt flag */
5395e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	devpriv->b_EocEosInterrupt = 0;
5405e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5415e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Clear the start command */
542f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	writel(0, devpriv->mmio + 8);
5435e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5445e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Reset the interrupt flags */
545f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	val = readl(devpriv->mmio + 16);
546f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	writel(val, devpriv->mmio + 16);
5475e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5485e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* clear the EOS */
549f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	readl(devpriv->mmio + 20);
5505e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5515e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Clear the FIFO */
5525e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	for (i = 0; i < 16; i++)
553f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten		val = readl(devpriv->mmio + 28);
5545e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten
5555e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	/* Enable the interrupt */
5565e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	enable_irq(dev->irq);
55798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
55898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return 0;
55998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
56098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
561dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev,
562dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten				unsigned long context)
563dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{
56498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct pci_dev *pcidev = comedi_to_pci_dev(dev);
565e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten	const struct apci3xxx_boardinfo *board = NULL;
5661867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv;
56798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	struct comedi_subdevice *s;
56898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	int ret, n_subdevices;
569dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
570dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	if (context < ARRAY_SIZE(apci3xxx_boardtypes))
571dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten		board = &apci3xxx_boardtypes[context];
572dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	if (!board)
573dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten		return -ENODEV;
574dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	dev->board_ptr = board;
5756abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten	dev->board_name = board->name;
57698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
57798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
57898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (!devpriv)
57998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return -ENOMEM;
58098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	dev->private = devpriv;
58198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
58298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	ret = comedi_pci_enable(dev);
58398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (ret)
58498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return ret;
58598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
5862107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten	dev->iobase = pci_resource_start(pcidev, 2);
587f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten	devpriv->mmio = pci_ioremap_bar(pcidev, 3);
58898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
58998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (pcidev->irq > 0) {
5906c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten		ret = request_irq(pcidev->irq, apci3xxx_irq_handler,
5916c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten				  IRQF_SHARED, dev->board_name, dev);
59298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (ret == 0)
59398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			dev->irq = pcidev->irq;
59498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
59598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
59698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	n_subdevices = 7;
59798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	ret = comedi_alloc_subdevices(dev, n_subdevices);
59898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (ret)
59998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		return ret;
60098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
60198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise AI Subdevice Structures */
60298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[0];
6038d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten	if (board->ai_n_chan) {
60498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		dev->read_subdev = s;
60598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_AI;
6068a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten		s->subdev_flags = SDF_READABLE | board->ai_subdev_flags;
6078d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten		s->n_chan = board->ai_n_chan;
6085469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten		s->maxdata = board->ai_maxdata;
60979518d9f9c2025449e66a9f00f18d6962f859627H Hartley Sweeten		s->len_chanlist = s->n_chan;
61098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten		s->range_table = &apci3xxx_ai_range;
61146572bad94f97cbd16097a7b807f418c474d4ebeH Hartley Sweeten		s->insn_config = apci3xxx_ai_insn_config;
612088e2e053d285553cb988ca50177d266d5494243H Hartley Sweeten		s->insn_read = apci3xxx_ai_insn_read;
61398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
6148d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten		if ((board->ai_subdev_flags & (SDF_COMMON | SDF_GROUND)) == 0)
6158d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten			devpriv->b_SingelDiff = 1;
6168d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten
61798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
61898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
61998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
62098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
6210e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten	/* Analog Output subdevice */
62298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[1];
623fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten	if (board->has_ao) {
6240e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->type		= COMEDI_SUBD_AO;
6250e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->subdev_flags	= SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
6260e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->n_chan	= 4;
6270e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->maxdata	= 0x0fff;
6280e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->range_table	= &apci3xxx_ao_range;
6290e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->insn_write	= apci3xxx_ao_insn_write;
63098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
6310e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten		s->type		= COMEDI_SUBD_UNUSED;
63298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
633ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten
634ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten	/* Digital Input subdevice */
63598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[2];
6364aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten	if (board->has_dig_in) {
637ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->type		= COMEDI_SUBD_DI;
638ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->subdev_flags	= SDF_READABLE;
639ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->n_chan	= 4;
640ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->maxdata	= 1;
641ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->range_table	= &range_digital;
642ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->insn_bits	= apci3xxx_di_insn_bits;
64398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
644ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->type		= COMEDI_SUBD_UNUSED;
64598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
646ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten
647ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten	/* Digital Output subdevice */
64898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[3];
6494aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten	if (board->has_dig_out) {
650ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->type		= COMEDI_SUBD_DO;
651ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->subdev_flags	= SDF_WRITEABLE;
652ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->n_chan	= 4;
653ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->maxdata	= 1;
654ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->range_table	= &range_digital;
655ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->insn_bits	= apci3xxx_do_insn_bits;
65698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
657ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten		s->type		= COMEDI_SUBD_UNUSED;
65898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
65998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
66098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/*  Allocate and Initialise Timer Subdevice Structures */
66198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[4];
662178bd8d3a61432ce24399604b13cc756293d1ac8H Hartley Sweeten	s->type = COMEDI_SUBD_UNUSED;
66398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
664383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten	/* TTL Digital I/O subdevice */
66598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[5];
6660ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten	if (board->has_ttl_io) {
667383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->type		= COMEDI_SUBD_DIO;
668383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->subdev_flags	= SDF_READABLE | SDF_WRITEABLE;
669383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->n_chan	= 24;
670383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->maxdata	= 1;
671383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->io_bits	= 0xff;	/* channels 0-7 are always outputs */
672383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten		s->range_table	= &range_digital;
673da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->insn_config	= apci3xxx_dio_insn_config;
674da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten		s->insn_bits	= apci3xxx_dio_insn_bits;
67598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	} else {
67698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		s->type = COMEDI_SUBD_UNUSED;
67798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
67898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
67998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	/* EEPROM */
68098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	s = &dev->subdevices[6];
68193c0dc284dff2e2fec320662d8ef01b933096e36H Hartley Sweeten	s->type = COMEDI_SUBD_UNUSED;
68298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
6835e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten	apci3xxx_reset(dev);
68498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	return 0;
68598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten}
68698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten
68798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev)
68898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{
6891867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten	struct apci3xxx_private *devpriv = dev->private;
690dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
69198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	if (devpriv) {
69298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (dev->iobase)
6935e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten			apci3xxx_reset(dev);
69498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten		if (dev->irq)
69598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten			free_irq(dev->irq, dev);
696f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten		if (devpriv->mmio)
697f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten			iounmap(devpriv->mmio);
69898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	}
69998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	comedi_pci_disable(dev);
700dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten}
701dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten
70220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = {
70320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.driver_name	= "addi_apci_3xxx",
70420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.module		= THIS_MODULE,
705dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	.auto_attach	= apci3xxx_auto_attach,
70698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten	.detach		= apci3xxx_detach,
70720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten};
70820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten
709a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev,
710b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten			      const struct pci_device_id *id)
71120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{
712b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten	return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data);
71320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}
71420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten
71520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = {
716dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 },
717dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 },
718dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 },
719dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 },
720dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 },
721dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 },
722dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 },
723dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 },
724dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 },
725dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 },
726dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 },
727dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 },
728dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 },
729dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 },
730dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 },
731dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 },
732dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 },
733dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 },
734dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 },
735dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 },
736dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 },
737dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 },
738dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 },
739dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 },
740dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten	{ PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 },
741317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten	{ 0 }
742317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten};
74320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table);
744317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten
74520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = {
74620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.name		= "addi_apci_3xxx",
74720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.id_table	= apci3xxx_pci_table,
74820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten	.probe		= apci3xxx_pci_probe,
7499901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe	.remove		= comedi_pci_auto_unconfig,
75020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten};
75120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver);
75290f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas
75390f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org");
75490f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver");
75590f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL");
756