1e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/*
2e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    comedi/drivers/das16.c
3e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    DAS16 driver
4e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
5e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    COMEDI - Linux Control and Measurement Device Interface
6e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    Copyright (C) 2000 David A. Schleef <ds@schleef.org>
7e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    Copyright (C) 2000 Chris R. Baugher <baugher@enteract.com>
8e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    Copyright (C) 2001,2002 Frank Mori Hess <fmhess@users.sourceforge.net>
9e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
10e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    This program is free software; you can redistribute it and/or modify
11e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    it under the terms of the GNU General Public License as published by
12e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    the Free Software Foundation; either version 2 of the License, or
13e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    (at your option) any later version.
14e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
15e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    This program is distributed in the hope that it will be useful,
16e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    but WITHOUT ANY WARRANTY; without even the implied warranty of
17e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    GNU General Public License for more details.
19e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
20e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    You should have received a copy of the GNU General Public License
21e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    along with this program; if not, write to the Free Software
22e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
24e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef************************************************************************
25e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/
26e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/*
27e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefDriver: das16
28e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefDescription: DAS16 compatible boards
29e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefAuthor: Sam Moore, Warren Jasper, ds, Chris Baugher, Frank Hess, Roman Fietze
30e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefDevices: [Keithley Metrabyte] DAS-16 (das-16), DAS-16G (das-16g),
31e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  DAS-16F (das-16f), DAS-1201 (das-1201), DAS-1202 (das-1202),
32e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  DAS-1401 (das-1401), DAS-1402 (das-1402), DAS-1601 (das-1601),
33e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  DAS-1602 (das-1602),
34e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  [ComputerBoards] PC104-DAS16/JR (pc104-das16jr),
35e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  PC104-DAS16JR/16 (pc104-das16jr/16),
36e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  CIO-DAS16JR/16 (cio-das16jr/16),
37e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  CIO-DAS16/JR (cio-das16/jr), CIO-DAS1401/12 (cio-das1401/12),
38e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  CIO-DAS1402/12 (cio-das1402/12), CIO-DAS1402/16 (cio-das1402/16),
39e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  CIO-DAS1601/12 (cio-das1601/12), CIO-DAS1602/12 (cio-das1602/12),
40e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  CIO-DAS1602/16 (cio-das1602/16), CIO-DAS16/330 (cio-das16/330)
41e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefStatus: works
42e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefUpdated: 2003-10-12
43e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
44e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefA rewrite of the das16 and das1600 drivers.
45e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefOptions:
46e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	[0] - base io address
47e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	[1] - irq (does nothing, irq is not used anymore)
48e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	[2] - dma (optional, required for comedi_command support)
49e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	[3] - master clock speed in MHz (optional, 1 or 10, ignored if
50e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		board can probe clock, defaults to 1)
51e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	[4] - analog input range lowest voltage in microvolts (optional,
52e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		only useful if your board does not have software
53e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		programmable gain)
54e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	[5] - analog input range highest voltage in microvolts (optional,
55e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		only useful if board does not have software programmable
56e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		gain)
57e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	[6] - analog output range lowest voltage in microvolts (optional)
58e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	[7] - analog output range highest voltage in microvolts (optional)
59e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	[8] - use timer mode for DMA.  Timer mode is needed e.g. for
60e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		buggy DMA controllers in NS CS5530A (Geode Companion), and for
61e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		'jr' cards that lack a hardware fifo.  This option is no
62e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		longer needed, since timer mode is _always_ used.
63e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
64e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefPassing a zero for an option is the same as leaving it unspecified.
65e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
66e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/
67e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/*
68e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
69e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefTesting and debugging help provided by Daniel Koch.
70e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
71e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefKeithley Manuals:
72e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	2309.PDF (das16)
73e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	4919.PDF (das1400, 1600)
74e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	4922.PDF (das-1400)
75e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	4923.PDF (das1200, 1400, 1600)
76e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
773c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo SilvaComputer boards manuals also available from their website
783c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silvawww.measurementcomputing.com
79e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
80e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/
81e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
82e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include <linux/pci.h>
835a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
8425436dc9d84f1be60ff549c9ab712bba2835f284Greg Kroah-Hartman#include <linux/interrupt.h>
85e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include <asm/dma.h>
86e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include "../comedidev.h"
87e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
88e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include "8253.h"
89e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include "8255.h"
90e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include "comedi_fc.h"
91e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
92e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#undef DEBUG
932696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton/* #define DEBUG */
94e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
95e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#ifdef DEBUG
963c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva#define DEBUG_PRINT(format, args...)	\
973c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	printk(KERN_DEBUG "das16: " format, ## args)
98e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#else
99e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DEBUG_PRINT(format, args...)
100e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#endif
101e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1022696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton#define DAS16_SIZE 20		/*  number of ioports */
1032696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton#define DAS16_DMA_SIZE 0xff00	/*  size in bytes of allocated dma buffer */
104e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
105e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/*
106e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    cio-das16.pdf
107e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
108e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    "das16"
109e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    "das16/f"
110e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
111e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  0	a/d bits 0-3		start 12 bit
112e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  1	a/d bits 4-11		unused
113e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  2	mux read		mux set
114e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  3	di 4 bit		do 4 bit
115e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  4	unused			ao0_lsb
116e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  5	unused			ao0_msb
117e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  6	unused			ao1_lsb
118e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  7	unused			ao1_msb
119e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  8	status eoc uni/bip	interrupt reset
120e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  9	dma, int, trig ctrl	set dma, int
121e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  a	pacer control		unused
122e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  b	reserved		reserved
123e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  cdef	8254
124e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  0123	8255
125e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
126e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/
127e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
128e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/*
129e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    cio-das16jr.pdf
130e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
131e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    "das16jr"
132e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
133e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  0	a/d bits 0-3		start 12 bit
134e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  1	a/d bits 4-11		unused
135e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  2	mux read		mux set
136e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  3	di 4 bit		do 4 bit
137e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  4567	unused			unused
138e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  8	status eoc uni/bip	interrupt reset
139e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  9	dma, int, trig ctrl	set dma, int
140e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  a	pacer control		unused
141e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  b	gain status		gain control
142e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  cdef	8254
143e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
144e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/
145e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
146e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/*
147e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    cio-das16jr_16.pdf
148e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
149e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    "das16jr_16"
150e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
151e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  0	a/d bits 0-7		start 16 bit
152e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  1	a/d bits 8-15		unused
153e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  2	mux read		mux set
154e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  3	di 4 bit		do 4 bit
155e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  4567	unused			unused
156e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  8	status eoc uni/bip	interrupt reset
157e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  9	dma, int, trig ctrl	set dma, int
158e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  a	pacer control		unused
159e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  b	gain status		gain control
160e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  cdef	8254
161e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
162e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/
163e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/*
164e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    cio-das160x-1x.pdf
165e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
166e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    "das1601/12"
167e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    "das1602/12"
168e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef    "das1602/16"
169e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
170e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  0	a/d bits 0-3		start 12 bit
171e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  1	a/d bits 4-11		unused
172e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  2	mux read		mux set
173e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  3	di 4 bit		do 4 bit
174e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  4	unused			ao0_lsb
175e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  5	unused			ao0_msb
176e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  6	unused			ao1_lsb
177e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  7	unused			ao1_msb
178e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  8	status eoc uni/bip	interrupt reset
179e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  9	dma, int, trig ctrl	set dma, int
180e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  a	pacer control		unused
181e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  b	gain status		gain control
182e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  cdef	8254
183e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  400	8255
184e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  404	unused			conversion enable
185e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  405	unused			burst enable
186e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  406	unused			das1600 enable
187e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef  407	status
188e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
189e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/
190e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1913c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva/*  size in bytes of a sample from board */
1923c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silvastatic const int sample_size = 2;
193e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
194e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_TRIG		0
195e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_AI_LSB		0
196e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_AI_MSB		1
197e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_MUX		2
198e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_DIO		3
1993c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva#define DAS16_AO_LSB(x)	((x) ? 6 : 4)
2003c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva#define DAS16_AO_MSB(x)	((x) ? 7 : 5)
201e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_STATUS		8
202e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   BUSY			(1<<7)
203e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   UNIPOLAR			(1<<6)
204e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_MUXBIT			(1<<5)
205e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_INT			(1<<4)
206e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CONTROL		9
207e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_INTE			(1<<7)
208e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_IRQ(x)			(((x) & 0x7) << 4)
209e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DMA_ENABLE			(1<<2)
210e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   PACING_MASK	0x3
211e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   INT_PACER		0x03
212e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   EXT_PACER			0x02
213e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_SOFT		0x00
214e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_PACER		0x0A
215e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_CTR0			(1<<1)
216e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_TRIG0			(1<<0)
217e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   BURST_LEN_BITS(x)			(((x) & 0xf) << 4)
218e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_GAIN		0x0B
219e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR0_DATA		0x0C
220e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR1_DATA		0x0D
221e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR2_DATA		0x0E
222e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR_CONTROL	0x0F
223e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_TERM_CNT	0x00
224e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_ONE_SHOT	0x02
225e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_RATE_GEN	0x04
226e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_CNTR_LSB_MSB	0x30
227e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_CNTR0		0x00
228e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_CNTR1		0x40
229e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS16_CNTR2		0x80
230e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
231e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_CONV		0x404
232e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS1600_CONV_DISABLE		0x40
233e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_BURST		0x405
234e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS1600_BURST_VAL		0x40
235e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_ENABLE		0x406
236e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS1600_ENABLE_VAL		0x40
237e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_STATUS_B	0x407
238e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS1600_BME		0x40
239e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS1600_ME		0x20
240e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS1600_CD			0x10
241e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS1600_WS			0x02
242e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define   DAS1600_CLK_10MHZ		0x01
243e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
2449ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das1x01_bip = { 4, {
2450a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							    BIP_RANGE(10),
2460a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							    BIP_RANGE(1),
2470a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							    BIP_RANGE(0.1),
2480a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							    BIP_RANGE(0.01),
2490a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							    }
250e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
2510a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral
2529ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das1x01_unip = { 4, {
2530a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							     UNI_RANGE(10),
2540a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							     UNI_RANGE(1),
2550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							     UNI_RANGE(0.1),
2560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							     UNI_RANGE(0.01),
2570a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							     }
258e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
2590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral
2609ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das1x02_bip = { 4, {
2610a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							    BIP_RANGE(10),
2620a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							    BIP_RANGE(5),
2630a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							    BIP_RANGE(2.5),
2640a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							    BIP_RANGE(1.25),
2650a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							    }
266e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
2670a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral
2689ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das1x02_unip = { 4, {
2690a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							     UNI_RANGE(10),
2700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							     UNI_RANGE(5),
2710a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							     UNI_RANGE(2.5),
2720a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							     UNI_RANGE(1.25),
2730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							     }
274e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
2750a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral
2769ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das16jr = { 9, {
2773c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva						/*  also used by 16/330 */
2780a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							BIP_RANGE(10),
2790a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							BIP_RANGE(5),
2800a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							BIP_RANGE(2.5),
2810a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							BIP_RANGE(1.25),
2820a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							BIP_RANGE(0.625),
2830a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							UNI_RANGE(10),
2840a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							UNI_RANGE(5),
2850a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							UNI_RANGE(2.5),
2860a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							UNI_RANGE(1.25),
2870a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							}
288e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
2890a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral
2909ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das16jr_16 = { 8, {
2910a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							   BIP_RANGE(10),
2920a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							   BIP_RANGE(5),
2930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							   BIP_RANGE(2.5),
2940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							   BIP_RANGE(1.25),
2950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							   UNI_RANGE(10),
2960a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							   UNI_RANGE(5),
2970a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							   UNI_RANGE(2.5),
2980a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							   UNI_RANGE(1.25),
2990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral							   }
300e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
301e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
302e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic const int das16jr_gainlist[] = { 8, 0, 1, 2, 3, 4, 5, 6, 7 };
303e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic const int das16jr_16_gainlist[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
304e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic const int das1600_gainlist[] = { 0, 1, 2, 3 };
3050a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral
306e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefenum {
307e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16_pg_none = 0,
308e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16_pg_16jr,
309e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16_pg_16jr_16,
310e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16_pg_1601,
311e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16_pg_1602,
312e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
313e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic const int *const das16_gainlists[] = {
314e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	NULL,
315e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16jr_gainlist,
316e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16jr_16_gainlist,
317e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das1600_gainlist,
318e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das1600_gainlist,
319e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
3200a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral
3219ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange *const das16_ai_uni_lranges[] = {
322e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	&range_unknown,
323e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	&range_das16jr,
324e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	&range_das16jr_16,
325e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	&range_das1x01_unip,
326e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	&range_das1x02_unip,
327e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
3280a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral
3299ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange *const das16_ai_bip_lranges[] = {
330e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	&range_unknown,
331e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	&range_das16jr,
332e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	&range_das16jr_16,
333e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	&range_das1x01_bip,
334e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	&range_das1x02_bip,
335e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
336e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
337e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstruct munge_info {
338e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	uint8_t byte;
339e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned have_byte:1;
340e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
341e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
342814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
3430a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_insn *insn, unsigned int *data);
344814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
3450a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_insn *insn, unsigned int *data);
346814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
3470a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_insn *insn, unsigned int *data);
348814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
3490a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_insn *insn, unsigned int *data);
350814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pemberton
351814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_cmd_test(struct comedi_device *dev, struct comedi_subdevice *s,
3520a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_cmd *cmd);
3530a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukralstatic int das16_cmd_exec(struct comedi_device *dev,
3540a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_subdevice *s);
355814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
3560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukralstatic void das16_ai_munge(struct comedi_device *dev,
3570a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			   struct comedi_subdevice *s, void *array,
3580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			   unsigned int num_bytes,
3590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			   unsigned int start_chan_index);
360e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
361814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic void das16_reset(struct comedi_device *dev);
36270265d24e3404fe798b6edd55a02016b1edb49d7Jiri Slabystatic irqreturn_t das16_dma_interrupt(int irq, void *d);
363e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic void das16_timer_interrupt(unsigned long arg);
364814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic void das16_interrupt(struct comedi_device *dev);
365e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
366814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic unsigned int das16_set_pacer(struct comedi_device *dev, unsigned int ns,
3670a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral				    int flags);
368814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das1600_mode_detect(struct comedi_device *dev);
369814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic unsigned int das16_suggest_transfer_size(struct comedi_device *dev,
3700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral						struct comedi_cmd cmd);
371e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
372814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic void reg_dump(struct comedi_device *dev);
373e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
374947a33fd2196209a1aa8f00de4068e8a09a19cd9Bill Pembertonstruct das16_board {
375e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	const char *name;
376e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	void *ai;
377e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int ai_nbits;
3782696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	unsigned int ai_speed;	/*  max conversion speed in nanosec */
379e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int ai_pg;
380e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	void *ao;
381e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int ao_nbits;
382e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	void *di;
383e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	void *do_;
384e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
385e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int i8255_offset;
386e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int i8254_offset;
387e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
388e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int size;
389e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int id;
390947a33fd2196209a1aa8f00de4068e8a09a19cd9Bill Pemberton};
391e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
392947a33fd2196209a1aa8f00de4068e8a09a19cd9Bill Pembertonstatic const struct das16_board das16_boards[] = {
393e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
3940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "das-16",
3950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
3960a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
3970a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 15000,
3980a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_none,
3990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = das16_ao_winsn,
4000a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao_nbits = 12,
4010a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
4020a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
4030a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x10,
4040a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
4050a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x14,
4060a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x00,
4070a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
408e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
4090a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "das-16g",
4100a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
4110a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
4120a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 15000,
4130a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_none,
4140a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = das16_ao_winsn,
4150a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao_nbits = 12,
4160a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
4170a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
4180a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x10,
4190a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
4200a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x14,
4210a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x00,
4220a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
423e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
4240a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "das-16f",
4250a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
4260a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
4270a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 8500,
4280a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_none,
4290a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = das16_ao_winsn,
4300a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao_nbits = 12,
4310a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
4320a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
4330a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x10,
4340a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
4350a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x14,
4360a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x00,
4370a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
438e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
4390a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das16",	/*  cio-das16.pdf */
4400a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
4410a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
4420a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 20000,
4430a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_none,
4440a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = das16_ao_winsn,
4450a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao_nbits = 12,
4460a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
4470a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
4480a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x10,
4490a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
4500a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x14,
4510a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x80,
4520a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
453e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
4540a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das16/f",	/*  das16.pdf */
4550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
4560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
4570a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
4580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_none,
4590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = das16_ao_winsn,
4600a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao_nbits = 12,
4610a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
4620a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
4630a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x10,
4640a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
4650a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x14,
4660a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x80,
4670a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
468e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
4690a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das16/jr",	/*  cio-das16jr.pdf */
4700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
4710a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
4720a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 7692,
4730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_16jr,
4740a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
4750a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
4760a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
4770a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0,
4780a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
4790a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x10,
4800a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x00,
4810a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
482e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
4830a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "pc104-das16jr",	/*  pc104-das16jr_xx.pdf */
4840a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
4850a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
4860a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 3300,
4870a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_16jr,
4880a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
4890a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
4900a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
4910a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0,
4920a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
4930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x10,
4940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x00,
4950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
496e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
4970a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das16jr/16",	/*  cio-das16jr_16.pdf */
4980a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
4990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 16,
5000a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
5010a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_16jr_16,
5020a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
5030a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
5040a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
5050a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0,
5060a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
5070a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x10,
5080a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x00,
5090a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
510e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
5110a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "pc104-das16jr/16",	/*  pc104-das16jr_xx.pdf */
5120a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
5130a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 16,
5140a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
5150a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_16jr_16,
5160a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
5170a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
5180a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
5190a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0,
5200a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
5210a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x10,
5220a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x00,
5230a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
524e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
5250a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "das-1201",	/*  4924.pdf (keithley user's manual) */
5260a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
5270a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
5280a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 20000,
5290a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_none,
5300a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
5310a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
5320a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
5330a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x400,
5340a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
5350a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
5360a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x20,
5370a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
538e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
5390a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "das-1202",	/*  4924.pdf (keithley user's manual) */
5400a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
5410a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
5420a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
5430a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_none,
5440a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
5450a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
5460a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
5470a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x400,
5480a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
5490a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
5500a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0x20,
5510a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
552e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
5533c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	/*  4919.pdf and 4922.pdf (keithley user's manual) */
5543c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 .name = "das-1401",
5550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
5560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
5570a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
5580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_1601,
5590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
5600a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
5610a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
5620a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x0,
5630a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
5640a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
5653c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 .id = 0xc0   /*  4919.pdf says id bits are 0xe0, 4922.pdf says 0xc0 */
5660a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
567e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
5683c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	/*  4919.pdf and 4922.pdf (keithley user's manual) */
5693c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 .name = "das-1402",
5700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
5710a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
5720a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
5730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_1602,
5740a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
5750a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
5760a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
5770a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x0,
5780a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
5790a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
5803c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 .id = 0xc0   /*  4919.pdf says id bits are 0xe0, 4922.pdf says 0xc0 */
5810a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
582e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
5830a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "das-1601",	/*  4919.pdf */
5840a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
5850a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
5860a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
5870a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_1601,
5880a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = das16_ao_winsn,
5890a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao_nbits = 12,
5900a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
5910a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
5920a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x400,
5930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
5940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
5950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0xc0},
596e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
5970a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "das-1602",	/*  4919.pdf */
5980a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
5990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
6000a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
6010a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_1602,
6020a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = das16_ao_winsn,
6030a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao_nbits = 12,
6040a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
6050a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
6060a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x400,
6070a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
6080a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
6090a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0xc0},
610e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
6110a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das1401/12",	/*  cio-das1400_series.pdf */
6120a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
6130a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
6140a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 6250,
6150a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_1601,
6160a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
6170a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
6180a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
6190a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0,
6200a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
6210a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
6220a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0xc0},
623e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
6240a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das1402/12",	/*  cio-das1400_series.pdf */
6250a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
6260a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
6270a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 6250,
6280a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_1602,
6290a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
6300a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
6310a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
6320a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0,
6330a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
6340a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
6350a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0xc0},
636e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
6370a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das1402/16",	/*  cio-das1400_series.pdf */
6380a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
6390a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 16,
6400a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
6410a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_1602,
6420a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
6430a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
6440a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
6450a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0,
6460a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
6470a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
6480a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0xc0},
649e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
6500a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das1601/12",	/*  cio-das160x-1x.pdf */
6510a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
6520a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
6530a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 6250,
6540a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_1601,
6550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = das16_ao_winsn,
6560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao_nbits = 12,
6570a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
6580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
6590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x400,
6600a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
6610a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
6620a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0xc0},
663e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
6640a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das1602/12",	/*  cio-das160x-1x.pdf */
6650a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
6660a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
6670a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
6680a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_1602,
6690a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = das16_ao_winsn,
6700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao_nbits = 12,
6710a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
6720a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
6730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x400,
6740a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
6750a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
6760a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0xc0},
677e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
6780a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das1602/16",	/*  cio-das160x-1x.pdf */
6790a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
6800a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 16,
6810a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 10000,
6820a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_1602,
6830a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = das16_ao_winsn,
6840a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao_nbits = 12,
6850a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
6860a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
6870a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0x400,
6880a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
6890a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x408,
6900a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0xc0},
691e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
6920a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "cio-das16/330",	/*  ? */
6930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai = das16_ai_rinsn,
6940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_nbits = 12,
6950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_speed = 3030,
6960a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ai_pg = das16_pg_16jr,
6970a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .ao = NULL,
6980a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .di = das16_di_rbits,
6990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .do_ = das16_do_wbits,
7000a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8255_offset = 0,
7010a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .i8254_offset = 0x0c,
7020a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .size = 0x14,
7030a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .id = 0xf0},
704e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#if 0
705e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
7060a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "das16/330i",	/*  ? */
7070a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
708e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
7090a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 .name = "das16/jr/ctr5",	/*  ? */
7100a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
711e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	{
7123c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	/*  cio-das16_m1_16.pdf, this board is a bit quirky, no dma */
7133c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 .name = "cio-das16/m1/16",
7140a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	 },
715e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#endif
716e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
717e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
718da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it);
719da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_detach(struct comedi_device *dev);
720139dfbdfacb02e3ef3df936d2fabd1ad5f14ea88Bill Pembertonstatic struct comedi_driver driver_das16 = {
72168c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton	.driver_name = "das16",
72268c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton	.module = THIS_MODULE,
72368c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton	.attach = das16_attach,
72468c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton	.detach = das16_detach,
72568c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton	.board_name = &das16_boards[0].name,
7268629efa4cbf6f89a54a85af4b8bc31762af01800Bill Pemberton	.num_names = ARRAY_SIZE(das16_boards),
72768c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton	.offset = sizeof(das16_boards[0]),
728e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
729e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
730e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_TIMEOUT 1000
731e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
732e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* Period for timer interrupt in jiffies.  It's a function
733e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * to deal with possibility of dynamic HZ patches  */
734e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic inline int timer_period(void)
735e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
736e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return HZ / 20;
737e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
7380a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral
739e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstruct das16_private_struct {
7402696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	unsigned int ai_unipolar;	/*  unipolar flag */
7412696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	unsigned int ai_singleended;	/*  single ended flag */
7422696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	unsigned int clockbase;	/*  master clock speed in ns */
7432696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	volatile unsigned int control_state;	/*  dma, interrupt and trigger control bits */
7442696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	volatile unsigned long adc_byte_count;	/*  number of bytes remaining */
7453c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	/*  divisor dividing master clock to get conversion frequency */
7463c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	unsigned int divisor1;
7473c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	/*  divisor dividing master clock to get conversion frequency */
7483c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	unsigned int divisor2;
7492696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	unsigned int dma_chan;	/*  dma channel */
750e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	uint16_t *dma_buffer[2];
751e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	dma_addr_t dma_buffer_addr[2];
752e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int current_buffer;
7532696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	volatile unsigned int dma_transfer_size;	/*  target number of bytes to transfer per dma shot */
7543c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	/**
7553c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 * user-defined analog input and output ranges
7563c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 * defined from config options
7573c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 */
7589ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pemberton	struct comedi_lrange *user_ai_range_table;
7599ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pemberton	struct comedi_lrange *user_ao_range_table;
760e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
7612696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	struct timer_list timer;	/*  for timed interrupt */
762e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	volatile short timer_running;
7632696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	volatile short timer_mode;	/*  true if using timer mode */
764e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef};
765e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define devpriv ((struct das16_private_struct *)(dev->private))
766947a33fd2196209a1aa8f00de4068e8a09a19cd9Bill Pemberton#define thisboard ((struct das16_board *)(dev->board_ptr))
767e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
768da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_cmd_test(struct comedi_device *dev, struct comedi_subdevice *s,
7690a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_cmd *cmd)
770e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
771e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int err = 0, tmp;
772e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int gain, start_chan, i;
773e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int mask;
774e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
775e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* make sure triggers are valid */
776e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	tmp = cmd->start_src;
777e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	cmd->start_src &= TRIG_NOW;
778e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (!cmd->start_src || tmp != cmd->start_src)
779e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
780e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
781e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	tmp = cmd->scan_begin_src;
782e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	mask = TRIG_FOLLOW;
7832696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  if board supports burst mode */
784e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->size > 0x400)
785e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		mask |= TRIG_TIMER | TRIG_EXT;
786e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	cmd->scan_begin_src &= mask;
787e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
788e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
789e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
790e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	tmp = cmd->convert_src;
791e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	mask = TRIG_TIMER | TRIG_EXT;
7922696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  if board supports burst mode */
793e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->size > 0x400)
794e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		mask |= TRIG_NOW;
795e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	cmd->convert_src &= mask;
796e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (!cmd->convert_src || tmp != cmd->convert_src)
797e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
798e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
799e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	tmp = cmd->scan_end_src;
800e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	cmd->scan_end_src &= TRIG_COUNT;
801e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
802e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
803e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
804e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	tmp = cmd->stop_src;
805e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	cmd->stop_src &= TRIG_COUNT | TRIG_NONE;
806e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (!cmd->stop_src || tmp != cmd->stop_src)
807e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
808e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
809e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (err)
810e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return 1;
811e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
8123c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	/**
8133c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 * step 2: make sure trigger sources are unique and
8143c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 * mutually compatible
8153c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 */
816e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->scan_begin_src != TRIG_TIMER &&
8170a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	    cmd->scan_begin_src != TRIG_EXT &&
8180a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	    cmd->scan_begin_src != TRIG_FOLLOW)
819e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
820e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->convert_src != TRIG_TIMER &&
8210a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	    cmd->convert_src != TRIG_EXT && cmd->convert_src != TRIG_NOW)
822e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
823e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_COUNT)
824e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
825e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
8262696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  make sure scan_begin_src and convert_src dont conflict */
827e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->scan_begin_src == TRIG_FOLLOW && cmd->convert_src == TRIG_NOW)
828e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
829e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->scan_begin_src != TRIG_FOLLOW && cmd->convert_src != TRIG_NOW)
830e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
831e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
832e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (err)
833e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return 2;
834e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
835e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* step 3: make sure arguments are trivially compatible */
836e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->start_arg != 0) {
837e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		cmd->start_arg = 0;
838e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
839e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
840e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
841e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->scan_begin_src == TRIG_FOLLOW) {
842e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		/* internal trigger */
843e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (cmd->scan_begin_arg != 0) {
844e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			cmd->scan_begin_arg = 0;
845e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			err++;
846e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
847e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
848e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
849e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->scan_end_arg != cmd->chanlist_len) {
850e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		cmd->scan_end_arg = cmd->chanlist_len;
851e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err++;
852e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
8532696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  check against maximum frequency */
854e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->scan_begin_src == TRIG_TIMER) {
855e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (cmd->scan_begin_arg <
8560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		    thisboard->ai_speed * cmd->chanlist_len) {
857e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			cmd->scan_begin_arg =
8580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			    thisboard->ai_speed * cmd->chanlist_len;
859e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			err++;
860e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
861e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
862e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->convert_src == TRIG_TIMER) {
863e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (cmd->convert_arg < thisboard->ai_speed) {
864e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			cmd->convert_arg = thisboard->ai_speed;
865e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			err++;
866e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
867e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
868e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
869e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->stop_src == TRIG_NONE) {
870e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (cmd->stop_arg != 0) {
871e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			cmd->stop_arg = 0;
872e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			err++;
873e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
874e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
875e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (err)
876e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return 3;
877e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
8782696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  step 4: fix up arguments */
879e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->scan_begin_src == TRIG_TIMER) {
880e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		unsigned int tmp = cmd->scan_begin_arg;
8812696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*  set divisors, correct timing arguments */
882e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		i8253_cascade_ns_to_timer_2div(devpriv->clockbase,
8830a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral					       &(devpriv->divisor1),
8840a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral					       &(devpriv->divisor2),
8850a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral					       &(cmd->scan_begin_arg),
8860a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral					       cmd->flags & TRIG_ROUND_MASK);
887e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err += (tmp != cmd->scan_begin_arg);
888e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
889e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->convert_src == TRIG_TIMER) {
890e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		unsigned int tmp = cmd->convert_arg;
8912696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*  set divisors, correct timing arguments */
892e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		i8253_cascade_ns_to_timer_2div(devpriv->clockbase,
8930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral					       &(devpriv->divisor1),
8940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral					       &(devpriv->divisor2),
8950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral					       &(cmd->convert_arg),
8960a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral					       cmd->flags & TRIG_ROUND_MASK);
897e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		err += (tmp != cmd->convert_arg);
898e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
899e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (err)
900e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return 4;
901e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
9022696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  check channel/gain list against card's limitations */
903e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->chanlist) {
904e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		gain = CR_RANGE(cmd->chanlist[0]);
905e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		start_chan = CR_CHAN(cmd->chanlist[0]);
906e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		for (i = 1; i < cmd->chanlist_len; i++) {
907e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			if (CR_CHAN(cmd->chanlist[i]) !=
9080a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			    (start_chan + i) % s->n_chan) {
909e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef				comedi_error(dev,
9103c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva						"entries in chanlist must be "
9113c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva						"consecutive channels, "
9123c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva						"counting upwards\n");
913e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef				err++;
914e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			}
915e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			if (CR_RANGE(cmd->chanlist[i]) != gain) {
916e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef				comedi_error(dev,
9173c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva						"entries in chanlist must all "
9183c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva						"have the same gain\n");
919e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef				err++;
920e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			}
921e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
922e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
923e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (err)
924e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return 5;
925e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
926e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return 0;
927e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
928e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
929da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_cmd_exec(struct comedi_device *dev, struct comedi_subdevice *s)
930e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
931d163679ceec20c50f9aee880fa76c0c1185244a8Bill Pemberton	struct comedi_async *async = s->async;
932ea6d0d4cab4f4f2d6a88f3bce4707fe92696fd3fBill Pemberton	struct comedi_cmd *cmd = &async->cmd;
933e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int byte;
934e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned long flags;
935e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int range;
936e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
937e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (devpriv->dma_chan == 0 || (dev->irq == 0
9380a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral				       && devpriv->timer_mode == 0)) {
939e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		comedi_error(dev,
9403c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva				"irq (or use of 'timer mode') dma required to "
9413c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva							"execute comedi_cmd");
942e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return -1;
943e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
944e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->flags & TRIG_RT) {
9453c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		comedi_error(dev, "isa dma transfers cannot be performed with "
9463c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva							"TRIG_RT, aborting");
947e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return -1;
948e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
949e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
950e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->adc_byte_count =
9510a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	    cmd->stop_arg * cmd->chanlist_len * sizeof(uint16_t);
952e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
9532696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  disable conversions for das1600 mode */
9543c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	if (thisboard->size > 0x400)
955e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb(DAS1600_CONV_DISABLE, dev->iobase + DAS1600_CONV);
9563c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva
9572696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  set scan limits */
958e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	byte = CR_CHAN(cmd->chanlist[0]);
959e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	byte |= CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]) << 4;
960e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(byte, dev->iobase + DAS16_MUX);
961e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
962e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* set gain (this is also burst rate register but according to
9633c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 * computer boards manual, burst rate does nothing, even on
9643c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	 * keithley cards) */
965e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->ai_pg != das16_pg_none) {
966e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		range = CR_RANGE(cmd->chanlist[0]);
967e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb((das16_gainlists[thisboard->ai_pg])[range],
9680a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		     dev->iobase + DAS16_GAIN);
969e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
970e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
971e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* set counter mode and counts */
972e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	cmd->convert_arg =
9730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	    das16_set_pacer(dev, cmd->convert_arg,
9740a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			    cmd->flags & TRIG_ROUND_MASK);
975e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("pacer period: %d ns\n", cmd->convert_arg);
976e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
977e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* enable counters */
978e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	byte = 0;
979e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* Enable burst mode if appropriate. */
980e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->size > 0x400) {
981e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (cmd->convert_src == TRIG_NOW) {
982e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			outb(DAS1600_BURST_VAL, dev->iobase + DAS1600_BURST);
9832696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton			/*  set burst length */
984e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			byte |= BURST_LEN_BITS(cmd->chanlist_len - 1);
985e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		} else {
986e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			outb(0, dev->iobase + DAS1600_BURST);
987e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
988e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
989e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(byte, dev->iobase + DAS16_PACER);
990e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
9912696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  set up dma transfer */
992e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	flags = claim_dma_lock();
993e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	disable_dma(devpriv->dma_chan);
994e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* clear flip-flop to make sure 2-byte registers for
995e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	 * count and address get set correctly */
996e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	clear_dma_ff(devpriv->dma_chan);
997e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->current_buffer = 0;
998e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	set_dma_addr(devpriv->dma_chan,
9990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		     devpriv->dma_buffer_addr[devpriv->current_buffer]);
10002696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  set appropriate size of transfer */
1001e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->dma_transfer_size = das16_suggest_transfer_size(dev, *cmd);
1002e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	set_dma_count(devpriv->dma_chan, devpriv->dma_transfer_size);
1003e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	enable_dma(devpriv->dma_chan);
1004e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	release_dma_lock(flags);
1005e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
10062696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  set up interrupt */
1007e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (devpriv->timer_mode) {
1008e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->timer_running = 1;
1009e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->timer.expires = jiffies + timer_period();
1010e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		add_timer(&devpriv->timer);
1011e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->control_state &= ~DAS16_INTE;
1012e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
1013e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		/* clear interrupt bit */
1014e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb(0x00, dev->iobase + DAS16_STATUS);
1015e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		/* enable interrupts */
1016e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->control_state |= DAS16_INTE;
1017e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1018e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->control_state |= DMA_ENABLE;
1019e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->control_state &= ~PACING_MASK;
1020e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->convert_src == TRIG_EXT)
1021e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->control_state |= EXT_PACER;
1022e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	else
1023e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->control_state |= INT_PACER;
1024e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(devpriv->control_state, dev->iobase + DAS16_CONTROL);
1025e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1026e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* Enable conversions if using das1600 mode */
10273c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	if (thisboard->size > 0x400)
1028e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb(0, dev->iobase + DAS1600_CONV);
10293c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva
1030e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1031e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return 0;
1032e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1033e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1034da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
1035e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1036e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned long flags;
1037e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
10385f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman	spin_lock_irqsave(&dev->spinlock, flags);
1039e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* disable interrupts, dma and pacer clocked conversions */
1040e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->control_state &= ~DAS16_INTE & ~PACING_MASK & ~DMA_ENABLE;
1041e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(devpriv->control_state, dev->iobase + DAS16_CONTROL);
1042e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (devpriv->dma_chan)
1043e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		disable_dma(devpriv->dma_chan);
1044e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
10452696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  disable SW timer */
1046e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (devpriv->timer_mode && devpriv->timer_running) {
1047e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->timer_running = 0;
1048e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		del_timer(&devpriv->timer);
1049e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1050e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1051e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* disable burst mode */
10523c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	if (thisboard->size > 0x400)
1053e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb(0, dev->iobase + DAS1600_BURST);
10543c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva
1055e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
10565f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman	spin_unlock_irqrestore(&dev->spinlock, flags);
1057e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1058e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return 0;
1059e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1060e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1061da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic void das16_reset(struct comedi_device *dev)
1062e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1063e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(0, dev->iobase + DAS16_STATUS);
1064e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(0, dev->iobase + DAS16_CONTROL);
1065e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(0, dev->iobase + DAS16_PACER);
1066e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(0, dev->iobase + DAS16_CNTR_CONTROL);
1067e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1068e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1069da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
10700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_insn *insn, unsigned int *data)
1071e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1072e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int i, n;
1073e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int range;
1074e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int chan;
1075e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int msb, lsb;
1076e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
10772696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  disable interrupts and pacing */
1078e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->control_state &= ~DAS16_INTE & ~DMA_ENABLE & ~PACING_MASK;
1079e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(devpriv->control_state, dev->iobase + DAS16_CONTROL);
1080e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1081e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* set multiplexer */
1082e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	chan = CR_CHAN(insn->chanspec);
1083e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	chan |= CR_CHAN(insn->chanspec) << 4;
1084e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(chan, dev->iobase + DAS16_MUX);
1085e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1086e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* set gain */
1087e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->ai_pg != das16_pg_none) {
1088e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		range = CR_RANGE(insn->chanspec);
1089e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb((das16_gainlists[thisboard->ai_pg])[range],
10900a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		     dev->iobase + DAS16_GAIN);
1091e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1092e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1093e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	for (n = 0; n < insn->n; n++) {
1094e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		/* trigger conversion */
1095e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb_p(0, dev->iobase + DAS16_TRIG);
1096e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1097e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		for (i = 0; i < DAS16_TIMEOUT; i++) {
1098e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			if (!(inb(dev->iobase + DAS16_STATUS) & BUSY))
1099e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef				break;
1100e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1101e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (i == DAS16_TIMEOUT) {
11025f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman			printk("das16: timeout\n");
1103e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			return -ETIME;
1104e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1105e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		msb = inb(dev->iobase + DAS16_AI_MSB);
1106e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		lsb = inb(dev->iobase + DAS16_AI_LSB);
11073c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		if (thisboard->ai_nbits == 12)
1108e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			data[n] = ((lsb >> 4) & 0xf) | (msb << 4);
11093c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		else
1110e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			data[n] = lsb | (msb << 8);
11113c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva
1112e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1113e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1114e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return n;
1115e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1116e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1117da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
11180a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_insn *insn, unsigned int *data)
1119e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1120790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton	unsigned int bits;
1121e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1122e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	bits = inb(dev->iobase + DAS16_DIO) & 0xf;
1123e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	data[1] = bits;
1124e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	data[0] = 0;
1125e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1126e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return 2;
1127e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1128e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1129da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
11300a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_insn *insn, unsigned int *data)
1131e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1132790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton	unsigned int wbits;
1133e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
11342696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  only set bits that have been masked */
1135e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	data[0] &= 0xf;
1136e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	wbits = s->state;
11372696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  zero bits that have been masked */
1138e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	wbits &= ~data[0];
11392696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  set masked bits */
1140e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	wbits |= data[0] & data[1];
1141e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	s->state = wbits;
1142e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	data[1] = wbits;
1143e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1144e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(s->state, dev->iobase + DAS16_DIO);
1145e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1146e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return 2;
1147e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1148e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1149da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
11500a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			  struct comedi_insn *insn, unsigned int *data)
1151e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1152e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int i;
1153e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int lsb, msb;
1154e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int chan;
1155e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1156e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	chan = CR_CHAN(insn->chanspec);
1157e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1158e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	for (i = 0; i < insn->n; i++) {
1159e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (thisboard->ao_nbits == 12) {
1160e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			lsb = (data[i] << 4) & 0xff;
1161e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			msb = (data[i] >> 4) & 0xff;
1162e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		} else {
1163e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			lsb = data[i] & 0xff;
1164e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			msb = (data[i] >> 8) & 0xff;
1165e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1166e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb(lsb, dev->iobase + DAS16_AO_LSB(chan));
1167e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb(msb, dev->iobase + DAS16_AO_MSB(chan));
1168e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1169e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1170e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return i;
1171e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1172e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
117370265d24e3404fe798b6edd55a02016b1edb49d7Jiri Slabystatic irqreturn_t das16_dma_interrupt(int irq, void *d)
1174e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1175e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int status;
117671b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton	struct comedi_device *dev = d;
1177e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1178e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	status = inb(dev->iobase + DAS16_STATUS);
1179e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1180e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if ((status & DAS16_INT) == 0) {
1181e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		DEBUG_PRINT("spurious interrupt\n");
1182e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return IRQ_NONE;
1183e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1184e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1185e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* clear interrupt */
1186e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(0x00, dev->iobase + DAS16_STATUS);
1187e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16_interrupt(dev);
1188e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return IRQ_HANDLED;
1189e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1190e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1191e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic void das16_timer_interrupt(unsigned long arg)
1192e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
11930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	struct comedi_device *dev = (struct comedi_device *)arg;
1194e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1195e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16_interrupt(dev);
1196e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1197e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (devpriv->timer_running)
1198e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		mod_timer(&devpriv->timer, jiffies + timer_period());
1199e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1200e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1201e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* the pc104-das16jr (at least) has problems if the dma
1202e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	transfer is interrupted in the middle of transferring
1203e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	a 16 bit sample, so this function takes care to get
1204e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	an even transfer count after disabling dma
1205e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	channel.
1206e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/
1207da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int disable_dma_on_even(struct comedi_device *dev)
1208e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1209e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int residue;
1210e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int i;
1211e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	static const int disable_limit = 100;
1212e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	static const int enable_timeout = 100;
1213e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	disable_dma(devpriv->dma_chan);
1214e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	residue = get_dma_residue(devpriv->dma_chan);
1215e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	for (i = 0; i < disable_limit && (residue % 2); ++i) {
1216e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		int j;
1217e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		enable_dma(devpriv->dma_chan);
1218e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		for (j = 0; j < enable_timeout; ++j) {
1219e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			int new_residue;
12205f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman			udelay(2);
1221e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			new_residue = get_dma_residue(devpriv->dma_chan);
1222e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			if (new_residue != residue)
1223e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef				break;
1224e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1225e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		disable_dma(devpriv->dma_chan);
1226e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		residue = get_dma_residue(devpriv->dma_chan);
1227e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1228e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (i == disable_limit) {
12293c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		comedi_error(dev, "failed to get an even dma transfer, "
12303c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva							"could be trouble.");
1231e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1232e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return residue;
1233e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1234e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1235da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic void das16_interrupt(struct comedi_device *dev)
1236e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1237e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned long dma_flags, spin_flags;
123834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton	struct comedi_subdevice *s = dev->read_subdev;
1239d163679ceec20c50f9aee880fa76c0c1185244a8Bill Pemberton	struct comedi_async *async;
1240ea6d0d4cab4f4f2d6a88f3bce4707fe92696fd3fBill Pemberton	struct comedi_cmd *cmd;
1241e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int num_bytes, residue;
1242e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int buffer_index;
1243e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1244e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (dev->attached == 0) {
1245e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		comedi_error(dev, "premature interrupt");
1246e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return;
1247e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
12482696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  initialize async here to make sure it is not NULL */
1249e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	async = s->async;
1250e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	cmd = &async->cmd;
1251e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1252e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (devpriv->dma_chan == 0) {
1253e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		comedi_error(dev, "interrupt with no dma channel?");
1254e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return;
1255e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1256e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
12575f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman	spin_lock_irqsave(&dev->spinlock, spin_flags);
1258e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if ((devpriv->control_state & DMA_ENABLE) == 0) {
12595f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman		spin_unlock_irqrestore(&dev->spinlock, spin_flags);
1260e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		DEBUG_PRINT("interrupt while dma disabled?\n");
1261e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return;
1262e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1263e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1264e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	dma_flags = claim_dma_lock();
1265e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	clear_dma_ff(devpriv->dma_chan);
1266e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	residue = disable_dma_on_even(dev);
1267e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
12682696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  figure out how many points to read */
1269e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (residue > devpriv->dma_transfer_size) {
1270e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		comedi_error(dev, "residue > transfer size!\n");
1271e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1272e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		num_bytes = 0;
1273e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else
1274e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		num_bytes = devpriv->dma_transfer_size - residue;
1275e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
12763c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	if (cmd->stop_src == TRIG_COUNT &&
12773c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva					num_bytes >= devpriv->adc_byte_count) {
1278e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		num_bytes = devpriv->adc_byte_count;
1279e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		async->events |= COMEDI_CB_EOA;
1280e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1281e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1282e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	buffer_index = devpriv->current_buffer;
1283e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->current_buffer = (devpriv->current_buffer + 1) % 2;
1284e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->adc_byte_count -= num_bytes;
1285e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
12862696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  figure out how many bytes for next transfer */
1287e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd->stop_src == TRIG_COUNT && devpriv->timer_mode == 0 &&
12880a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	    devpriv->dma_transfer_size > devpriv->adc_byte_count)
1289e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->dma_transfer_size = devpriv->adc_byte_count;
1290e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
12912696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  re-enable  dma */
1292e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if ((async->events & COMEDI_CB_EOA) == 0) {
1293e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		set_dma_addr(devpriv->dma_chan,
12940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			     devpriv->dma_buffer_addr[devpriv->current_buffer]);
1295e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		set_dma_count(devpriv->dma_chan, devpriv->dma_transfer_size);
1296e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		enable_dma(devpriv->dma_chan);
1297e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		/* reenable conversions for das1600 mode, (stupid hardware) */
12983c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		if (thisboard->size > 0x400 && devpriv->timer_mode == 0)
1299e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			outb(0x00, dev->iobase + DAS1600_CONV);
13003c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva
1301e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1302e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	release_dma_lock(dma_flags);
1303e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
13045f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman	spin_unlock_irqrestore(&dev->spinlock, spin_flags);
1305e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1306e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	cfc_write_array_to_buffer(s,
13070a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral				  devpriv->dma_buffer[buffer_index], num_bytes);
1308e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1309e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	cfc_handle_events(dev, s);
1310e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1311e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1312da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic unsigned int das16_set_pacer(struct comedi_device *dev, unsigned int ns,
13130a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral				    int rounding_flags)
1314e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1315e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	i8253_cascade_ns_to_timer_2div(devpriv->clockbase, &(devpriv->divisor1),
13160a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral				       &(devpriv->divisor2), &ns,
13170a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral				       rounding_flags & TRIG_ROUND_MASK);
1318e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1319e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* Write the values of ctr1 and ctr2 into counters 1 and 2 */
1320e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	i8254_load(dev->iobase + DAS16_CNTR0_DATA, 0, 1, devpriv->divisor1, 2);
1321e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	i8254_load(dev->iobase + DAS16_CNTR0_DATA, 0, 2, devpriv->divisor2, 2);
1322e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1323e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return ns;
1324e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1325e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1326da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic void reg_dump(struct comedi_device *dev)
1327e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1328e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("********DAS1600 REGISTER DUMP********\n");
1329e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS16_MUX: %x\n", inb(dev->iobase + DAS16_MUX));
1330e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS16_DIO: %x\n", inb(dev->iobase + DAS16_DIO));
1331e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS16_STATUS: %x\n", inb(dev->iobase + DAS16_STATUS));
1332e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS16_CONTROL: %x\n", inb(dev->iobase + DAS16_CONTROL));
1333e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS16_PACER: %x\n", inb(dev->iobase + DAS16_PACER));
1334e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS16_GAIN: %x\n", inb(dev->iobase + DAS16_GAIN));
1335e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS16_CNTR_CONTROL: %x\n",
13360a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		    inb(dev->iobase + DAS16_CNTR_CONTROL));
1337e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS1600_CONV: %x\n", inb(dev->iobase + DAS1600_CONV));
1338e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS1600_BURST: %x\n", inb(dev->iobase + DAS1600_BURST));
1339e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS1600_ENABLE: %x\n", inb(dev->iobase + DAS1600_ENABLE));
1340e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	DEBUG_PRINT("DAS1600_STATUS_B: %x\n",
13410a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		    inb(dev->iobase + DAS1600_STATUS_B));
1342e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1343e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1344da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_probe(struct comedi_device *dev, struct comedi_devconfig *it)
1345e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1346e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int status;
1347e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int diobits;
1348e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1349e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* status is available on all boards */
1350e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1351e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	status = inb(dev->iobase + DAS16_STATUS);
1352e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
13533c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	if ((status & UNIPOLAR))
1354e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->ai_unipolar = 1;
13553c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	else
1356e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->ai_unipolar = 0;
1357e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
13583c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva
13593c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	if ((status & DAS16_MUXBIT))
1360e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->ai_singleended = 1;
13613c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	else
1362e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->ai_singleended = 0;
13633c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva
1364e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1365e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* diobits indicates boards */
1366e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1367e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	diobits = inb(dev->iobase + DAS16_DIO) & 0xf0;
1368e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
13693c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	printk(KERN_INFO " id bits are 0x%02x\n", diobits);
1370e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->id != diobits) {
13713c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		printk(KERN_INFO " requested board's id bits are 0x%x (ignore)\n",
13720a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		       thisboard->id);
1373e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1374e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1375e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return 0;
1376e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1377e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1378da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das1600_mode_detect(struct comedi_device *dev)
1379e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1380e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int status = 0;
1381e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1382e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	status = inb(dev->iobase + DAS1600_STATUS_B);
1383e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1384e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (status & DAS1600_CLK_10MHZ) {
1385e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->clockbase = 100;
13863c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		printk(KERN_INFO " 10MHz pacer clock\n");
1387e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
1388e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->clockbase = 1000;
13893c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		printk(KERN_INFO " 1MHz pacer clock\n");
1390e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1391e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1392e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	reg_dump(dev);
1393e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1394e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return 0;
1395e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1396e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1397e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/*
1398e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef *
1399e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * Options list:
1400e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef *   0  I/O base
1401e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef *   1  IRQ
1402e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef *   2  DMA
1403e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef *   3  Clock speed (in MHz)
1404e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef */
1405e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1406da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1407e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
140834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton	struct comedi_subdevice *s;
1409e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int ret;
1410e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int irq;
1411e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned long iobase;
1412e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int dma_chan;
1413e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	int timer_mode;
1414e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned long flags;
14151f6325d629ce03501e8927480495685828561f26Bill Pemberton	struct comedi_krange *user_ai_range, *user_ao_range;
1416e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1417e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	iobase = it->options[0];
1418e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#if 0
1419e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	irq = it->options[1];
1420e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	timer_mode = it->options[8];
1421e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#endif
1422e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* always use time_mode since using irq can drop samples while
1423e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	 * waiting for dma done interrupt (due to hardware limitations) */
1424e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	irq = 0;
1425e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	timer_mode = 1;
1426e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (timer_mode)
1427e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		irq = 0;
1428e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
14293c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	printk(KERN_INFO "comedi%d: das16:", dev->minor);
1430e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
14312696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  check that clock setting is valid */
1432e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (it->options[3]) {
1433e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (it->options[3] != 0 &&
14340a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		    it->options[3] != 1 && it->options[3] != 10) {
14350a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			printk
14363c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva			    ("\n Invalid option.  Master clock must be set "
14373c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva							"to 1 or 10 (MHz)\n");
1438e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			return -EINVAL;
1439e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1440e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1441e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1442c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton	ret = alloc_private(dev, sizeof(struct das16_private_struct));
1443c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton	if (ret < 0)
1444e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return ret;
1445e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1446e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->size < 0x400) {
1447e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		printk(" 0x%04lx-0x%04lx\n", iobase, iobase + thisboard->size);
1448e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (!request_region(iobase, thisboard->size, "das16")) {
14493c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva			printk(KERN_ERR " I/O port conflict\n");
1450e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			return -EIO;
1451e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1452e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
14533c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		printk(KERN_INFO " 0x%04lx-0x%04lx 0x%04lx-0x%04lx\n",
14540a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		       iobase, iobase + 0x0f,
14550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		       iobase + 0x400,
14560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		       iobase + 0x400 + (thisboard->size & 0x3ff));
1457e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (!request_region(iobase, 0x10, "das16")) {
14583c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva			printk(KERN_ERR " I/O port conflict:  0x%04lx-0x%04lx\n",
14590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			       iobase, iobase + 0x0f);
1460e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			return -EIO;
1461e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1462e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (!request_region(iobase + 0x400, thisboard->size & 0x3ff,
14630a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral				    "das16")) {
1464e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			release_region(iobase, 0x10);
14653c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva			printk(KERN_ERR " I/O port conflict:  0x%04lx-0x%04lx\n",
14660a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			       iobase + 0x400,
14670a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			       iobase + 0x400 + (thisboard->size & 0x3ff));
1468e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			return -EIO;
1469e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1470e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1471e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1472e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	dev->iobase = iobase;
1473e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
14742696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  probe id bits to make sure they are consistent */
1475e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (das16_probe(dev, it)) {
14763c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		printk(KERN_ERR " id bits do not match selected board, aborting\n");
1477e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return -EINVAL;
1478e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1479e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	dev->board_name = thisboard->name;
1480e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
14812696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  get master clock speed */
1482e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->size < 0x400) {
1483e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (it->options[3])
1484e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			devpriv->clockbase = 1000 / it->options[3];
1485e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		else
14862696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton			devpriv->clockbase = 1000;	/*  1 MHz default */
1487e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
1488e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		das1600_mode_detect(dev);
1489e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1490e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1491e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* now for the irq */
1492e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (irq > 1 && irq < 8) {
14935f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman		ret = request_irq(irq, das16_dma_interrupt, 0, "das16", dev);
1494c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton
1495c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton		if (ret < 0)
1496e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			return ret;
1497e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		dev->irq = irq;
14983c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		printk(KERN_INFO " ( irq = %u )", irq);
1499e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else if (irq == 0) {
1500e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		printk(" ( no irq )");
1501e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
1502e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		printk(" invalid irq\n");
1503e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return -EINVAL;
1504e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1505e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
15062696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  initialize dma */
1507e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	dma_chan = it->options[2];
1508e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (dma_chan == 1 || dma_chan == 3) {
15092696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*  allocate dma buffers */
1510e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		int i;
1511e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		for (i = 0; i < 2; i++) {
15123c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva			devpriv->dma_buffer[i] = pci_alloc_consistent(
15133c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva						NULL, DAS16_DMA_SIZE,
15143c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva						&devpriv->dma_buffer_addr[i]);
15153c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva
1516e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			if (devpriv->dma_buffer[i] == NULL)
1517e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef				return -ENOMEM;
1518e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1519e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (request_dma(dma_chan, "das16")) {
15203c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva			printk(KERN_ERR " failed to allocate dma channel %i\n",
15210a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			       dma_chan);
1522e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			return -EINVAL;
1523e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1524e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->dma_chan = dma_chan;
1525e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		flags = claim_dma_lock();
1526e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		disable_dma(devpriv->dma_chan);
1527e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		set_dma_mode(devpriv->dma_chan, DMA_MODE_READ);
1528e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		release_dma_lock(flags);
15293c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		printk(KERN_INFO " ( dma = %u)\n", dma_chan);
1530e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else if (dma_chan == 0) {
15313c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		printk(KERN_INFO " ( no dma )\n");
1532e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
15333c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		printk(KERN_ERR " invalid dma channel\n");
1534e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return -EINVAL;
1535e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1536e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
15372696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  get any user-defined input range */
1538e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->ai_pg == das16_pg_none &&
15390a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral	    (it->options[4] || it->options[5])) {
15402696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*  allocate single-range range table */
1541e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->user_ai_range_table =
15420a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		    kmalloc(sizeof(struct comedi_lrange) +
15430a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			    sizeof(struct comedi_krange), GFP_KERNEL);
15442696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*  initialize ai range */
1545e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->user_ai_range_table->length = 1;
1546e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		user_ai_range = devpriv->user_ai_range_table->range;
1547e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		user_ai_range->min = it->options[4];
1548e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		user_ai_range->max = it->options[5];
1549e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		user_ai_range->flags = UNIT_volt;
1550e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
15512696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  get any user-defined output range */
1552e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (it->options[6] || it->options[7]) {
15532696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*  allocate single-range range table */
1554e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->user_ao_range_table =
15550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral		    kmalloc(sizeof(struct comedi_lrange) +
15560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			    sizeof(struct comedi_krange), GFP_KERNEL);
15572696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*  initialize ao range */
1558e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->user_ao_range_table->length = 1;
1559e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		user_ao_range = devpriv->user_ao_range_table->range;
1560e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		user_ao_range->min = it->options[6];
1561e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		user_ao_range->max = it->options[7];
1562e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		user_ao_range->flags = UNIT_volt;
1563e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1564e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1565e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (timer_mode) {
1566e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		init_timer(&(devpriv->timer));
1567e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->timer.function = das16_timer_interrupt;
1568e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		devpriv->timer.data = (unsigned long)dev;
1569e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1570e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->timer_mode = timer_mode ? 1 : 0;
1571e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1572c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton	ret = alloc_subdevices(dev, 5);
1573c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton	if (ret < 0)
1574e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return ret;
1575e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1576e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	s = dev->subdevices + 0;
1577e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	dev->read_subdev = s;
1578e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* ai */
1579e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->ai) {
1580e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->type = COMEDI_SUBD_AI;
1581e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->subdev_flags = SDF_READABLE | SDF_CMD_READ;
1582e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (devpriv->ai_singleended) {
1583e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->n_chan = 16;
1584e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->len_chanlist = 16;
1585e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->subdev_flags |= SDF_GROUND;
1586e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		} else {
1587e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->n_chan = 8;
1588e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->len_chanlist = 8;
1589e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->subdev_flags |= SDF_DIFF;
1590e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1591e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->maxdata = (1 << thisboard->ai_nbits) - 1;
15923c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		if (devpriv->user_ai_range_table) { /*  user defined ai range */
1593e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->range_table = devpriv->user_ai_range_table;
1594e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		} else if (devpriv->ai_unipolar) {
1595e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->range_table = das16_ai_uni_lranges[thisboard->ai_pg];
1596e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		} else {
1597e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->range_table = das16_ai_bip_lranges[thisboard->ai_pg];
1598e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1599e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->insn_read = thisboard->ai;
1600e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->do_cmdtest = das16_cmd_test;
1601e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->do_cmd = das16_cmd_exec;
1602e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->cancel = das16_cancel;
1603e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->munge = das16_ai_munge;
1604e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
1605e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->type = COMEDI_SUBD_UNUSED;
1606e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1607e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1608e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	s = dev->subdevices + 1;
1609e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* ao */
1610e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->ao) {
1611e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->type = COMEDI_SUBD_AO;
1612e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->subdev_flags = SDF_WRITABLE;
1613e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->n_chan = 2;
1614e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->maxdata = (1 << thisboard->ao_nbits) - 1;
16153c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		/*  user defined ao range */
16163c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		if (devpriv->user_ao_range_table)
1617e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->range_table = devpriv->user_ao_range_table;
16183c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		else
1619e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			s->range_table = &range_unknown;
16203c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva
1621e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->insn_write = thisboard->ao;
1622e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
1623e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->type = COMEDI_SUBD_UNUSED;
1624e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1625e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1626e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	s = dev->subdevices + 2;
1627e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* di */
1628e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->di) {
1629e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->type = COMEDI_SUBD_DI;
1630e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->subdev_flags = SDF_READABLE;
1631e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->n_chan = 4;
1632e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->maxdata = 1;
1633e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->range_table = &range_digital;
1634e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->insn_bits = thisboard->di;
1635e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
1636e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->type = COMEDI_SUBD_UNUSED;
1637e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1638e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1639e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	s = dev->subdevices + 3;
1640e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* do */
1641e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->do_) {
1642e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->type = COMEDI_SUBD_DO;
1643e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
1644e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->n_chan = 4;
1645e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->maxdata = 1;
1646e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->range_table = &range_digital;
1647e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->insn_bits = thisboard->do_;
16482696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*  initialize digital output lines */
1649e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb(s->state, dev->iobase + DAS16_DIO);
1650e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
1651e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->type = COMEDI_SUBD_UNUSED;
1652e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1653e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1654e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	s = dev->subdevices + 4;
1655e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* 8255 */
1656e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->i8255_offset != 0) {
1657e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		subdev_8255_init(dev, s, NULL, (dev->iobase +
16580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral						thisboard->i8255_offset));
1659e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
1660e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		s->type = COMEDI_SUBD_UNUSED;
1661e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1662e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1663e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16_reset(dev);
1664e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* set the interrupt level */
1665e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	devpriv->control_state = DAS16_IRQ(dev->irq);
1666e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	outb(devpriv->control_state, dev->iobase + DAS16_CONTROL);
1667e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
16682696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  turn on das1600 mode if available */
1669e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (thisboard->size > 0x400) {
1670e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb(DAS1600_ENABLE_VAL, dev->iobase + DAS1600_ENABLE);
1671e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb(0, dev->iobase + DAS1600_CONV);
1672e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		outb(0, dev->iobase + DAS1600_BURST);
1673e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1674e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1675e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return 0;
1676e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1677e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1678da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_detach(struct comedi_device *dev)
1679e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
16803c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva	printk(KERN_INFO "comedi%d: das16: remove\n", dev->minor);
1681e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1682e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	das16_reset(dev);
1683e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1684e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (dev->subdevices)
1685e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		subdev_8255_cleanup(dev, dev->subdevices + 4);
1686e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1687e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (devpriv) {
1688e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		int i;
1689e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		for (i = 0; i < 2; i++) {
1690e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			if (devpriv->dma_buffer[i])
1691e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef				pci_free_consistent(NULL, DAS16_DMA_SIZE,
16920a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral						    devpriv->dma_buffer[i],
16930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral						    devpriv->
16940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral						    dma_buffer_addr[i]);
1695e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1696e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (devpriv->dma_chan)
1697e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			free_dma(devpriv->dma_chan);
1698e4e1f289be88a75dc8b63d50ade1f9a2e6168021Ilia Mirkin		kfree(devpriv->user_ai_range_table);
1699e4e1f289be88a75dc8b63d50ade1f9a2e6168021Ilia Mirkin		kfree(devpriv->user_ao_range_table);
1700e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1701e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1702e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (dev->irq)
17035f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman		free_irq(dev->irq, dev);
1704e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1705e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (dev->iobase) {
1706e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		if (thisboard->size < 0x400) {
1707e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			release_region(dev->iobase, thisboard->size);
1708e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		} else {
1709e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			release_region(dev->iobase, 0x10);
1710e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			release_region(dev->iobase + 0x400,
17110a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral				       thisboard->size & 0x3ff);
1712e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		}
1713e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1714e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1715e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return 0;
1716e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1717e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
17187114a28011f9d5f3d981731ad341177c21f9d948Arun Thomasstatic int __init driver_das16_init_module(void)
17197114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas{
17207114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas	return comedi_driver_register(&driver_das16);
17217114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas}
17227114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas
17237114a28011f9d5f3d981731ad341177c21f9d948Arun Thomasstatic void __exit driver_das16_cleanup_module(void)
17247114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas{
17257114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas	comedi_driver_unregister(&driver_das16);
17267114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas}
17277114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas
17287114a28011f9d5f3d981731ad341177c21f9d948Arun Thomasmodule_init(driver_das16_init_module);
17297114a28011f9d5f3d981731ad341177c21f9d948Arun Thomasmodule_exit(driver_das16_cleanup_module);
1730e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
17312696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton/* utility function that suggests a dma transfer size in bytes */
1732da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic unsigned int das16_suggest_transfer_size(struct comedi_device *dev,
17330a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral						struct comedi_cmd cmd)
1734e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1735e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int size;
1736e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	unsigned int freq;
1737e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1738e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* if we are using timer interrupt, we don't care how long it
1739e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	 * will take to complete transfer since it will be interrupted
1740e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	 * by timer interrupt */
1741e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (devpriv->timer_mode)
1742e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		return DAS16_DMA_SIZE;
1743e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1744e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	/* otherwise, we are relying on dma terminal count interrupt,
1745e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	 * so pick a reasonable size */
1746e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd.convert_src == TRIG_TIMER)
1747e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		freq = 1000000000 / cmd.convert_arg;
1748e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	else if (cmd.scan_begin_src == TRIG_TIMER)
1749e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		freq = (1000000000 / cmd.scan_begin_arg) * cmd.chanlist_len;
17502696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  return some default value */
1751e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	else
1752e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		freq = 0xffffffff;
1753e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1754e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd.flags & TRIG_WAKE_EOS) {
1755e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		size = sample_size * cmd.chanlist_len;
1756e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	} else {
17572696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*  make buffer fill in no more than 1/3 second */
1758e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		size = (freq / 3) * sample_size;
1759e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1760e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
17612696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	/*  set a minimum and maximum size allowed */
1762e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (size > DAS16_DMA_SIZE)
1763e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		size = DAS16_DMA_SIZE - DAS16_DMA_SIZE % sample_size;
1764e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	else if (size < sample_size)
1765e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		size = sample_size;
1766e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1767e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	if (cmd.stop_src == TRIG_COUNT && size > devpriv->adc_byte_count)
1768e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		size = devpriv->adc_byte_count;
1769e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1770e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	return size;
1771e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
1772e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
17730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukralstatic void das16_ai_munge(struct comedi_device *dev,
17740a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			   struct comedi_subdevice *s, void *array,
17750a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			   unsigned int num_bytes,
17760a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral			   unsigned int start_chan_index)
1777e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{
1778790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton	unsigned int i, num_samples = num_bytes / sizeof(short);
1779790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton	short *data = array;
1780e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef
1781e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	for (i = 0; i < num_samples; i++) {
1782e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef		data[i] = le16_to_cpu(data[i]);
17833c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva		if (thisboard->ai_nbits == 12)
1784e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef			data[i] = (data[i] >> 4) & 0xfff;
17853c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva
1786e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef	}
1787e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}
178890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas
178990f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org");
179090f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver");
179190f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL");
1792