cb_pcidas64.c revision 90cae7944011b7a09b2d248e85ee11e987cc25f8
1/*
2    comedi/drivers/cb_pcidas64.c
3    This is a driver for the ComputerBoards/MeasurementComputing PCI-DAS
4    64xx, 60xx, and 4020 cards.
5
6    Author:  Frank Mori Hess <fmhess@users.sourceforge.net>
7    Copyright (C) 2001, 2002 Frank Mori Hess
8
9    Thanks also go to the following people:
10
11    Steve Rosenbluth, for providing the source code for
12    his pci-das6402 driver, and source code for working QNX pci-6402
13    drivers by Greg Laird and Mariusz Bogacz.  None of the code was
14    used directly here, but it was useful as an additional source of
15    documentation on how to program the boards.
16
17    John Sims, for much testing and feedback on pcidas-4020 support.
18
19    COMEDI - Linux Control and Measurement Device Interface
20    Copyright (C) 1997-8 David A. Schleef <ds@schleef.org>
21
22    This program is free software; you can redistribute it and/or modify
23    it under the terms of the GNU General Public License as published by
24    the Free Software Foundation; either version 2 of the License, or
25    (at your option) any later version.
26
27    This program is distributed in the hope that it will be useful,
28    but WITHOUT ANY WARRANTY; without even the implied warranty of
29    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30    GNU General Public License for more details.
31
32    You should have received a copy of the GNU General Public License
33    along with this program; if not, write to the Free Software
34    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
35
36************************************************************************/
37
38/*
39
40Driver: cb_pcidas64
41Description: MeasurementComputing PCI-DAS64xx, 60XX, and 4020 series with the PLX 9080 PCI controller
42Author: Frank Mori Hess <fmhess@users.sourceforge.net>
43Status: works
44Updated: 2002-10-09
45Devices: [Measurement Computing] PCI-DAS6402/16 (cb_pcidas64),
46  PCI-DAS6402/12, PCI-DAS64/M1/16, PCI-DAS64/M2/16,
47  PCI-DAS64/M3/16, PCI-DAS6402/16/JR, PCI-DAS64/M1/16/JR,
48  PCI-DAS64/M2/16/JR, PCI-DAS64/M3/16/JR, PCI-DAS64/M1/14,
49  PCI-DAS64/M2/14, PCI-DAS64/M3/14, PCI-DAS6013, PCI-DAS6014,
50  PCI-DAS6023, PCI-DAS6025, PCI-DAS6030,
51  PCI-DAS6031, PCI-DAS6032, PCI-DAS6033, PCI-DAS6034,
52  PCI-DAS6035, PCI-DAS6036, PCI-DAS6040, PCI-DAS6052,
53  PCI-DAS6070, PCI-DAS6071, PCI-DAS4020/12
54
55Configuration options:
56   [0] - PCI bus of device (optional)
57   [1] - PCI slot of device (optional)
58
59These boards may be autocalibrated with the comedi_calibrate utility.
60
61To select the bnc trigger input on the 4020 (instead of the dio input),
62specify a nonzero channel in the chanspec.  If you wish to use an external
63master clock on the 4020, you may do so by setting the scan_begin_src
64to TRIG_OTHER, and using an INSN_CONFIG_TIMER_1 configuration insn
65to configure the divisor to use for the external clock.
66
67Some devices are not identified because the PCI device IDs are not yet
68known. If you have such a board, please file a bug report at
69https://bugs.comedi.org.
70
71*/
72
73/*
74
75TODO:
76	make it return error if user attempts an ai command that uses the
77		external queue, and an ao command simultaneously
78	user counter subdevice
79	there are a number of boards this driver will support when they are
80		fully released, but does not yet since the pci device id numbers
81		are not yet available.
82	support prescaled 100khz clock for slow pacing (not available on 6000 series?)
83	make ao fifo size adjustable like ai fifo
84*/
85
86#include "../comedidev.h"
87#include <linux/delay.h>
88#include <linux/interrupt.h>
89#include <asm/system.h>
90
91#include "comedi_pci.h"
92#include "8253.h"
93#include "8255.h"
94#include "plx9080.h"
95#include "comedi_fc.h"
96
97#undef PCIDAS64_DEBUG		/*  disable debugging code */
98/* #define PCIDAS64_DEBUG         enable debugging code */
99
100#ifdef PCIDAS64_DEBUG
101#define DEBUG_PRINT(format, args...)  printk(format , ## args)
102#else
103#define DEBUG_PRINT(format, args...)
104#endif
105
106#define TIMER_BASE 25		/*  40MHz master clock */
107#define PRESCALED_TIMER_BASE	10000	/*  100kHz 'prescaled' clock for slow aquisition, maybe I'll support this someday */
108#define DMA_BUFFER_SIZE 0x1000
109
110/* maximum value that can be loaded into board's 24-bit counters*/
111static const int max_counter_value = 0xffffff;
112
113/* PCI-DAS64xxx base addresses */
114
115/* indices of base address regions */
116enum base_address_regions {
117	PLX9080_BADDRINDEX = 0,
118	MAIN_BADDRINDEX = 2,
119	DIO_COUNTER_BADDRINDEX = 3,
120};
121
122/* priv(dev)->main_iobase registers */
123enum write_only_registers {
124	INTR_ENABLE_REG = 0x0,	/*  interrupt enable register */
125	HW_CONFIG_REG = 0x2,	/*  hardware config register */
126	DAQ_SYNC_REG = 0xc,
127	DAQ_ATRIG_LOW_4020_REG = 0xc,
128	ADC_CONTROL0_REG = 0x10,	/*  adc control register 0 */
129	ADC_CONTROL1_REG = 0x12,	/*  adc control register 1 */
130	CALIBRATION_REG = 0x14,
131	ADC_SAMPLE_INTERVAL_LOWER_REG = 0x16,	/*  lower 16 bits of adc sample interval counter */
132	ADC_SAMPLE_INTERVAL_UPPER_REG = 0x18,	/*  upper 8 bits of adc sample interval counter */
133	ADC_DELAY_INTERVAL_LOWER_REG = 0x1a,	/*  lower 16 bits of delay interval counter */
134	ADC_DELAY_INTERVAL_UPPER_REG = 0x1c,	/*  upper 8 bits of delay interval counter */
135	ADC_COUNT_LOWER_REG = 0x1e,	/*  lower 16 bits of hardware conversion/scan counter */
136	ADC_COUNT_UPPER_REG = 0x20,	/*  upper 8 bits of hardware conversion/scan counter */
137	ADC_START_REG = 0x22,	/*  software trigger to start aquisition */
138	ADC_CONVERT_REG = 0x24,	/*  initiates single conversion */
139	ADC_QUEUE_CLEAR_REG = 0x26,	/*  clears adc queue */
140	ADC_QUEUE_LOAD_REG = 0x28,	/*  loads adc queue */
141	ADC_BUFFER_CLEAR_REG = 0x2a,
142	ADC_QUEUE_HIGH_REG = 0x2c,	/*  high channel for internal queue, use adc_chan_bits() inline above */
143	DAC_CONTROL0_REG = 0x50,	/*  dac control register 0 */
144	DAC_CONTROL1_REG = 0x52,	/*  dac control register 0 */
145	DAC_SAMPLE_INTERVAL_LOWER_REG = 0x54,	/*  lower 16 bits of dac sample interval counter */
146	DAC_SAMPLE_INTERVAL_UPPER_REG = 0x56,	/*  upper 8 bits of dac sample interval counter */
147	DAC_SELECT_REG = 0x60,
148	DAC_START_REG = 0x64,
149	DAC_BUFFER_CLEAR_REG = 0x66,	/*  clear dac buffer */
150};
151static inline unsigned int dac_convert_reg(unsigned int channel)
152{
153	return 0x70 + (2 * (channel & 0x1));
154}
155
156static inline unsigned int dac_lsb_4020_reg(unsigned int channel)
157{
158	return 0x70 + (4 * (channel & 0x1));
159}
160
161static inline unsigned int dac_msb_4020_reg(unsigned int channel)
162{
163	return 0x72 + (4 * (channel & 0x1));
164}
165
166enum read_only_registers {
167	HW_STATUS_REG = 0x0,	/*  hardware status register, reading this apparently clears pending interrupts as well */
168	PIPE1_READ_REG = 0x4,
169	ADC_READ_PNTR_REG = 0x8,
170	LOWER_XFER_REG = 0x10,
171	ADC_WRITE_PNTR_REG = 0xc,
172	PREPOST_REG = 0x14,
173};
174
175enum read_write_registers {
176	I8255_4020_REG = 0x48,	/*  8255 offset, for 4020 only */
177	ADC_QUEUE_FIFO_REG = 0x100,	/*  external channel/gain queue, uses same bits as ADC_QUEUE_LOAD_REG */
178	ADC_FIFO_REG = 0x200,	/* adc data fifo */
179	DAC_FIFO_REG = 0x300,	/* dac data fifo, has weird interactions with external channel queue */
180};
181
182/* priv(dev)->dio_counter_iobase registers */
183enum dio_counter_registers {
184	DIO_8255_OFFSET = 0x0,
185	DO_REG = 0x20,
186	DI_REG = 0x28,
187	DIO_DIRECTION_60XX_REG = 0x40,
188	DIO_DATA_60XX_REG = 0x48,
189};
190
191/* bit definitions for write-only registers */
192
193enum intr_enable_contents {
194	ADC_INTR_SRC_MASK = 0x3,	/*  bits that set adc interrupt source */
195	ADC_INTR_QFULL_BITS = 0x0,	/*  interrupt fifo quater full */
196	ADC_INTR_EOC_BITS = 0x1,	/*  interrupt end of conversion */
197	ADC_INTR_EOSCAN_BITS = 0x2,	/*  interrupt end of scan */
198	ADC_INTR_EOSEQ_BITS = 0x3,	/*  interrupt end of sequence (probably wont use this it's pretty fancy) */
199	EN_ADC_INTR_SRC_BIT = 0x4,	/*  enable adc interrupt source */
200	EN_ADC_DONE_INTR_BIT = 0x8,	/*  enable adc aquisition done interrupt */
201	DAC_INTR_SRC_MASK = 0x30,
202	DAC_INTR_QEMPTY_BITS = 0x0,
203	DAC_INTR_HIGH_CHAN_BITS = 0x10,
204	EN_DAC_INTR_SRC_BIT = 0x40,	/*  enable dac interrupt source */
205	EN_DAC_DONE_INTR_BIT = 0x80,
206	EN_ADC_ACTIVE_INTR_BIT = 0x200,	/*  enable adc active interrupt */
207	EN_ADC_STOP_INTR_BIT = 0x400,	/*  enable adc stop trigger interrupt */
208	EN_DAC_ACTIVE_INTR_BIT = 0x800,	/*  enable dac active interrupt */
209	EN_DAC_UNDERRUN_BIT = 0x4000,	/*  enable dac underrun status bit */
210	EN_ADC_OVERRUN_BIT = 0x8000,	/*  enable adc overrun status bit */
211};
212
213enum hw_config_contents {
214	MASTER_CLOCK_4020_MASK = 0x3,	/*  bits that specify master clock source for 4020 */
215	INTERNAL_CLOCK_4020_BITS = 0x1,	/*  use 40 MHz internal master clock for 4020 */
216	BNC_CLOCK_4020_BITS = 0x2,	/*  use BNC input for master clock */
217	EXT_CLOCK_4020_BITS = 0x3,	/*  use dio input for master clock */
218	EXT_QUEUE_BIT = 0x200,	/*  use external channel/gain queue (more versatile than internal queue) */
219	SLOW_DAC_BIT = 0x400,	/*  use 225 nanosec strobe when loading dac instead of 50 nanosec */
220	HW_CONFIG_DUMMY_BITS = 0x2000,	/*  bit with unknown function yet given as default value in pci-das64 manual */
221	DMA_CH_SELECT_BIT = 0x8000,	/*  bit selects channels 1/0 for analog input/output, otherwise 0/1 */
222	FIFO_SIZE_REG = 0x4,	/*  allows adjustment of fifo sizes */
223	DAC_FIFO_SIZE_MASK = 0xff00,	/*  bits that set dac fifo size */
224	DAC_FIFO_BITS = 0xf800,	/* 8k sample ao fifo */
225};
226#define DAC_FIFO_SIZE 0x2000
227
228enum daq_atrig_low_4020_contents {
229	EXT_AGATE_BNC_BIT = 0x8000,	/*  use trig/ext clk bnc input for analog gate signal */
230	EXT_STOP_TRIG_BNC_BIT = 0x4000,	/*  use trig/ext clk bnc input for external stop trigger signal */
231	EXT_START_TRIG_BNC_BIT = 0x2000,	/*  use trig/ext clk bnc input for external start trigger signal */
232};
233static inline uint16_t analog_trig_low_threshold_bits(uint16_t threshold)
234{
235	return threshold & 0xfff;
236}
237
238enum adc_control0_contents {
239	ADC_GATE_SRC_MASK = 0x3,	/*  bits that select gate */
240	ADC_SOFT_GATE_BITS = 0x1,	/*  software gate */
241	ADC_EXT_GATE_BITS = 0x2,	/*  external digital gate */
242	ADC_ANALOG_GATE_BITS = 0x3,	/*  analog level gate */
243	ADC_GATE_LEVEL_BIT = 0x4,	/*  level-sensitive gate (for digital) */
244	ADC_GATE_POLARITY_BIT = 0x8,	/*  gate active low */
245	ADC_START_TRIG_SOFT_BITS = 0x10,
246	ADC_START_TRIG_EXT_BITS = 0x20,
247	ADC_START_TRIG_ANALOG_BITS = 0x30,
248	ADC_START_TRIG_MASK = 0x30,
249	ADC_START_TRIG_FALLING_BIT = 0x40,	/*  trig 1 uses falling edge */
250	ADC_EXT_CONV_FALLING_BIT = 0x800,	/*  external pacing uses falling edge */
251	ADC_SAMPLE_COUNTER_EN_BIT = 0x1000,	/*  enable hardware scan counter */
252	ADC_DMA_DISABLE_BIT = 0x4000,	/*  disables dma */
253	ADC_ENABLE_BIT = 0x8000,	/*  master adc enable */
254};
255
256enum adc_control1_contents {
257	ADC_QUEUE_CONFIG_BIT = 0x1,	/*  should be set for boards with > 16 channels */
258	CONVERT_POLARITY_BIT = 0x10,
259	EOC_POLARITY_BIT = 0x20,
260	ADC_SW_GATE_BIT = 0x40,	/*  software gate of adc */
261	ADC_DITHER_BIT = 0x200,	/*  turn on extra noise for dithering */
262	RETRIGGER_BIT = 0x800,
263	ADC_LO_CHANNEL_4020_MASK = 0x300,
264	ADC_HI_CHANNEL_4020_MASK = 0xc00,
265	TWO_CHANNEL_4020_BITS = 0x1000,	/*  two channel mode for 4020 */
266	FOUR_CHANNEL_4020_BITS = 0x2000,	/*  four channel mode for 4020 */
267	CHANNEL_MODE_4020_MASK = 0x3000,
268	ADC_MODE_MASK = 0xf000,
269};
270static inline uint16_t adc_lo_chan_4020_bits(unsigned int channel)
271{
272	return (channel & 0x3) << 8;
273};
274
275static inline uint16_t adc_hi_chan_4020_bits(unsigned int channel)
276{
277	return (channel & 0x3) << 10;
278};
279
280static inline uint16_t adc_mode_bits(unsigned int mode)
281{
282	return (mode & 0xf) << 12;
283};
284
285enum calibration_contents {
286	SELECT_8800_BIT = 0x1,
287	SELECT_8402_64XX_BIT = 0x2,
288	SELECT_1590_60XX_BIT = 0x2,
289	CAL_EN_64XX_BIT = 0x40,	/*  calibration enable for 64xx series */
290	SERIAL_DATA_IN_BIT = 0x80,
291	SERIAL_CLOCK_BIT = 0x100,
292	CAL_EN_60XX_BIT = 0x200,	/*  calibration enable for 60xx series */
293	CAL_GAIN_BIT = 0x800,
294};
295/* calibration sources for 6025 are:
296 *  0 : ground
297 *  1 : 10V
298 *  2 : 5V
299 *  3 : 0.5V
300 *  4 : 0.05V
301 *  5 : ground
302 *  6 : dac channel 0
303 *  7 : dac channel 1
304 */
305static inline uint16_t adc_src_bits(unsigned int source)
306{
307	return (source & 0xf) << 3;
308};
309
310static inline uint16_t adc_convert_chan_4020_bits(unsigned int channel)
311{
312	return (channel & 0x3) << 8;
313};
314
315enum adc_queue_load_contents {
316	UNIP_BIT = 0x800,	/*  unipolar/bipolar bit */
317	ADC_SE_DIFF_BIT = 0x1000,	/*  single-ended/ differential bit */
318	ADC_COMMON_BIT = 0x2000,	/*  non-referenced single-ended (common-mode input) */
319	QUEUE_EOSEQ_BIT = 0x4000,	/*  queue end of sequence */
320	QUEUE_EOSCAN_BIT = 0x8000,	/*  queue end of scan */
321};
322static inline uint16_t adc_chan_bits(unsigned int channel)
323{
324	return channel & 0x3f;
325};
326
327enum dac_control0_contents {
328	DAC_ENABLE_BIT = 0x8000,	/*  dac controller enable bit */
329	DAC_CYCLIC_STOP_BIT = 0x4000,
330	DAC_WAVEFORM_MODE_BIT = 0x100,
331	DAC_EXT_UPDATE_FALLING_BIT = 0x80,
332	DAC_EXT_UPDATE_ENABLE_BIT = 0x40,
333	WAVEFORM_TRIG_MASK = 0x30,
334	WAVEFORM_TRIG_DISABLED_BITS = 0x0,
335	WAVEFORM_TRIG_SOFT_BITS = 0x10,
336	WAVEFORM_TRIG_EXT_BITS = 0x20,
337	WAVEFORM_TRIG_ADC1_BITS = 0x30,
338	WAVEFORM_TRIG_FALLING_BIT = 0x8,
339	WAVEFORM_GATE_LEVEL_BIT = 0x4,
340	WAVEFORM_GATE_ENABLE_BIT = 0x2,
341	WAVEFORM_GATE_SELECT_BIT = 0x1,
342};
343
344enum dac_control1_contents {
345	DAC_WRITE_POLARITY_BIT = 0x800,	/* board-dependent setting */
346	DAC1_EXT_REF_BIT = 0x200,
347	DAC0_EXT_REF_BIT = 0x100,
348	DAC_OUTPUT_ENABLE_BIT = 0x80,	/*  dac output enable bit */
349	DAC_UPDATE_POLARITY_BIT = 0x40,	/* board-dependent setting */
350	DAC_SW_GATE_BIT = 0x20,
351	DAC1_UNIPOLAR_BIT = 0x8,
352	DAC0_UNIPOLAR_BIT = 0x2,
353};
354
355/* bit definitions for read-only registers */
356enum hw_status_contents {
357	DAC_UNDERRUN_BIT = 0x1,
358	ADC_OVERRUN_BIT = 0x2,
359	DAC_ACTIVE_BIT = 0x4,
360	ADC_ACTIVE_BIT = 0x8,
361	DAC_INTR_PENDING_BIT = 0x10,
362	ADC_INTR_PENDING_BIT = 0x20,
363	DAC_DONE_BIT = 0x40,
364	ADC_DONE_BIT = 0x80,
365	EXT_INTR_PENDING_BIT = 0x100,
366	ADC_STOP_BIT = 0x200,
367};
368static inline uint16_t pipe_full_bits(uint16_t hw_status_bits)
369{
370	return (hw_status_bits >> 10) & 0x3;
371};
372
373static inline unsigned int dma_chain_flag_bits(uint16_t prepost_bits)
374{
375	return (prepost_bits >> 6) & 0x3;
376}
377
378static inline unsigned int adc_upper_read_ptr_code(uint16_t prepost_bits)
379{
380	return (prepost_bits >> 12) & 0x3;
381}
382
383static inline unsigned int adc_upper_write_ptr_code(uint16_t prepost_bits)
384{
385	return (prepost_bits >> 14) & 0x3;
386}
387
388/* I2C addresses for 4020 */
389enum i2c_addresses {
390	RANGE_CAL_I2C_ADDR = 0x20,
391	CALDAC0_I2C_ADDR = 0xc,
392	CALDAC1_I2C_ADDR = 0xd,
393};
394
395enum range_cal_i2c_contents {
396	ADC_SRC_4020_MASK = 0x70,	/*  bits that set what source the adc converter measures */
397	BNC_TRIG_THRESHOLD_0V_BIT = 0x80,	/*  make bnc trig/ext clock threshold 0V instead of 2.5V */
398};
399static inline uint8_t adc_src_4020_bits(unsigned int source)
400{
401	return (source << 4) & ADC_SRC_4020_MASK;
402};
403
404static inline uint8_t attenuate_bit(unsigned int channel)
405{
406	/*  attenuate channel (+-5V input range) */
407	return 1 << (channel & 0x3);
408};
409
410/* analog input ranges for 64xx boards */
411static const struct comedi_lrange ai_ranges_64xx = {
412	8,
413	{
414	 BIP_RANGE(10),
415	 BIP_RANGE(5),
416	 BIP_RANGE(2.5),
417	 BIP_RANGE(1.25),
418	 UNI_RANGE(10),
419	 UNI_RANGE(5),
420	 UNI_RANGE(2.5),
421	 UNI_RANGE(1.25)
422	 }
423};
424
425/* analog input ranges for 60xx boards */
426static const struct comedi_lrange ai_ranges_60xx = {
427	4,
428	{
429	 BIP_RANGE(10),
430	 BIP_RANGE(5),
431	 BIP_RANGE(0.5),
432	 BIP_RANGE(0.05),
433	 }
434};
435
436/* analog input ranges for 6030, etc boards */
437static const struct comedi_lrange ai_ranges_6030 = {
438	14,
439	{
440	 BIP_RANGE(10),
441	 BIP_RANGE(5),
442	 BIP_RANGE(2),
443	 BIP_RANGE(1),
444	 BIP_RANGE(0.5),
445	 BIP_RANGE(0.2),
446	 BIP_RANGE(0.1),
447	 UNI_RANGE(10),
448	 UNI_RANGE(5),
449	 UNI_RANGE(2),
450	 UNI_RANGE(1),
451	 UNI_RANGE(0.5),
452	 UNI_RANGE(0.2),
453	 UNI_RANGE(0.1),
454	 }
455};
456
457/* analog input ranges for 6052, etc boards */
458static const struct comedi_lrange ai_ranges_6052 = {
459	15,
460	{
461	 BIP_RANGE(10),
462	 BIP_RANGE(5),
463	 BIP_RANGE(2.5),
464	 BIP_RANGE(1),
465	 BIP_RANGE(0.5),
466	 BIP_RANGE(0.25),
467	 BIP_RANGE(0.1),
468	 BIP_RANGE(0.05),
469	 UNI_RANGE(10),
470	 UNI_RANGE(5),
471	 UNI_RANGE(2),
472	 UNI_RANGE(1),
473	 UNI_RANGE(0.5),
474	 UNI_RANGE(0.2),
475	 UNI_RANGE(0.1),
476	 }
477};
478
479/* analog input ranges for 4020 board */
480static const struct comedi_lrange ai_ranges_4020 = {
481	2,
482	{
483	 BIP_RANGE(5),
484	 BIP_RANGE(1),
485	 }
486};
487
488/* analog output ranges */
489static const struct comedi_lrange ao_ranges_64xx = {
490	4,
491	{
492	 BIP_RANGE(5),
493	 BIP_RANGE(10),
494	 UNI_RANGE(5),
495	 UNI_RANGE(10),
496	 }
497};
498
499static const int ao_range_code_64xx[] = {
500	0x0,
501	0x1,
502	0x2,
503	0x3,
504};
505
506static const struct comedi_lrange ao_ranges_60xx = {
507	1,
508	{
509	 BIP_RANGE(10),
510	 }
511};
512
513static const int ao_range_code_60xx[] = {
514	0x0,
515};
516
517static const struct comedi_lrange ao_ranges_6030 = {
518	2,
519	{
520	 BIP_RANGE(10),
521	 UNI_RANGE(10),
522	 }
523};
524
525static const int ao_range_code_6030[] = {
526	0x0,
527	0x2,
528};
529
530static const struct comedi_lrange ao_ranges_4020 = {
531	2,
532	{
533	 BIP_RANGE(5),
534	 BIP_RANGE(10),
535	 }
536};
537
538static const int ao_range_code_4020[] = {
539	0x1,
540	0x0,
541};
542
543enum register_layout {
544	LAYOUT_60XX,
545	LAYOUT_64XX,
546	LAYOUT_4020,
547};
548
549struct hw_fifo_info {
550	unsigned int num_segments;
551	unsigned int max_segment_length;
552	unsigned int sample_packing_ratio;
553	uint16_t fifo_size_reg_mask;
554};
555
556struct pcidas64_board {
557	const char *name;
558	int device_id;		/*  pci device id */
559	int ai_se_chans;	/*  number of ai inputs in single-ended mode */
560	int ai_bits;		/*  analog input resolution */
561	int ai_speed;		/*  fastest conversion period in ns */
562	const struct comedi_lrange *ai_range_table;
563	int ao_nchan;		/*  number of analog out channels */
564	int ao_bits;		/*  analog output resolution */
565	int ao_scan_speed;	/*  analog output speed (for a scan, not conversion) */
566	const struct comedi_lrange *ao_range_table;
567	const int *ao_range_code;
568	const struct hw_fifo_info *const ai_fifo;
569	enum register_layout layout;	/*  different board families have slightly different registers */
570	unsigned has_8255:1;
571};
572
573static const struct hw_fifo_info ai_fifo_4020 = {
574	.num_segments = 2,
575	.max_segment_length = 0x8000,
576	.sample_packing_ratio = 2,
577	.fifo_size_reg_mask = 0x7f,
578};
579
580static const struct hw_fifo_info ai_fifo_64xx = {
581	.num_segments = 4,
582	.max_segment_length = 0x800,
583	.sample_packing_ratio = 1,
584	.fifo_size_reg_mask = 0x3f,
585};
586
587static const struct hw_fifo_info ai_fifo_60xx = {
588	.num_segments = 4,
589	.max_segment_length = 0x800,
590	.sample_packing_ratio = 1,
591	.fifo_size_reg_mask = 0x7f,
592};
593
594/* maximum number of dma transfers we will chain together into a ring
595 * (and the maximum number of dma buffers we maintain) */
596#define MAX_AI_DMA_RING_COUNT (0x80000 / DMA_BUFFER_SIZE)
597#define MIN_AI_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
598#define AO_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
599static inline unsigned int ai_dma_ring_count(struct pcidas64_board *board)
600{
601	if (board->layout == LAYOUT_4020)
602		return MAX_AI_DMA_RING_COUNT;
603	else
604		return MIN_AI_DMA_RING_COUNT;
605}
606
607static const int bytes_in_sample = 2;
608
609static const struct pcidas64_board pcidas64_boards[] = {
610	{
611	 .name = "pci-das6402/16",
612	 .device_id = 0x1d,
613	 .ai_se_chans = 64,
614	 .ai_bits = 16,
615	 .ai_speed = 5000,
616	 .ao_nchan = 2,
617	 .ao_bits = 16,
618	 .ao_scan_speed = 10000,
619	 .layout = LAYOUT_64XX,
620	 .ai_range_table = &ai_ranges_64xx,
621	 .ao_range_table = &ao_ranges_64xx,
622	 .ao_range_code = ao_range_code_64xx,
623	 .ai_fifo = &ai_fifo_64xx,
624	 .has_8255 = 1,
625	 },
626	{
627	 .name = "pci-das6402/12",	/*  XXX check */
628	 .device_id = 0x1e,
629	 .ai_se_chans = 64,
630	 .ai_bits = 12,
631	 .ai_speed = 5000,
632	 .ao_nchan = 2,
633	 .ao_bits = 12,
634	 .ao_scan_speed = 10000,
635	 .layout = LAYOUT_64XX,
636	 .ai_range_table = &ai_ranges_64xx,
637	 .ao_range_table = &ao_ranges_64xx,
638	 .ao_range_code = ao_range_code_64xx,
639	 .ai_fifo = &ai_fifo_64xx,
640	 .has_8255 = 1,
641	 },
642	{
643	 .name = "pci-das64/m1/16",
644	 .device_id = 0x35,
645	 .ai_se_chans = 64,
646	 .ai_bits = 16,
647	 .ai_speed = 1000,
648	 .ao_nchan = 2,
649	 .ao_bits = 16,
650	 .ao_scan_speed = 10000,
651	 .layout = LAYOUT_64XX,
652	 .ai_range_table = &ai_ranges_64xx,
653	 .ao_range_table = &ao_ranges_64xx,
654	 .ao_range_code = ao_range_code_64xx,
655	 .ai_fifo = &ai_fifo_64xx,
656	 .has_8255 = 1,
657	 },
658	{
659	 .name = "pci-das64/m2/16",
660	 .device_id = 0x36,
661	 .ai_se_chans = 64,
662	 .ai_bits = 16,
663	 .ai_speed = 500,
664	 .ao_nchan = 2,
665	 .ao_bits = 16,
666	 .ao_scan_speed = 10000,
667	 .layout = LAYOUT_64XX,
668	 .ai_range_table = &ai_ranges_64xx,
669	 .ao_range_table = &ao_ranges_64xx,
670	 .ao_range_code = ao_range_code_64xx,
671	 .ai_fifo = &ai_fifo_64xx,
672	 .has_8255 = 1,
673	 },
674	{
675	 .name = "pci-das64/m3/16",
676	 .device_id = 0x37,
677	 .ai_se_chans = 64,
678	 .ai_bits = 16,
679	 .ai_speed = 333,
680	 .ao_nchan = 2,
681	 .ao_bits = 16,
682	 .ao_scan_speed = 10000,
683	 .layout = LAYOUT_64XX,
684	 .ai_range_table = &ai_ranges_64xx,
685	 .ao_range_table = &ao_ranges_64xx,
686	 .ao_range_code = ao_range_code_64xx,
687	 .ai_fifo = &ai_fifo_64xx,
688	 .has_8255 = 1,
689	 },
690	{
691	 .name = "pci-das6013",
692	 .device_id = 0x78,
693	 .ai_se_chans = 16,
694	 .ai_bits = 16,
695	 .ai_speed = 5000,
696	 .ao_nchan = 0,
697	 .ao_bits = 16,
698	 .layout = LAYOUT_60XX,
699	 .ai_range_table = &ai_ranges_60xx,
700	 .ao_range_table = &ao_ranges_60xx,
701	 .ao_range_code = ao_range_code_60xx,
702	 .ai_fifo = &ai_fifo_60xx,
703	 .has_8255 = 0,
704	 },
705	{
706	 .name = "pci-das6014",
707	 .device_id = 0x79,
708	 .ai_se_chans = 16,
709	 .ai_bits = 16,
710	 .ai_speed = 5000,
711	 .ao_nchan = 2,
712	 .ao_bits = 16,
713	 .ao_scan_speed = 100000,
714	 .layout = LAYOUT_60XX,
715	 .ai_range_table = &ai_ranges_60xx,
716	 .ao_range_table = &ao_ranges_60xx,
717	 .ao_range_code = ao_range_code_60xx,
718	 .ai_fifo = &ai_fifo_60xx,
719	 .has_8255 = 0,
720	 },
721	{
722	 .name = "pci-das6023",
723	 .device_id = 0x5d,
724	 .ai_se_chans = 16,
725	 .ai_bits = 12,
726	 .ai_speed = 5000,
727	 .ao_nchan = 0,
728	 .ao_scan_speed = 100000,
729	 .layout = LAYOUT_60XX,
730	 .ai_range_table = &ai_ranges_60xx,
731	 .ao_range_table = &ao_ranges_60xx,
732	 .ao_range_code = ao_range_code_60xx,
733	 .ai_fifo = &ai_fifo_60xx,
734	 .has_8255 = 1,
735	 },
736	{
737	 .name = "pci-das6025",
738	 .device_id = 0x5e,
739	 .ai_se_chans = 16,
740	 .ai_bits = 12,
741	 .ai_speed = 5000,
742	 .ao_nchan = 2,
743	 .ao_bits = 12,
744	 .ao_scan_speed = 100000,
745	 .layout = LAYOUT_60XX,
746	 .ai_range_table = &ai_ranges_60xx,
747	 .ao_range_table = &ao_ranges_60xx,
748	 .ao_range_code = ao_range_code_60xx,
749	 .ai_fifo = &ai_fifo_60xx,
750	 .has_8255 = 1,
751	 },
752	{
753	 .name = "pci-das6030",
754	 .device_id = 0x5f,
755	 .ai_se_chans = 16,
756	 .ai_bits = 16,
757	 .ai_speed = 10000,
758	 .ao_nchan = 2,
759	 .ao_bits = 16,
760	 .ao_scan_speed = 10000,
761	 .layout = LAYOUT_60XX,
762	 .ai_range_table = &ai_ranges_6030,
763	 .ao_range_table = &ao_ranges_6030,
764	 .ao_range_code = ao_range_code_6030,
765	 .ai_fifo = &ai_fifo_60xx,
766	 .has_8255 = 0,
767	 },
768	{
769	 .name = "pci-das6031",
770	 .device_id = 0x60,
771	 .ai_se_chans = 64,
772	 .ai_bits = 16,
773	 .ai_speed = 10000,
774	 .ao_nchan = 2,
775	 .ao_bits = 16,
776	 .ao_scan_speed = 10000,
777	 .layout = LAYOUT_60XX,
778	 .ai_range_table = &ai_ranges_6030,
779	 .ao_range_table = &ao_ranges_6030,
780	 .ao_range_code = ao_range_code_6030,
781	 .ai_fifo = &ai_fifo_60xx,
782	 .has_8255 = 0,
783	 },
784	{
785	 .name = "pci-das6032",
786	 .device_id = 0x61,
787	 .ai_se_chans = 16,
788	 .ai_bits = 16,
789	 .ai_speed = 10000,
790	 .ao_nchan = 0,
791	 .layout = LAYOUT_60XX,
792	 .ai_range_table = &ai_ranges_6030,
793	 .ai_fifo = &ai_fifo_60xx,
794	 .has_8255 = 0,
795	 },
796	{
797	 .name = "pci-das6033",
798	 .device_id = 0x62,
799	 .ai_se_chans = 64,
800	 .ai_bits = 16,
801	 .ai_speed = 10000,
802	 .ao_nchan = 0,
803	 .layout = LAYOUT_60XX,
804	 .ai_range_table = &ai_ranges_6030,
805	 .ai_fifo = &ai_fifo_60xx,
806	 .has_8255 = 0,
807	 },
808	{
809	 .name = "pci-das6034",
810	 .device_id = 0x63,
811	 .ai_se_chans = 16,
812	 .ai_bits = 16,
813	 .ai_speed = 5000,
814	 .ao_nchan = 0,
815	 .ao_scan_speed = 0,
816	 .layout = LAYOUT_60XX,
817	 .ai_range_table = &ai_ranges_60xx,
818	 .ai_fifo = &ai_fifo_60xx,
819	 .has_8255 = 0,
820	 },
821	{
822	 .name = "pci-das6035",
823	 .device_id = 0x64,
824	 .ai_se_chans = 16,
825	 .ai_bits = 16,
826	 .ai_speed = 5000,
827	 .ao_nchan = 2,
828	 .ao_bits = 12,
829	 .ao_scan_speed = 100000,
830	 .layout = LAYOUT_60XX,
831	 .ai_range_table = &ai_ranges_60xx,
832	 .ao_range_table = &ao_ranges_60xx,
833	 .ao_range_code = ao_range_code_60xx,
834	 .ai_fifo = &ai_fifo_60xx,
835	 .has_8255 = 0,
836	 },
837	{
838	 .name = "pci-das6036",
839	 .device_id = 0x6f,
840	 .ai_se_chans = 16,
841	 .ai_bits = 16,
842	 .ai_speed = 5000,
843	 .ao_nchan = 2,
844	 .ao_bits = 16,
845	 .ao_scan_speed = 100000,
846	 .layout = LAYOUT_60XX,
847	 .ai_range_table = &ai_ranges_60xx,
848	 .ao_range_table = &ao_ranges_60xx,
849	 .ao_range_code = ao_range_code_60xx,
850	 .ai_fifo = &ai_fifo_60xx,
851	 .has_8255 = 0,
852	 },
853	{
854	 .name = "pci-das6040",
855	 .device_id = 0x65,
856	 .ai_se_chans = 16,
857	 .ai_bits = 12,
858	 .ai_speed = 2000,
859	 .ao_nchan = 2,
860	 .ao_bits = 12,
861	 .ao_scan_speed = 1000,
862	 .layout = LAYOUT_60XX,
863	 .ai_range_table = &ai_ranges_6052,
864	 .ao_range_table = &ao_ranges_6030,
865	 .ao_range_code = ao_range_code_6030,
866	 .ai_fifo = &ai_fifo_60xx,
867	 .has_8255 = 0,
868	 },
869	{
870	 .name = "pci-das6052",
871	 .device_id = 0x66,
872	 .ai_se_chans = 16,
873	 .ai_bits = 16,
874	 .ai_speed = 3333,
875	 .ao_nchan = 2,
876	 .ao_bits = 16,
877	 .ao_scan_speed = 3333,
878	 .layout = LAYOUT_60XX,
879	 .ai_range_table = &ai_ranges_6052,
880	 .ao_range_table = &ao_ranges_6030,
881	 .ao_range_code = ao_range_code_6030,
882	 .ai_fifo = &ai_fifo_60xx,
883	 .has_8255 = 0,
884	 },
885	{
886	 .name = "pci-das6070",
887	 .device_id = 0x67,
888	 .ai_se_chans = 16,
889	 .ai_bits = 12,
890	 .ai_speed = 800,
891	 .ao_nchan = 2,
892	 .ao_bits = 12,
893	 .ao_scan_speed = 1000,
894	 .layout = LAYOUT_60XX,
895	 .ai_range_table = &ai_ranges_6052,
896	 .ao_range_table = &ao_ranges_6030,
897	 .ao_range_code = ao_range_code_6030,
898	 .ai_fifo = &ai_fifo_60xx,
899	 .has_8255 = 0,
900	 },
901	{
902	 .name = "pci-das6071",
903	 .device_id = 0x68,
904	 .ai_se_chans = 64,
905	 .ai_bits = 12,
906	 .ai_speed = 800,
907	 .ao_nchan = 2,
908	 .ao_bits = 12,
909	 .ao_scan_speed = 1000,
910	 .layout = LAYOUT_60XX,
911	 .ai_range_table = &ai_ranges_6052,
912	 .ao_range_table = &ao_ranges_6030,
913	 .ao_range_code = ao_range_code_6030,
914	 .ai_fifo = &ai_fifo_60xx,
915	 .has_8255 = 0,
916	 },
917	{
918	 .name = "pci-das4020/12",
919	 .device_id = 0x52,
920	 .ai_se_chans = 4,
921	 .ai_bits = 12,
922	 .ai_speed = 50,
923	 .ao_bits = 12,
924	 .ao_nchan = 2,
925	 .ao_scan_speed = 0,	/*  no hardware pacing on ao */
926	 .layout = LAYOUT_4020,
927	 .ai_range_table = &ai_ranges_4020,
928	 .ao_range_table = &ao_ranges_4020,
929	 .ao_range_code = ao_range_code_4020,
930	 .ai_fifo = &ai_fifo_4020,
931	 .has_8255 = 1,
932	 },
933#if 0
934	{
935	 .name = "pci-das6402/16/jr",
936	 .device_id = 0		/*  XXX, */
937	 .ai_se_chans = 64,
938	 .ai_bits = 16,
939	 .ai_speed = 5000,
940	 .ao_nchan = 0,
941	 .ao_scan_speed = 10000,
942	 .layout = LAYOUT_64XX,
943	 .ai_range_table = &ai_ranges_64xx,
944	 .ai_fifo = ai_fifo_64xx,
945	 .has_8255 = 1,
946	 },
947	{
948	 .name = "pci-das64/m1/16/jr",
949	 .device_id = 0		/*  XXX, */
950	 .ai_se_chans = 64,
951	 .ai_bits = 16,
952	 .ai_speed = 1000,
953	 .ao_nchan = 0,
954	 .ao_scan_speed = 10000,
955	 .layout = LAYOUT_64XX,
956	 .ai_range_table = &ai_ranges_64xx,
957	 .ai_fifo = ai_fifo_64xx,
958	 .has_8255 = 1,
959	 },
960	{
961	 .name = "pci-das64/m2/16/jr",
962	 .device_id = 0		/*  XXX, */
963	 .ai_se_chans = 64,
964	 .ai_bits = 16,
965	 .ai_speed = 500,
966	 .ao_nchan = 0,
967	 .ao_scan_speed = 10000,
968	 .layout = LAYOUT_64XX,
969	 .ai_range_table = &ai_ranges_64xx,
970	 .ai_fifo = ai_fifo_64xx,
971	 .has_8255 = 1,
972	 },
973	{
974	 .name = "pci-das64/m3/16/jr",
975	 .device_id = 0		/*  XXX, */
976	 .ai_se_chans = 64,
977	 .ai_bits = 16,
978	 .ai_speed = 333,
979	 .ao_nchan = 0,
980	 .ao_scan_speed = 10000,
981	 .layout = LAYOUT_64XX,
982	 .ai_range_table = &ai_ranges_64xx,
983	 .ai_fifo = ai_fifo_64xx,
984	 .has_8255 = 1,
985	 },
986	{
987	 .name = "pci-das64/m1/14",
988	 .device_id = 0,	/*  XXX */
989	 .ai_se_chans = 64,
990	 .ai_bits = 14,
991	 .ai_speed = 1000,
992	 .ao_nchan = 2,
993	 .ao_scan_speed = 10000,
994	 .layout = LAYOUT_64XX,
995	 .ai_range_table = &ai_ranges_64xx,
996	 .ai_fifo = ai_fifo_64xx,
997	 .has_8255 = 1,
998	 },
999	{
1000	 .name = "pci-das64/m2/14",
1001	 .device_id = 0,	/*  XXX */
1002	 .ai_se_chans = 64,
1003	 .ai_bits = 14,
1004	 .ai_speed = 500,
1005	 .ao_nchan = 2,
1006	 .ao_scan_speed = 10000,
1007	 .layout = LAYOUT_64XX,
1008	 .ai_range_table = &ai_ranges_64xx,
1009	 .ai_fifo = ai_fifo_64xx,
1010	 .has_8255 = 1,
1011	 },
1012	{
1013	 .name = "pci-das64/m3/14",
1014	 .device_id = 0,	/*  XXX */
1015	 .ai_se_chans = 64,
1016	 .ai_bits = 14,
1017	 .ai_speed = 333,
1018	 .ao_nchan = 2,
1019	 .ao_scan_speed = 10000,
1020	 .layout = LAYOUT_64XX,
1021	 .ai_range_table = &ai_ranges_64xx,
1022	 .ai_fifo = ai_fifo_64xx,
1023	 .has_8255 = 1,
1024	 },
1025#endif
1026};
1027
1028static DEFINE_PCI_DEVICE_TABLE(pcidas64_pci_table) = {
1029	{
1030	PCI_VENDOR_ID_COMPUTERBOARDS, 0x001d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1031	{
1032	PCI_VENDOR_ID_COMPUTERBOARDS, 0x001e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1033	{
1034	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0035, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1035	{
1036	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0036, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1037	{
1038	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0037, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1039	{
1040	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0052, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1041	{
1042	PCI_VENDOR_ID_COMPUTERBOARDS, 0x005d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1043	{
1044	PCI_VENDOR_ID_COMPUTERBOARDS, 0x005e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1045	{
1046	PCI_VENDOR_ID_COMPUTERBOARDS, 0x005f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1047	{
1048	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0061, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1049	{
1050	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0062, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1051	{
1052	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0063, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1053	{
1054	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0064, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1055	{
1056	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0066, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1057	{
1058	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0067, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1059	{
1060	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0068, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1061	{
1062	PCI_VENDOR_ID_COMPUTERBOARDS, 0x006f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1063	{
1064	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0078, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1065	{
1066	PCI_VENDOR_ID_COMPUTERBOARDS, 0x0079, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1067	{
1068	0}
1069};
1070
1071MODULE_DEVICE_TABLE(pci, pcidas64_pci_table);
1072
1073static inline struct pcidas64_board *board(const struct comedi_device *dev)
1074{
1075	return (struct pcidas64_board *)dev->board_ptr;
1076}
1077
1078static inline unsigned short se_diff_bit_6xxx(struct comedi_device *dev,
1079					      int use_differential)
1080{
1081	if ((board(dev)->layout == LAYOUT_64XX && !use_differential) ||
1082	    (board(dev)->layout == LAYOUT_60XX && use_differential))
1083		return ADC_SE_DIFF_BIT;
1084	else
1085		return 0;
1086};
1087
1088struct ext_clock_info {
1089	unsigned int divisor;	/*  master clock divisor to use for scans with external master clock */
1090	unsigned int chanspec;	/*  chanspec for master clock input when used as scan begin src */
1091};
1092
1093/* this structure is for data unique to this hardware driver. */
1094struct pcidas64_private {
1095
1096	struct pci_dev *hw_dev;	/*  pointer to board's pci_dev struct */
1097	/*  base addresses (physical) */
1098	resource_size_t plx9080_phys_iobase;
1099	resource_size_t main_phys_iobase;
1100	resource_size_t dio_counter_phys_iobase;
1101	/*  base addresses (ioremapped) */
1102	void *plx9080_iobase;
1103	void *main_iobase;
1104	void *dio_counter_iobase;
1105	/*  local address (used by dma controller) */
1106	uint32_t local0_iobase;
1107	uint32_t local1_iobase;
1108	volatile unsigned int ai_count;	/*  number of analog input samples remaining */
1109	uint16_t *ai_buffer[MAX_AI_DMA_RING_COUNT];	/*  dma buffers for analog input */
1110	dma_addr_t ai_buffer_bus_addr[MAX_AI_DMA_RING_COUNT];	/*  physical addresses of ai dma buffers */
1111	struct plx_dma_desc *ai_dma_desc;	/*  array of ai dma descriptors read by plx9080, allocated to get proper alignment */
1112	dma_addr_t ai_dma_desc_bus_addr;	/*  physical address of ai dma descriptor array */
1113	volatile unsigned int ai_dma_index;	/*  index of the ai dma descriptor/buffer that is currently being used */
1114	uint16_t *ao_buffer[AO_DMA_RING_COUNT];	/*  dma buffers for analog output */
1115	dma_addr_t ao_buffer_bus_addr[AO_DMA_RING_COUNT];	/*  physical addresses of ao dma buffers */
1116	struct plx_dma_desc *ao_dma_desc;
1117	dma_addr_t ao_dma_desc_bus_addr;
1118	volatile unsigned int ao_dma_index;	/*  keeps track of buffer where the next ao sample should go */
1119	volatile unsigned long ao_count;	/*  number of analog output samples remaining */
1120	volatile unsigned int ao_value[2];	/*  remember what the analog outputs are set to, to allow readback */
1121	unsigned int hw_revision;	/*  stc chip hardware revision number */
1122	volatile unsigned int intr_enable_bits;	/*  last bits sent to INTR_ENABLE_REG register */
1123	volatile uint16_t adc_control1_bits;	/*  last bits sent to ADC_CONTROL1_REG register */
1124	volatile uint16_t fifo_size_bits;	/*  last bits sent to FIFO_SIZE_REG register */
1125	volatile uint16_t hw_config_bits;	/*  last bits sent to HW_CONFIG_REG register */
1126	volatile uint16_t dac_control1_bits;
1127	volatile uint32_t plx_control_bits;	/*  last bits written to plx9080 control register */
1128	volatile uint32_t plx_intcsr_bits;	/*  last bits written to plx interrupt control and status register */
1129	volatile int calibration_source;	/*  index of calibration source readable through ai ch0 */
1130	volatile uint8_t i2c_cal_range_bits;	/*  bits written to i2c calibration/range register */
1131	volatile unsigned int ext_trig_falling;	/*  configure digital triggers to trigger on falling edge */
1132	/*  states of various devices stored to enable read-back */
1133	unsigned int ad8402_state[2];
1134	unsigned int caldac_state[8];
1135	volatile short ai_cmd_running;
1136	unsigned int ai_fifo_segment_length;
1137	struct ext_clock_info ext_clock;
1138	short ao_bounce_buffer[DAC_FIFO_SIZE];
1139};
1140
1141/* inline function that makes it easier to
1142 * access the private structure.
1143 */
1144static inline struct pcidas64_private *priv(struct comedi_device *dev)
1145{
1146	return dev->private;
1147}
1148
1149/*
1150 * The comedi_driver structure tells the Comedi core module
1151 * which functions to call to configure/deconfigure (attach/detach)
1152 * the board, and also about the kernel module that contains
1153 * the device code.
1154 */
1155static int attach(struct comedi_device *dev, struct comedi_devconfig *it);
1156static int detach(struct comedi_device *dev);
1157static struct comedi_driver driver_cb_pcidas = {
1158	.driver_name = "cb_pcidas64",
1159	.module = THIS_MODULE,
1160	.attach = attach,
1161	.detach = detach,
1162};
1163
1164static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1165		    struct comedi_insn *insn, unsigned int *data);
1166static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
1167			  struct comedi_insn *insn, unsigned int *data);
1168static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
1169		    struct comedi_insn *insn, unsigned int *data);
1170static int ao_readback_insn(struct comedi_device *dev,
1171			    struct comedi_subdevice *s,
1172			    struct comedi_insn *insn, unsigned int *data);
1173static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
1174static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
1175		      struct comedi_cmd *cmd);
1176static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
1177static int ao_inttrig(struct comedi_device *dev,
1178		      struct comedi_subdevice *subdev, unsigned int trig_num);
1179static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
1180		      struct comedi_cmd *cmd);
1181static irqreturn_t handle_interrupt(int irq, void *d);
1182static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
1183static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
1184static int dio_callback(int dir, int port, int data, unsigned long arg);
1185static int dio_callback_4020(int dir, int port, int data, unsigned long arg);
1186static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
1187		    struct comedi_insn *insn, unsigned int *data);
1188static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
1189		    struct comedi_insn *insn, unsigned int *data);
1190static int dio_60xx_config_insn(struct comedi_device *dev,
1191				struct comedi_subdevice *s,
1192				struct comedi_insn *insn, unsigned int *data);
1193static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
1194			  struct comedi_insn *insn, unsigned int *data);
1195static int calib_read_insn(struct comedi_device *dev,
1196			   struct comedi_subdevice *s, struct comedi_insn *insn,
1197			   unsigned int *data);
1198static int calib_write_insn(struct comedi_device *dev,
1199			    struct comedi_subdevice *s,
1200			    struct comedi_insn *insn, unsigned int *data);
1201static int ad8402_read_insn(struct comedi_device *dev,
1202			    struct comedi_subdevice *s,
1203			    struct comedi_insn *insn, unsigned int *data);
1204static void ad8402_write(struct comedi_device *dev, unsigned int channel,
1205			 unsigned int value);
1206static int ad8402_write_insn(struct comedi_device *dev,
1207			     struct comedi_subdevice *s,
1208			     struct comedi_insn *insn, unsigned int *data);
1209static int eeprom_read_insn(struct comedi_device *dev,
1210			    struct comedi_subdevice *s,
1211			    struct comedi_insn *insn, unsigned int *data);
1212static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd);
1213static unsigned int get_divisor(unsigned int ns, unsigned int flags);
1214static void i2c_write(struct comedi_device *dev, unsigned int address,
1215		      const uint8_t * data, unsigned int length);
1216static void caldac_write(struct comedi_device *dev, unsigned int channel,
1217			 unsigned int value);
1218static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
1219			     uint8_t value);
1220/* static int dac_1590_write(struct comedi_device *dev, unsigned int dac_a, unsigned int dac_b); */
1221static int caldac_i2c_write(struct comedi_device *dev,
1222			    unsigned int caldac_channel, unsigned int value);
1223static void abort_dma(struct comedi_device *dev, unsigned int channel);
1224static void disable_plx_interrupts(struct comedi_device *dev);
1225static int set_ai_fifo_size(struct comedi_device *dev,
1226			    unsigned int num_samples);
1227static unsigned int ai_fifo_size(struct comedi_device *dev);
1228static int set_ai_fifo_segment_length(struct comedi_device *dev,
1229				      unsigned int num_entries);
1230static void disable_ai_pacing(struct comedi_device *dev);
1231static void disable_ai_interrupts(struct comedi_device *dev);
1232static void enable_ai_interrupts(struct comedi_device *dev,
1233				 const struct comedi_cmd *cmd);
1234static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags);
1235static void load_ao_dma(struct comedi_device *dev,
1236			const struct comedi_cmd *cmd);
1237
1238COMEDI_PCI_INITCLEANUP(driver_cb_pcidas, pcidas64_pci_table);
1239
1240static unsigned int ai_range_bits_6xxx(const struct comedi_device *dev,
1241				       unsigned int range_index)
1242{
1243	const struct comedi_krange *range =
1244	    &board(dev)->ai_range_table->range[range_index];
1245	unsigned int bits = 0;
1246
1247	switch (range->max) {
1248	case 10000000:
1249		bits = 0x000;
1250		break;
1251	case 5000000:
1252		bits = 0x100;
1253		break;
1254	case 2000000:
1255	case 2500000:
1256		bits = 0x200;
1257		break;
1258	case 1000000:
1259	case 1250000:
1260		bits = 0x300;
1261		break;
1262	case 500000:
1263		bits = 0x400;
1264		break;
1265	case 200000:
1266	case 250000:
1267		bits = 0x500;
1268		break;
1269	case 100000:
1270		bits = 0x600;
1271		break;
1272	case 50000:
1273		bits = 0x700;
1274		break;
1275	default:
1276		comedi_error(dev, "bug! in ai_range_bits_6xxx");
1277		break;
1278	}
1279	if (range->min == 0)
1280		bits += 0x900;
1281	return bits;
1282}
1283
1284static unsigned int hw_revision(const struct comedi_device *dev,
1285				uint16_t hw_status_bits)
1286{
1287	if (board(dev)->layout == LAYOUT_4020)
1288		return (hw_status_bits >> 13) & 0x7;
1289
1290	return (hw_status_bits >> 12) & 0xf;
1291}
1292
1293static void set_dac_range_bits(struct comedi_device *dev,
1294			       volatile uint16_t * bits, unsigned int channel,
1295			       unsigned int range)
1296{
1297	unsigned int code = board(dev)->ao_range_code[range];
1298
1299	if (channel > 1)
1300		comedi_error(dev, "bug! bad channel?");
1301	if (code & ~0x3)
1302		comedi_error(dev, "bug! bad range code?");
1303
1304	*bits &= ~(0x3 << (2 * channel));
1305	*bits |= code << (2 * channel);
1306};
1307
1308static inline int ao_cmd_is_supported(const struct pcidas64_board *board)
1309{
1310	return board->ao_nchan && board->layout != LAYOUT_4020;
1311}
1312
1313/* initialize plx9080 chip */
1314static void init_plx9080(struct comedi_device *dev)
1315{
1316	uint32_t bits;
1317	void *plx_iobase = priv(dev)->plx9080_iobase;
1318
1319	priv(dev)->plx_control_bits =
1320	    readl(priv(dev)->plx9080_iobase + PLX_CONTROL_REG);
1321
1322	/*  plx9080 dump */
1323	DEBUG_PRINT(" plx interrupt status 0x%x\n",
1324		    readl(plx_iobase + PLX_INTRCS_REG));
1325	DEBUG_PRINT(" plx id bits 0x%x\n", readl(plx_iobase + PLX_ID_REG));
1326	DEBUG_PRINT(" plx control reg 0x%x\n", priv(dev)->plx_control_bits);
1327	DEBUG_PRINT(" plx mode/arbitration reg 0x%x\n",
1328		    readl(plx_iobase + PLX_MARB_REG));
1329	DEBUG_PRINT(" plx region0 reg 0x%x\n",
1330		    readl(plx_iobase + PLX_REGION0_REG));
1331	DEBUG_PRINT(" plx region1 reg 0x%x\n",
1332		    readl(plx_iobase + PLX_REGION1_REG));
1333
1334	DEBUG_PRINT(" plx revision 0x%x\n",
1335		    readl(plx_iobase + PLX_REVISION_REG));
1336	DEBUG_PRINT(" plx dma channel 0 mode 0x%x\n",
1337		    readl(plx_iobase + PLX_DMA0_MODE_REG));
1338	DEBUG_PRINT(" plx dma channel 1 mode 0x%x\n",
1339		    readl(plx_iobase + PLX_DMA1_MODE_REG));
1340	DEBUG_PRINT(" plx dma channel 0 pci address 0x%x\n",
1341		    readl(plx_iobase + PLX_DMA0_PCI_ADDRESS_REG));
1342	DEBUG_PRINT(" plx dma channel 0 local address 0x%x\n",
1343		    readl(plx_iobase + PLX_DMA0_LOCAL_ADDRESS_REG));
1344	DEBUG_PRINT(" plx dma channel 0 transfer size 0x%x\n",
1345		    readl(plx_iobase + PLX_DMA0_TRANSFER_SIZE_REG));
1346	DEBUG_PRINT(" plx dma channel 0 descriptor 0x%x\n",
1347		    readl(plx_iobase + PLX_DMA0_DESCRIPTOR_REG));
1348	DEBUG_PRINT(" plx dma channel 0 command status 0x%x\n",
1349		    readb(plx_iobase + PLX_DMA0_CS_REG));
1350	DEBUG_PRINT(" plx dma channel 0 threshold 0x%x\n",
1351		    readl(plx_iobase + PLX_DMA0_THRESHOLD_REG));
1352	DEBUG_PRINT(" plx bigend 0x%x\n", readl(plx_iobase + PLX_BIGEND_REG));
1353
1354#ifdef __BIG_ENDIAN
1355	bits = BIGEND_DMA0 | BIGEND_DMA1;
1356#else
1357	bits = 0;
1358#endif
1359	writel(bits, priv(dev)->plx9080_iobase + PLX_BIGEND_REG);
1360
1361	disable_plx_interrupts(dev);
1362
1363	abort_dma(dev, 0);
1364	abort_dma(dev, 1);
1365
1366	/*  configure dma0 mode */
1367	bits = 0;
1368	/*  enable ready input, not sure if this is necessary */
1369	bits |= PLX_DMA_EN_READYIN_BIT;
1370	/*  enable bterm, not sure if this is necessary */
1371	bits |= PLX_EN_BTERM_BIT;
1372	/*  enable dma chaining */
1373	bits |= PLX_EN_CHAIN_BIT;
1374	/*  enable interrupt on dma done (probably don't need this, since chain never finishes) */
1375	bits |= PLX_EN_DMA_DONE_INTR_BIT;
1376	/*  don't increment local address during transfers (we are transferring from a fixed fifo register) */
1377	bits |= PLX_LOCAL_ADDR_CONST_BIT;
1378	/*  route dma interrupt to pci bus */
1379	bits |= PLX_DMA_INTR_PCI_BIT;
1380	/*  enable demand mode */
1381	bits |= PLX_DEMAND_MODE_BIT;
1382	/*  enable local burst mode */
1383	bits |= PLX_DMA_LOCAL_BURST_EN_BIT;
1384	/*  4020 uses 32 bit dma */
1385	if (board(dev)->layout == LAYOUT_4020) {
1386		bits |= PLX_LOCAL_BUS_32_WIDE_BITS;
1387	} else {		/*  localspace0 bus is 16 bits wide */
1388		bits |= PLX_LOCAL_BUS_16_WIDE_BITS;
1389	}
1390	writel(bits, plx_iobase + PLX_DMA1_MODE_REG);
1391	if (ao_cmd_is_supported(board(dev)))
1392		writel(bits, plx_iobase + PLX_DMA0_MODE_REG);
1393
1394	/*  enable interrupts on plx 9080 */
1395	priv(dev)->plx_intcsr_bits |=
1396	    ICS_AERR | ICS_PERR | ICS_PIE | ICS_PLIE | ICS_PAIE | ICS_LIE |
1397	    ICS_DMA0_E | ICS_DMA1_E;
1398	writel(priv(dev)->plx_intcsr_bits,
1399	       priv(dev)->plx9080_iobase + PLX_INTRCS_REG);
1400}
1401
1402/* Allocate and initialize the subdevice structures.
1403 */
1404static int setup_subdevices(struct comedi_device *dev)
1405{
1406	struct comedi_subdevice *s;
1407	void *dio_8255_iobase;
1408	int i;
1409
1410	if (alloc_subdevices(dev, 10) < 0)
1411		return -ENOMEM;
1412
1413	s = dev->subdevices + 0;
1414	/* analog input subdevice */
1415	dev->read_subdev = s;
1416	s->type = COMEDI_SUBD_AI;
1417	s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DITHER | SDF_CMD_READ;
1418	if (board(dev)->layout == LAYOUT_60XX)
1419		s->subdev_flags |= SDF_COMMON | SDF_DIFF;
1420	else if (board(dev)->layout == LAYOUT_64XX)
1421		s->subdev_flags |= SDF_DIFF;
1422	/* XXX Number of inputs in differential mode is ignored */
1423	s->n_chan = board(dev)->ai_se_chans;
1424	s->len_chanlist = 0x2000;
1425	s->maxdata = (1 << board(dev)->ai_bits) - 1;
1426	s->range_table = board(dev)->ai_range_table;
1427	s->insn_read = ai_rinsn;
1428	s->insn_config = ai_config_insn;
1429	s->do_cmd = ai_cmd;
1430	s->do_cmdtest = ai_cmdtest;
1431	s->cancel = ai_cancel;
1432	if (board(dev)->layout == LAYOUT_4020) {
1433		unsigned int i;
1434		uint8_t data;
1435		/*  set adc to read from inputs (not internal calibration sources) */
1436		priv(dev)->i2c_cal_range_bits = adc_src_4020_bits(4);
1437		/*  set channels to +-5 volt input ranges */
1438		for (i = 0; i < s->n_chan; i++)
1439			priv(dev)->i2c_cal_range_bits |= attenuate_bit(i);
1440		data = priv(dev)->i2c_cal_range_bits;
1441		i2c_write(dev, RANGE_CAL_I2C_ADDR, &data, sizeof(data));
1442	}
1443
1444	/* analog output subdevice */
1445	s = dev->subdevices + 1;
1446	if (board(dev)->ao_nchan) {
1447		s->type = COMEDI_SUBD_AO;
1448		s->subdev_flags =
1449		    SDF_READABLE | SDF_WRITABLE | SDF_GROUND | SDF_CMD_WRITE;
1450		s->n_chan = board(dev)->ao_nchan;
1451		s->maxdata = (1 << board(dev)->ao_bits) - 1;
1452		s->range_table = board(dev)->ao_range_table;
1453		s->insn_read = ao_readback_insn;
1454		s->insn_write = ao_winsn;
1455		if (ao_cmd_is_supported(board(dev))) {
1456			dev->write_subdev = s;
1457			s->do_cmdtest = ao_cmdtest;
1458			s->do_cmd = ao_cmd;
1459			s->len_chanlist = board(dev)->ao_nchan;
1460			s->cancel = ao_cancel;
1461		}
1462	} else {
1463		s->type = COMEDI_SUBD_UNUSED;
1464	}
1465
1466	/*  digital input */
1467	s = dev->subdevices + 2;
1468	if (board(dev)->layout == LAYOUT_64XX) {
1469		s->type = COMEDI_SUBD_DI;
1470		s->subdev_flags = SDF_READABLE;
1471		s->n_chan = 4;
1472		s->maxdata = 1;
1473		s->range_table = &range_digital;
1474		s->insn_bits = di_rbits;
1475	} else
1476		s->type = COMEDI_SUBD_UNUSED;
1477
1478	/*  digital output */
1479	if (board(dev)->layout == LAYOUT_64XX) {
1480		s = dev->subdevices + 3;
1481		s->type = COMEDI_SUBD_DO;
1482		s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
1483		s->n_chan = 4;
1484		s->maxdata = 1;
1485		s->range_table = &range_digital;
1486		s->insn_bits = do_wbits;
1487	} else
1488		s->type = COMEDI_SUBD_UNUSED;
1489
1490	/* 8255 */
1491	s = dev->subdevices + 4;
1492	if (board(dev)->has_8255) {
1493		if (board(dev)->layout == LAYOUT_4020) {
1494			dio_8255_iobase =
1495			    priv(dev)->main_iobase + I8255_4020_REG;
1496			subdev_8255_init(dev, s, dio_callback_4020,
1497					 (unsigned long)dio_8255_iobase);
1498		} else {
1499			dio_8255_iobase =
1500			    priv(dev)->dio_counter_iobase + DIO_8255_OFFSET;
1501			subdev_8255_init(dev, s, dio_callback,
1502					 (unsigned long)dio_8255_iobase);
1503		}
1504	} else
1505		s->type = COMEDI_SUBD_UNUSED;
1506
1507	/*  8 channel dio for 60xx */
1508	s = dev->subdevices + 5;
1509	if (board(dev)->layout == LAYOUT_60XX) {
1510		s->type = COMEDI_SUBD_DIO;
1511		s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
1512		s->n_chan = 8;
1513		s->maxdata = 1;
1514		s->range_table = &range_digital;
1515		s->insn_config = dio_60xx_config_insn;
1516		s->insn_bits = dio_60xx_wbits;
1517	} else
1518		s->type = COMEDI_SUBD_UNUSED;
1519
1520	/*  caldac */
1521	s = dev->subdevices + 6;
1522	s->type = COMEDI_SUBD_CALIB;
1523	s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1524	s->n_chan = 8;
1525	if (board(dev)->layout == LAYOUT_4020)
1526		s->maxdata = 0xfff;
1527	else
1528		s->maxdata = 0xff;
1529	s->insn_read = calib_read_insn;
1530	s->insn_write = calib_write_insn;
1531	for (i = 0; i < s->n_chan; i++)
1532		caldac_write(dev, i, s->maxdata / 2);
1533
1534	/*  2 channel ad8402 potentiometer */
1535	s = dev->subdevices + 7;
1536	if (board(dev)->layout == LAYOUT_64XX) {
1537		s->type = COMEDI_SUBD_CALIB;
1538		s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1539		s->n_chan = 2;
1540		s->insn_read = ad8402_read_insn;
1541		s->insn_write = ad8402_write_insn;
1542		s->maxdata = 0xff;
1543		for (i = 0; i < s->n_chan; i++)
1544			ad8402_write(dev, i, s->maxdata / 2);
1545	} else
1546		s->type = COMEDI_SUBD_UNUSED;
1547
1548	/* serial EEPROM, if present */
1549	s = dev->subdevices + 8;
1550	if (readl(priv(dev)->plx9080_iobase + PLX_CONTROL_REG) & CTL_EECHK) {
1551		s->type = COMEDI_SUBD_MEMORY;
1552		s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
1553		s->n_chan = 128;
1554		s->maxdata = 0xffff;
1555		s->insn_read = eeprom_read_insn;
1556	} else
1557		s->type = COMEDI_SUBD_UNUSED;
1558
1559	/*  user counter subd XXX */
1560	s = dev->subdevices + 9;
1561	s->type = COMEDI_SUBD_UNUSED;
1562
1563	return 0;
1564}
1565
1566static void disable_plx_interrupts(struct comedi_device *dev)
1567{
1568	priv(dev)->plx_intcsr_bits = 0;
1569	writel(priv(dev)->plx_intcsr_bits,
1570	       priv(dev)->plx9080_iobase + PLX_INTRCS_REG);
1571}
1572
1573static void init_stc_registers(struct comedi_device *dev)
1574{
1575	uint16_t bits;
1576	unsigned long flags;
1577
1578	spin_lock_irqsave(&dev->spinlock, flags);
1579
1580	/*  bit should be set for 6025, although docs say boards with <= 16 chans should be cleared XXX */
1581	if (1)
1582		priv(dev)->adc_control1_bits |= ADC_QUEUE_CONFIG_BIT;
1583	writew(priv(dev)->adc_control1_bits,
1584	       priv(dev)->main_iobase + ADC_CONTROL1_REG);
1585
1586	/*  6402/16 manual says this register must be initialized to 0xff? */
1587	writew(0xff, priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1588
1589	bits = SLOW_DAC_BIT | DMA_CH_SELECT_BIT;
1590	if (board(dev)->layout == LAYOUT_4020)
1591		bits |= INTERNAL_CLOCK_4020_BITS;
1592	priv(dev)->hw_config_bits |= bits;
1593	writew(priv(dev)->hw_config_bits,
1594	       priv(dev)->main_iobase + HW_CONFIG_REG);
1595
1596	writew(0, priv(dev)->main_iobase + DAQ_SYNC_REG);
1597	writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
1598
1599	spin_unlock_irqrestore(&dev->spinlock, flags);
1600
1601	/*  set fifos to maximum size */
1602	priv(dev)->fifo_size_bits |= DAC_FIFO_BITS;
1603	set_ai_fifo_segment_length(dev,
1604				   board(dev)->ai_fifo->max_segment_length);
1605
1606	priv(dev)->dac_control1_bits = DAC_OUTPUT_ENABLE_BIT;
1607	priv(dev)->intr_enable_bits =	/* EN_DAC_INTR_SRC_BIT | DAC_INTR_QEMPTY_BITS | */
1608	    EN_DAC_DONE_INTR_BIT | EN_DAC_UNDERRUN_BIT;
1609	writew(priv(dev)->intr_enable_bits,
1610	       priv(dev)->main_iobase + INTR_ENABLE_REG);
1611
1612	disable_ai_pacing(dev);
1613};
1614
1615int alloc_and_init_dma_members(struct comedi_device *dev)
1616{
1617	int i;
1618
1619	/*  alocate pci dma buffers */
1620	for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1621		priv(dev)->ai_buffer[i] =
1622		    pci_alloc_consistent(priv(dev)->hw_dev, DMA_BUFFER_SIZE,
1623					 &priv(dev)->ai_buffer_bus_addr[i]);
1624		if (priv(dev)->ai_buffer[i] == NULL)
1625			return -ENOMEM;
1626
1627	}
1628	for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1629		if (ao_cmd_is_supported(board(dev))) {
1630			priv(dev)->ao_buffer[i] =
1631			    pci_alloc_consistent(priv(dev)->hw_dev,
1632						 DMA_BUFFER_SIZE,
1633						 &priv(dev)->
1634						 ao_buffer_bus_addr[i]);
1635			if (priv(dev)->ao_buffer[i] == NULL)
1636				return -ENOMEM;
1637
1638		}
1639	}
1640	/*  allocate dma descriptors */
1641	priv(dev)->ai_dma_desc =
1642	    pci_alloc_consistent(priv(dev)->hw_dev,
1643				 sizeof(struct plx_dma_desc) *
1644				 ai_dma_ring_count(board(dev)),
1645				 &priv(dev)->ai_dma_desc_bus_addr);
1646	if (priv(dev)->ai_dma_desc == NULL)
1647		return -ENOMEM;
1648
1649	DEBUG_PRINT("ai dma descriptors start at bus addr 0x%x\n",
1650		    priv(dev)->ai_dma_desc_bus_addr);
1651	if (ao_cmd_is_supported(board(dev))) {
1652		priv(dev)->ao_dma_desc =
1653		    pci_alloc_consistent(priv(dev)->hw_dev,
1654					 sizeof(struct plx_dma_desc) *
1655					 AO_DMA_RING_COUNT,
1656					 &priv(dev)->ao_dma_desc_bus_addr);
1657		if (priv(dev)->ao_dma_desc == NULL)
1658			return -ENOMEM;
1659
1660		DEBUG_PRINT("ao dma descriptors start at bus addr 0x%x\n",
1661			    priv(dev)->ao_dma_desc_bus_addr);
1662	}
1663	/*  initialize dma descriptors */
1664	for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1665		priv(dev)->ai_dma_desc[i].pci_start_addr =
1666		    cpu_to_le32(priv(dev)->ai_buffer_bus_addr[i]);
1667		if (board(dev)->layout == LAYOUT_4020)
1668			priv(dev)->ai_dma_desc[i].local_start_addr =
1669			    cpu_to_le32(priv(dev)->local1_iobase +
1670					ADC_FIFO_REG);
1671		else
1672			priv(dev)->ai_dma_desc[i].local_start_addr =
1673			    cpu_to_le32(priv(dev)->local0_iobase +
1674					ADC_FIFO_REG);
1675		priv(dev)->ai_dma_desc[i].transfer_size = cpu_to_le32(0);
1676		priv(dev)->ai_dma_desc[i].next =
1677		    cpu_to_le32((priv(dev)->ai_dma_desc_bus_addr + ((i +
1678								     1) %
1679								    ai_dma_ring_count
1680								    (board
1681								     (dev))) *
1682				 sizeof(priv(dev)->ai_dma_desc[0])) |
1683				PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT |
1684				PLX_XFER_LOCAL_TO_PCI);
1685	}
1686	if (ao_cmd_is_supported(board(dev))) {
1687		for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1688			priv(dev)->ao_dma_desc[i].pci_start_addr =
1689			    cpu_to_le32(priv(dev)->ao_buffer_bus_addr[i]);
1690			priv(dev)->ao_dma_desc[i].local_start_addr =
1691			    cpu_to_le32(priv(dev)->local0_iobase +
1692					DAC_FIFO_REG);
1693			priv(dev)->ao_dma_desc[i].transfer_size =
1694			    cpu_to_le32(0);
1695			priv(dev)->ao_dma_desc[i].next =
1696			    cpu_to_le32((priv(dev)->ao_dma_desc_bus_addr +
1697					 ((i + 1) % (AO_DMA_RING_COUNT)) *
1698					 sizeof(priv(dev)->ao_dma_desc[0])) |
1699					PLX_DESC_IN_PCI_BIT |
1700					PLX_INTR_TERM_COUNT);
1701		}
1702	}
1703	return 0;
1704}
1705
1706static inline void warn_external_queue(struct comedi_device *dev)
1707{
1708	comedi_error(dev,
1709		     "AO command and AI external channel queue cannot be used simultaneously.");
1710	comedi_error(dev,
1711		     "Use internal AI channel queue (channels must be consecutive and use same range/aref)");
1712}
1713
1714/*
1715 * Attach is called by the Comedi core to configure the driver
1716 * for a particular board.
1717 */
1718static int attach(struct comedi_device *dev, struct comedi_devconfig *it)
1719{
1720	struct pci_dev *pcidev;
1721	int index;
1722	uint32_t local_range, local_decode;
1723	int retval;
1724
1725	printk("comedi%d: cb_pcidas64\n", dev->minor);
1726
1727/*
1728 * Allocate the private structure area.
1729 */
1730	if (alloc_private(dev, sizeof(struct pcidas64_private)) < 0)
1731		return -ENOMEM;
1732
1733/*
1734 * Probe the device to determine what device in the series it is.
1735 */
1736
1737	for (pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL);
1738	     pcidev != NULL;
1739	     pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
1740		/*  is it not a computer boards card? */
1741		if (pcidev->vendor != PCI_VENDOR_ID_COMPUTERBOARDS)
1742			continue;
1743		/*  loop through cards supported by this driver */
1744		for (index = 0; index < ARRAY_SIZE(pcidas64_boards); index++) {
1745			if (pcidas64_boards[index].device_id != pcidev->device)
1746				continue;
1747			/*  was a particular bus/slot requested? */
1748			if (it->options[0] || it->options[1]) {
1749				/*  are we on the wrong bus/slot? */
1750				if (pcidev->bus->number != it->options[0] ||
1751				    PCI_SLOT(pcidev->devfn) != it->options[1]) {
1752					continue;
1753				}
1754			}
1755			priv(dev)->hw_dev = pcidev;
1756			dev->board_ptr = pcidas64_boards + index;
1757			break;
1758		}
1759		if (dev->board_ptr)
1760			break;
1761	}
1762
1763	if (dev->board_ptr == NULL) {
1764		printk
1765		    ("No supported ComputerBoards/MeasurementComputing card found\n");
1766		return -EIO;
1767	}
1768
1769	printk("Found %s on bus %i, slot %i\n", board(dev)->name,
1770	       pcidev->bus->number, PCI_SLOT(pcidev->devfn));
1771
1772	if (comedi_pci_enable(pcidev, driver_cb_pcidas.driver_name)) {
1773		printk(KERN_WARNING
1774		       " failed to enable PCI device and request regions\n");
1775		return -EIO;
1776	}
1777	pci_set_master(pcidev);
1778
1779	/* Initialize dev->board_name */
1780	dev->board_name = board(dev)->name;
1781
1782	priv(dev)->plx9080_phys_iobase =
1783	    pci_resource_start(pcidev, PLX9080_BADDRINDEX);
1784	priv(dev)->main_phys_iobase =
1785	    pci_resource_start(pcidev, MAIN_BADDRINDEX);
1786	priv(dev)->dio_counter_phys_iobase =
1787	    pci_resource_start(pcidev, DIO_COUNTER_BADDRINDEX);
1788
1789	/*  remap, won't work with 2.0 kernels but who cares */
1790	priv(dev)->plx9080_iobase = ioremap(priv(dev)->plx9080_phys_iobase,
1791					    pci_resource_len(pcidev,
1792							     PLX9080_BADDRINDEX));
1793	priv(dev)->main_iobase =
1794	    ioremap(priv(dev)->main_phys_iobase,
1795		    pci_resource_len(pcidev, MAIN_BADDRINDEX));
1796	priv(dev)->dio_counter_iobase =
1797	    ioremap(priv(dev)->dio_counter_phys_iobase,
1798		    pci_resource_len(pcidev, DIO_COUNTER_BADDRINDEX));
1799
1800	if (!priv(dev)->plx9080_iobase || !priv(dev)->main_iobase
1801	    || !priv(dev)->dio_counter_iobase) {
1802		printk(" failed to remap io memory\n");
1803		return -ENOMEM;
1804	}
1805
1806	DEBUG_PRINT(" plx9080 remapped to 0x%p\n", priv(dev)->plx9080_iobase);
1807	DEBUG_PRINT(" main remapped to 0x%p\n", priv(dev)->main_iobase);
1808	DEBUG_PRINT(" diocounter remapped to 0x%p\n",
1809		    priv(dev)->dio_counter_iobase);
1810
1811	/*  figure out what local addresses are */
1812	local_range =
1813	    readl(priv(dev)->plx9080_iobase + PLX_LAS0RNG_REG) & LRNG_MEM_MASK;
1814	local_decode =
1815	    readl(priv(dev)->plx9080_iobase +
1816		  PLX_LAS0MAP_REG) & local_range & LMAP_MEM_MASK;
1817	priv(dev)->local0_iobase =
1818	    ((uint32_t) priv(dev)->main_phys_iobase & ~local_range) |
1819	    local_decode;
1820	local_range =
1821	    readl(priv(dev)->plx9080_iobase + PLX_LAS1RNG_REG) & LRNG_MEM_MASK;
1822	local_decode =
1823	    readl(priv(dev)->plx9080_iobase +
1824		  PLX_LAS1MAP_REG) & local_range & LMAP_MEM_MASK;
1825	priv(dev)->local1_iobase =
1826	    ((uint32_t) priv(dev)->dio_counter_phys_iobase & ~local_range) |
1827	    local_decode;
1828
1829	DEBUG_PRINT(" local 0 io addr 0x%x\n", priv(dev)->local0_iobase);
1830	DEBUG_PRINT(" local 1 io addr 0x%x\n", priv(dev)->local1_iobase);
1831
1832	retval = alloc_and_init_dma_members(dev);
1833	if (retval < 0)
1834		return retval;
1835
1836	priv(dev)->hw_revision =
1837	    hw_revision(dev, readw(priv(dev)->main_iobase + HW_STATUS_REG));
1838	printk(" stc hardware revision %i\n", priv(dev)->hw_revision);
1839	init_plx9080(dev);
1840	init_stc_registers(dev);
1841	/*  get irq */
1842	if (request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED,
1843			"cb_pcidas64", dev)) {
1844		printk(" unable to allocate irq %u\n", pcidev->irq);
1845		return -EINVAL;
1846	}
1847	dev->irq = pcidev->irq;
1848	printk(" irq %u\n", dev->irq);
1849
1850	retval = setup_subdevices(dev);
1851	if (retval < 0)
1852		return retval;
1853
1854
1855	return 0;
1856}
1857
1858/*
1859 * _detach is called to deconfigure a device.  It should deallocate
1860 * resources.
1861 * This function is also called when _attach() fails, so it should be
1862 * careful not to release resources that were not necessarily
1863 * allocated by _attach().  dev->private and dev->subdevices are
1864 * deallocated automatically by the core.
1865 */
1866static int detach(struct comedi_device *dev)
1867{
1868	unsigned int i;
1869
1870	printk("comedi%d: cb_pcidas: remove\n", dev->minor);
1871
1872	if (dev->irq)
1873		free_irq(dev->irq, dev);
1874	if (priv(dev)) {
1875		if (priv(dev)->hw_dev) {
1876			if (priv(dev)->plx9080_iobase) {
1877				disable_plx_interrupts(dev);
1878				iounmap((void *)priv(dev)->plx9080_iobase);
1879			}
1880			if (priv(dev)->main_iobase)
1881				iounmap((void *)priv(dev)->main_iobase);
1882			if (priv(dev)->dio_counter_iobase)
1883				iounmap((void *)priv(dev)->dio_counter_iobase);
1884			/*  free pci dma buffers */
1885			for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1886				if (priv(dev)->ai_buffer[i])
1887					pci_free_consistent(priv(dev)->hw_dev,
1888							    DMA_BUFFER_SIZE,
1889							    priv(dev)->
1890							    ai_buffer[i],
1891							    priv
1892							    (dev)->ai_buffer_bus_addr
1893							    [i]);
1894			}
1895			for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1896				if (priv(dev)->ao_buffer[i])
1897					pci_free_consistent(priv(dev)->hw_dev,
1898							    DMA_BUFFER_SIZE,
1899							    priv(dev)->
1900							    ao_buffer[i],
1901							    priv
1902							    (dev)->ao_buffer_bus_addr
1903							    [i]);
1904			}
1905			/*  free dma descriptors */
1906			if (priv(dev)->ai_dma_desc)
1907				pci_free_consistent(priv(dev)->hw_dev,
1908						    sizeof(struct plx_dma_desc)
1909						    *
1910						    ai_dma_ring_count(board
1911								      (dev)),
1912						    priv(dev)->ai_dma_desc,
1913						    priv(dev)->
1914						    ai_dma_desc_bus_addr);
1915			if (priv(dev)->ao_dma_desc)
1916				pci_free_consistent(priv(dev)->hw_dev,
1917						    sizeof(struct plx_dma_desc)
1918						    * AO_DMA_RING_COUNT,
1919						    priv(dev)->ao_dma_desc,
1920						    priv(dev)->
1921						    ao_dma_desc_bus_addr);
1922			if (priv(dev)->main_phys_iobase)
1923				comedi_pci_disable(priv(dev)->hw_dev);
1924
1925			pci_dev_put(priv(dev)->hw_dev);
1926		}
1927	}
1928	if (dev->subdevices)
1929		subdev_8255_cleanup(dev, dev->subdevices + 4);
1930
1931	return 0;
1932}
1933
1934static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1935		    struct comedi_insn *insn, unsigned int *data)
1936{
1937	unsigned int bits = 0, n, i;
1938	unsigned int channel, range, aref;
1939	unsigned long flags;
1940	static const int timeout = 100;
1941
1942	DEBUG_PRINT("chanspec 0x%x\n", insn->chanspec);
1943	channel = CR_CHAN(insn->chanspec);
1944	range = CR_RANGE(insn->chanspec);
1945	aref = CR_AREF(insn->chanspec);
1946
1947	/*  disable card's analog input interrupt sources and pacing */
1948	/*  4020 generates dac done interrupts even though they are disabled */
1949	disable_ai_pacing(dev);
1950
1951	spin_lock_irqsave(&dev->spinlock, flags);
1952	if (insn->chanspec & CR_ALT_FILTER)
1953		priv(dev)->adc_control1_bits |= ADC_DITHER_BIT;
1954	else
1955		priv(dev)->adc_control1_bits &= ~ADC_DITHER_BIT;
1956	writew(priv(dev)->adc_control1_bits,
1957	       priv(dev)->main_iobase + ADC_CONTROL1_REG);
1958	spin_unlock_irqrestore(&dev->spinlock, flags);
1959
1960	if (board(dev)->layout != LAYOUT_4020) {
1961		/*  use internal queue */
1962		priv(dev)->hw_config_bits &= ~EXT_QUEUE_BIT;
1963		writew(priv(dev)->hw_config_bits,
1964		       priv(dev)->main_iobase + HW_CONFIG_REG);
1965
1966		/*  ALT_SOURCE is internal calibration reference */
1967		if (insn->chanspec & CR_ALT_SOURCE) {
1968			unsigned int cal_en_bit;
1969
1970			DEBUG_PRINT("reading calibration source\n");
1971			if (board(dev)->layout == LAYOUT_60XX)
1972				cal_en_bit = CAL_EN_60XX_BIT;
1973			else
1974				cal_en_bit = CAL_EN_64XX_BIT;
1975			/*  select internal reference source to connect to channel 0 */
1976			writew(cal_en_bit |
1977			       adc_src_bits(priv(dev)->calibration_source),
1978			       priv(dev)->main_iobase + CALIBRATION_REG);
1979		} else {
1980			/*  make sure internal calibration source is turned off */
1981			writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
1982		}
1983		/*  load internal queue */
1984		bits = 0;
1985		/*  set gain */
1986		bits |= ai_range_bits_6xxx(dev, CR_RANGE(insn->chanspec));
1987		/*  set single-ended / differential */
1988		bits |= se_diff_bit_6xxx(dev, aref == AREF_DIFF);
1989		if (aref == AREF_COMMON)
1990			bits |= ADC_COMMON_BIT;
1991		bits |= adc_chan_bits(channel);
1992		/*  set stop channel */
1993		writew(adc_chan_bits(channel),
1994		       priv(dev)->main_iobase + ADC_QUEUE_HIGH_REG);
1995		/*  set start channel, and rest of settings */
1996		writew(bits, priv(dev)->main_iobase + ADC_QUEUE_LOAD_REG);
1997	} else {
1998		uint8_t old_cal_range_bits = priv(dev)->i2c_cal_range_bits;
1999
2000		priv(dev)->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
2001		if (insn->chanspec & CR_ALT_SOURCE) {
2002			DEBUG_PRINT("reading calibration source\n");
2003			priv(dev)->i2c_cal_range_bits |=
2004			    adc_src_4020_bits(priv(dev)->calibration_source);
2005		} else {	/* select BNC inputs */
2006			priv(dev)->i2c_cal_range_bits |= adc_src_4020_bits(4);
2007		}
2008		/*  select range */
2009		if (range == 0)
2010			priv(dev)->i2c_cal_range_bits |= attenuate_bit(channel);
2011		else
2012			priv(dev)->i2c_cal_range_bits &=
2013			    ~attenuate_bit(channel);
2014		/*  update calibration/range i2c register only if necessary, as it is very slow */
2015		if (old_cal_range_bits != priv(dev)->i2c_cal_range_bits) {
2016			uint8_t i2c_data = priv(dev)->i2c_cal_range_bits;
2017			i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
2018				  sizeof(i2c_data));
2019		}
2020
2021		/* 4020 manual asks that sample interval register to be set before writing to convert register.
2022		 * Using somewhat arbitrary setting of 4 master clock ticks = 0.1 usec */
2023		writew(0,
2024		       priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
2025		writew(2,
2026		       priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
2027	}
2028
2029	for (n = 0; n < insn->n; n++) {
2030
2031		/*  clear adc buffer (inside loop for 4020 sake) */
2032		writew(0, priv(dev)->main_iobase + ADC_BUFFER_CLEAR_REG);
2033
2034		/* trigger conversion, bits sent only matter for 4020 */
2035		writew(adc_convert_chan_4020_bits(CR_CHAN(insn->chanspec)),
2036		       priv(dev)->main_iobase + ADC_CONVERT_REG);
2037
2038		/*  wait for data */
2039		for (i = 0; i < timeout; i++) {
2040			bits = readw(priv(dev)->main_iobase + HW_STATUS_REG);
2041			DEBUG_PRINT(" pipe bits 0x%x\n", pipe_full_bits(bits));
2042			if (board(dev)->layout == LAYOUT_4020) {
2043				if (readw(priv(dev)->main_iobase +
2044					  ADC_WRITE_PNTR_REG))
2045					break;
2046			} else {
2047				if (pipe_full_bits(bits))
2048					break;
2049			}
2050			udelay(1);
2051		}
2052		DEBUG_PRINT(" looped %i times waiting for data\n", i);
2053		if (i == timeout) {
2054			comedi_error(dev, " analog input read insn timed out");
2055			printk(" status 0x%x\n", bits);
2056			return -ETIME;
2057		}
2058		if (board(dev)->layout == LAYOUT_4020)
2059			data[n] =
2060			    readl(priv(dev)->dio_counter_iobase +
2061				  ADC_FIFO_REG) & 0xffff;
2062		else
2063			data[n] =
2064			    readw(priv(dev)->main_iobase + PIPE1_READ_REG);
2065	}
2066
2067	return n;
2068}
2069
2070static int ai_config_calibration_source(struct comedi_device *dev,
2071					unsigned int *data)
2072{
2073	unsigned int source = data[1];
2074	int num_calibration_sources;
2075
2076	if (board(dev)->layout == LAYOUT_60XX)
2077		num_calibration_sources = 16;
2078	else
2079		num_calibration_sources = 8;
2080	if (source >= num_calibration_sources) {
2081		printk("invalid calibration source: %i\n", source);
2082		return -EINVAL;
2083	}
2084
2085	DEBUG_PRINT("setting calibration source to %i\n", source);
2086	priv(dev)->calibration_source = source;
2087
2088	return 2;
2089}
2090
2091static int ai_config_block_size(struct comedi_device *dev, unsigned int *data)
2092{
2093	int fifo_size;
2094	const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
2095	unsigned int block_size, requested_block_size;
2096	int retval;
2097
2098	requested_block_size = data[1];
2099
2100	if (requested_block_size) {
2101		fifo_size =
2102		    requested_block_size * fifo->num_segments / bytes_in_sample;
2103
2104		retval = set_ai_fifo_size(dev, fifo_size);
2105		if (retval < 0)
2106			return retval;
2107
2108	}
2109
2110	block_size = ai_fifo_size(dev) / fifo->num_segments * bytes_in_sample;
2111
2112	data[1] = block_size;
2113
2114	return 2;
2115}
2116
2117static int ai_config_master_clock_4020(struct comedi_device *dev,
2118				       unsigned int *data)
2119{
2120	unsigned int divisor = data[4];
2121	int retval = 0;
2122
2123	if (divisor < 2) {
2124		divisor = 2;
2125		retval = -EAGAIN;
2126	}
2127
2128	switch (data[1]) {
2129	case COMEDI_EV_SCAN_BEGIN:
2130		priv(dev)->ext_clock.divisor = divisor;
2131		priv(dev)->ext_clock.chanspec = data[2];
2132		break;
2133	default:
2134		return -EINVAL;
2135		break;
2136	}
2137
2138	data[4] = divisor;
2139
2140	return retval ? retval : 5;
2141}
2142
2143/* XXX could add support for 60xx series */
2144static int ai_config_master_clock(struct comedi_device *dev, unsigned int *data)
2145{
2146
2147	switch (board(dev)->layout) {
2148	case LAYOUT_4020:
2149		return ai_config_master_clock_4020(dev, data);
2150		break;
2151	default:
2152		return -EINVAL;
2153		break;
2154	}
2155
2156	return -EINVAL;
2157}
2158
2159static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
2160			  struct comedi_insn *insn, unsigned int *data)
2161{
2162	int id = data[0];
2163
2164	switch (id) {
2165	case INSN_CONFIG_ALT_SOURCE:
2166		return ai_config_calibration_source(dev, data);
2167		break;
2168	case INSN_CONFIG_BLOCK_SIZE:
2169		return ai_config_block_size(dev, data);
2170		break;
2171	case INSN_CONFIG_TIMER_1:
2172		return ai_config_master_clock(dev, data);
2173		break;
2174	default:
2175		return -EINVAL;
2176		break;
2177	}
2178	return -EINVAL;
2179}
2180
2181static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
2182		      struct comedi_cmd *cmd)
2183{
2184	int err = 0;
2185	int tmp;
2186	unsigned int tmp_arg, tmp_arg2;
2187	int i;
2188	int aref;
2189	unsigned int triggers;
2190
2191	/* step 1: make sure trigger sources are trivially valid */
2192
2193	tmp = cmd->start_src;
2194	cmd->start_src &= TRIG_NOW | TRIG_EXT;
2195	if (!cmd->start_src || tmp != cmd->start_src)
2196		err++;
2197
2198	tmp = cmd->scan_begin_src;
2199	triggers = TRIG_TIMER;
2200	if (board(dev)->layout == LAYOUT_4020)
2201		triggers |= TRIG_OTHER;
2202	else
2203		triggers |= TRIG_FOLLOW;
2204	cmd->scan_begin_src &= triggers;
2205	if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
2206		err++;
2207
2208	tmp = cmd->convert_src;
2209	triggers = TRIG_TIMER;
2210	if (board(dev)->layout == LAYOUT_4020)
2211		triggers |= TRIG_NOW;
2212	else
2213		triggers |= TRIG_EXT;
2214	cmd->convert_src &= triggers;
2215	if (!cmd->convert_src || tmp != cmd->convert_src)
2216		err++;
2217
2218	tmp = cmd->scan_end_src;
2219	cmd->scan_end_src &= TRIG_COUNT;
2220	if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
2221		err++;
2222
2223	tmp = cmd->stop_src;
2224	cmd->stop_src &= TRIG_COUNT | TRIG_EXT | TRIG_NONE;
2225	if (!cmd->stop_src || tmp != cmd->stop_src)
2226		err++;
2227
2228	if (err)
2229		return 1;
2230
2231	/* step 2: make sure trigger sources are unique and mutually compatible */
2232
2233	/*  uniqueness check */
2234	if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT)
2235		err++;
2236	if (cmd->scan_begin_src != TRIG_TIMER &&
2237	    cmd->scan_begin_src != TRIG_OTHER &&
2238	    cmd->scan_begin_src != TRIG_FOLLOW)
2239		err++;
2240	if (cmd->convert_src != TRIG_TIMER &&
2241	    cmd->convert_src != TRIG_EXT && cmd->convert_src != TRIG_NOW)
2242		err++;
2243	if (cmd->stop_src != TRIG_COUNT &&
2244	    cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
2245		err++;
2246
2247	/*  compatibility check */
2248	if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
2249		err++;
2250	if (cmd->stop_src != TRIG_COUNT &&
2251	    cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
2252		err++;
2253
2254	if (err)
2255		return 2;
2256
2257	/* step 3: make sure arguments are trivially compatible */
2258
2259	if (cmd->convert_src == TRIG_TIMER) {
2260		if (board(dev)->layout == LAYOUT_4020) {
2261			if (cmd->convert_arg) {
2262				cmd->convert_arg = 0;
2263				err++;
2264			}
2265		} else {
2266			if (cmd->convert_arg < board(dev)->ai_speed) {
2267				cmd->convert_arg = board(dev)->ai_speed;
2268				err++;
2269			}
2270			if (cmd->scan_begin_src == TRIG_TIMER) {
2271				/*  if scans are timed faster than conversion rate allows */
2272				if (cmd->convert_arg * cmd->chanlist_len >
2273				    cmd->scan_begin_arg) {
2274					cmd->scan_begin_arg =
2275					    cmd->convert_arg *
2276					    cmd->chanlist_len;
2277					err++;
2278				}
2279			}
2280		}
2281	}
2282
2283	if (!cmd->chanlist_len) {
2284		cmd->chanlist_len = 1;
2285		err++;
2286	}
2287	if (cmd->scan_end_arg != cmd->chanlist_len) {
2288		cmd->scan_end_arg = cmd->chanlist_len;
2289		err++;
2290	}
2291
2292	switch (cmd->stop_src) {
2293	case TRIG_EXT:
2294		break;
2295	case TRIG_COUNT:
2296		if (!cmd->stop_arg) {
2297			cmd->stop_arg = 1;
2298			err++;
2299		}
2300		break;
2301	case TRIG_NONE:
2302		if (cmd->stop_arg != 0) {
2303			cmd->stop_arg = 0;
2304			err++;
2305		}
2306		break;
2307	default:
2308		break;
2309	}
2310
2311	if (err)
2312		return 3;
2313
2314	/* step 4: fix up any arguments */
2315
2316	if (cmd->convert_src == TRIG_TIMER) {
2317		tmp_arg = cmd->convert_arg;
2318		tmp_arg2 = cmd->scan_begin_arg;
2319		check_adc_timing(dev, cmd);
2320		if (tmp_arg != cmd->convert_arg)
2321			err++;
2322		if (tmp_arg2 != cmd->scan_begin_arg)
2323			err++;
2324	}
2325
2326	if (err)
2327		return 4;
2328
2329	/*  make sure user is doesn't change analog reference mid chanlist */
2330	if (cmd->chanlist) {
2331		aref = CR_AREF(cmd->chanlist[0]);
2332		for (i = 1; i < cmd->chanlist_len; i++) {
2333			if (aref != CR_AREF(cmd->chanlist[i])) {
2334				comedi_error(dev,
2335					     "all elements in chanlist must use the same analog reference");
2336				err++;
2337				break;
2338			}
2339		}
2340		/*  check 4020 chanlist */
2341		if (board(dev)->layout == LAYOUT_4020) {
2342			unsigned int first_channel = CR_CHAN(cmd->chanlist[0]);
2343			for (i = 1; i < cmd->chanlist_len; i++) {
2344				if (CR_CHAN(cmd->chanlist[i]) !=
2345				    first_channel + i) {
2346					comedi_error(dev,
2347						     "chanlist must use consecutive channels");
2348					err++;
2349					break;
2350				}
2351			}
2352			if (cmd->chanlist_len == 3) {
2353				comedi_error(dev,
2354					     "chanlist cannot be 3 channels long, use 1, 2, or 4 channels");
2355				err++;
2356			}
2357		}
2358	}
2359
2360	if (err)
2361		return 5;
2362
2363	return 0;
2364}
2365
2366static int use_hw_sample_counter(struct comedi_cmd *cmd)
2367{
2368/* disable for now until I work out a race */
2369	return 0;
2370
2371	if (cmd->stop_src == TRIG_COUNT && cmd->stop_arg <= max_counter_value)
2372		return 1;
2373	else
2374		return 0;
2375}
2376
2377static void setup_sample_counters(struct comedi_device *dev,
2378				  struct comedi_cmd *cmd)
2379{
2380	if (cmd->stop_src == TRIG_COUNT) {
2381		/*  set software count */
2382		priv(dev)->ai_count = cmd->stop_arg * cmd->chanlist_len;
2383	}
2384	/*  load hardware conversion counter */
2385	if (use_hw_sample_counter(cmd)) {
2386		writew(cmd->stop_arg & 0xffff,
2387		       priv(dev)->main_iobase + ADC_COUNT_LOWER_REG);
2388		writew((cmd->stop_arg >> 16) & 0xff,
2389		       priv(dev)->main_iobase + ADC_COUNT_UPPER_REG);
2390	} else {
2391		writew(1, priv(dev)->main_iobase + ADC_COUNT_LOWER_REG);
2392	}
2393}
2394
2395static inline unsigned int dma_transfer_size(struct comedi_device *dev)
2396{
2397	unsigned int num_samples;
2398
2399	num_samples =
2400	    priv(dev)->ai_fifo_segment_length *
2401	    board(dev)->ai_fifo->sample_packing_ratio;
2402	if (num_samples > DMA_BUFFER_SIZE / sizeof(uint16_t))
2403		num_samples = DMA_BUFFER_SIZE / sizeof(uint16_t);
2404
2405	return num_samples;
2406}
2407
2408static void disable_ai_pacing(struct comedi_device *dev)
2409{
2410	unsigned long flags;
2411
2412	disable_ai_interrupts(dev);
2413
2414	spin_lock_irqsave(&dev->spinlock, flags);
2415	priv(dev)->adc_control1_bits &= ~ADC_SW_GATE_BIT;
2416	writew(priv(dev)->adc_control1_bits,
2417	       priv(dev)->main_iobase + ADC_CONTROL1_REG);
2418	spin_unlock_irqrestore(&dev->spinlock, flags);
2419
2420	/* disable pacing, triggering, etc */
2421	writew(ADC_DMA_DISABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT,
2422	       priv(dev)->main_iobase + ADC_CONTROL0_REG);
2423}
2424
2425static void disable_ai_interrupts(struct comedi_device *dev)
2426{
2427	unsigned long flags;
2428
2429	spin_lock_irqsave(&dev->spinlock, flags);
2430	priv(dev)->intr_enable_bits &=
2431	    ~EN_ADC_INTR_SRC_BIT & ~EN_ADC_DONE_INTR_BIT &
2432	    ~EN_ADC_ACTIVE_INTR_BIT & ~EN_ADC_STOP_INTR_BIT &
2433	    ~EN_ADC_OVERRUN_BIT & ~ADC_INTR_SRC_MASK;
2434	writew(priv(dev)->intr_enable_bits,
2435	       priv(dev)->main_iobase + INTR_ENABLE_REG);
2436	spin_unlock_irqrestore(&dev->spinlock, flags);
2437
2438	DEBUG_PRINT("intr enable bits 0x%x\n", priv(dev)->intr_enable_bits);
2439}
2440
2441static void enable_ai_interrupts(struct comedi_device *dev,
2442				 const struct comedi_cmd *cmd)
2443{
2444	uint32_t bits;
2445	unsigned long flags;
2446
2447	bits = EN_ADC_OVERRUN_BIT | EN_ADC_DONE_INTR_BIT |
2448	    EN_ADC_ACTIVE_INTR_BIT | EN_ADC_STOP_INTR_BIT;
2449	/*  Use pio transfer and interrupt on end of conversion if TRIG_WAKE_EOS flag is set. */
2450	if (cmd->flags & TRIG_WAKE_EOS) {
2451		/*  4020 doesn't support pio transfers except for fifo dregs */
2452		if (board(dev)->layout != LAYOUT_4020)
2453			bits |= ADC_INTR_EOSCAN_BITS | EN_ADC_INTR_SRC_BIT;
2454	}
2455	spin_lock_irqsave(&dev->spinlock, flags);
2456	priv(dev)->intr_enable_bits |= bits;
2457	writew(priv(dev)->intr_enable_bits,
2458	       priv(dev)->main_iobase + INTR_ENABLE_REG);
2459	DEBUG_PRINT("intr enable bits 0x%x\n", priv(dev)->intr_enable_bits);
2460	spin_unlock_irqrestore(&dev->spinlock, flags);
2461}
2462
2463static uint32_t ai_convert_counter_6xxx(const struct comedi_device *dev,
2464					const struct comedi_cmd *cmd)
2465{
2466	/*  supposed to load counter with desired divisor minus 3 */
2467	return cmd->convert_arg / TIMER_BASE - 3;
2468}
2469
2470static uint32_t ai_scan_counter_6xxx(struct comedi_device *dev,
2471				     struct comedi_cmd *cmd)
2472{
2473	uint32_t count;
2474	/*  figure out how long we need to delay at end of scan */
2475	switch (cmd->scan_begin_src) {
2476	case TRIG_TIMER:
2477		count = (cmd->scan_begin_arg -
2478			 (cmd->convert_arg * (cmd->chanlist_len - 1)))
2479		    / TIMER_BASE;
2480		break;
2481	case TRIG_FOLLOW:
2482		count = cmd->convert_arg / TIMER_BASE;
2483		break;
2484	default:
2485		return 0;
2486		break;
2487	}
2488	return count - 3;
2489}
2490
2491static uint32_t ai_convert_counter_4020(struct comedi_device *dev,
2492					struct comedi_cmd *cmd)
2493{
2494	unsigned int divisor;
2495
2496	switch (cmd->scan_begin_src) {
2497	case TRIG_TIMER:
2498		divisor = cmd->scan_begin_arg / TIMER_BASE;
2499		break;
2500	case TRIG_OTHER:
2501		divisor = priv(dev)->ext_clock.divisor;
2502		break;
2503	default:		/*  should never happen */
2504		comedi_error(dev, "bug! failed to set ai pacing!");
2505		divisor = 1000;
2506		break;
2507	}
2508
2509	/*  supposed to load counter with desired divisor minus 2 for 4020 */
2510	return divisor - 2;
2511}
2512
2513static void select_master_clock_4020(struct comedi_device *dev,
2514				     const struct comedi_cmd *cmd)
2515{
2516	/*  select internal/external master clock */
2517	priv(dev)->hw_config_bits &= ~MASTER_CLOCK_4020_MASK;
2518	if (cmd->scan_begin_src == TRIG_OTHER) {
2519		int chanspec = priv(dev)->ext_clock.chanspec;
2520
2521		if (CR_CHAN(chanspec))
2522			priv(dev)->hw_config_bits |= BNC_CLOCK_4020_BITS;
2523		else
2524			priv(dev)->hw_config_bits |= EXT_CLOCK_4020_BITS;
2525	} else {
2526		priv(dev)->hw_config_bits |= INTERNAL_CLOCK_4020_BITS;
2527	}
2528	writew(priv(dev)->hw_config_bits,
2529	       priv(dev)->main_iobase + HW_CONFIG_REG);
2530}
2531
2532static void select_master_clock(struct comedi_device *dev,
2533				const struct comedi_cmd *cmd)
2534{
2535	switch (board(dev)->layout) {
2536	case LAYOUT_4020:
2537		select_master_clock_4020(dev, cmd);
2538		break;
2539	default:
2540		break;
2541	}
2542}
2543
2544static inline void dma_start_sync(struct comedi_device *dev,
2545				  unsigned int channel)
2546{
2547	unsigned long flags;
2548
2549	/*  spinlock for plx dma control/status reg */
2550	spin_lock_irqsave(&dev->spinlock, flags);
2551	if (channel)
2552		writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2553		       PLX_CLEAR_DMA_INTR_BIT,
2554		       priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG);
2555	else
2556		writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2557		       PLX_CLEAR_DMA_INTR_BIT,
2558		       priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
2559	spin_unlock_irqrestore(&dev->spinlock, flags);
2560}
2561
2562static void set_ai_pacing(struct comedi_device *dev, struct comedi_cmd *cmd)
2563{
2564	uint32_t convert_counter = 0, scan_counter = 0;
2565
2566	check_adc_timing(dev, cmd);
2567
2568	select_master_clock(dev, cmd);
2569
2570	if (board(dev)->layout == LAYOUT_4020) {
2571		convert_counter = ai_convert_counter_4020(dev, cmd);
2572	} else {
2573		convert_counter = ai_convert_counter_6xxx(dev, cmd);
2574		scan_counter = ai_scan_counter_6xxx(dev, cmd);
2575	}
2576
2577	/*  load lower 16 bits of convert interval */
2578	writew(convert_counter & 0xffff,
2579	       priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
2580	DEBUG_PRINT("convert counter 0x%x\n", convert_counter);
2581	/*  load upper 8 bits of convert interval */
2582	writew((convert_counter >> 16) & 0xff,
2583	       priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
2584	/*  load lower 16 bits of scan delay */
2585	writew(scan_counter & 0xffff,
2586	       priv(dev)->main_iobase + ADC_DELAY_INTERVAL_LOWER_REG);
2587	/*  load upper 8 bits of scan delay */
2588	writew((scan_counter >> 16) & 0xff,
2589	       priv(dev)->main_iobase + ADC_DELAY_INTERVAL_UPPER_REG);
2590	DEBUG_PRINT("scan counter 0x%x\n", scan_counter);
2591}
2592
2593static int use_internal_queue_6xxx(const struct comedi_cmd *cmd)
2594{
2595	int i;
2596	for (i = 0; i + 1 < cmd->chanlist_len; i++) {
2597		if (CR_CHAN(cmd->chanlist[i + 1]) !=
2598		    CR_CHAN(cmd->chanlist[i]) + 1)
2599			return 0;
2600		if (CR_RANGE(cmd->chanlist[i + 1]) !=
2601		    CR_RANGE(cmd->chanlist[i]))
2602			return 0;
2603		if (CR_AREF(cmd->chanlist[i + 1]) != CR_AREF(cmd->chanlist[i]))
2604			return 0;
2605	}
2606	return 1;
2607}
2608
2609static int setup_channel_queue(struct comedi_device *dev,
2610			       const struct comedi_cmd *cmd)
2611{
2612	unsigned short bits;
2613	int i;
2614
2615	if (board(dev)->layout != LAYOUT_4020) {
2616		if (use_internal_queue_6xxx(cmd)) {
2617			priv(dev)->hw_config_bits &= ~EXT_QUEUE_BIT;
2618			writew(priv(dev)->hw_config_bits,
2619			       priv(dev)->main_iobase + HW_CONFIG_REG);
2620			bits = 0;
2621			/*  set channel */
2622			bits |= adc_chan_bits(CR_CHAN(cmd->chanlist[0]));
2623			/*  set gain */
2624			bits |= ai_range_bits_6xxx(dev,
2625						   CR_RANGE(cmd->chanlist[0]));
2626			/*  set single-ended / differential */
2627			bits |= se_diff_bit_6xxx(dev,
2628						 CR_AREF(cmd->chanlist[0]) ==
2629						 AREF_DIFF);
2630			if (CR_AREF(cmd->chanlist[0]) == AREF_COMMON)
2631				bits |= ADC_COMMON_BIT;
2632			/*  set stop channel */
2633			writew(adc_chan_bits
2634			       (CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1])),
2635			       priv(dev)->main_iobase + ADC_QUEUE_HIGH_REG);
2636			/*  set start channel, and rest of settings */
2637			writew(bits,
2638			       priv(dev)->main_iobase + ADC_QUEUE_LOAD_REG);
2639		} else {
2640			/*  use external queue */
2641			if (dev->write_subdev && dev->write_subdev->busy) {
2642				warn_external_queue(dev);
2643				return -EBUSY;
2644			}
2645			priv(dev)->hw_config_bits |= EXT_QUEUE_BIT;
2646			writew(priv(dev)->hw_config_bits,
2647			       priv(dev)->main_iobase + HW_CONFIG_REG);
2648			/*  clear DAC buffer to prevent weird interactions */
2649			writew(0,
2650			       priv(dev)->main_iobase + DAC_BUFFER_CLEAR_REG);
2651			/*  clear queue pointer */
2652			writew(0, priv(dev)->main_iobase + ADC_QUEUE_CLEAR_REG);
2653			/*  load external queue */
2654			for (i = 0; i < cmd->chanlist_len; i++) {
2655				bits = 0;
2656				/*  set channel */
2657				bits |=
2658				    adc_chan_bits(CR_CHAN(cmd->chanlist[i]));
2659				/*  set gain */
2660				bits |= ai_range_bits_6xxx(dev,
2661							   CR_RANGE(cmd->
2662								    chanlist
2663								    [i]));
2664				/*  set single-ended / differential */
2665				bits |= se_diff_bit_6xxx(dev,
2666							 CR_AREF(cmd->
2667								 chanlist[i]) ==
2668							 AREF_DIFF);
2669				if (CR_AREF(cmd->chanlist[i]) == AREF_COMMON)
2670					bits |= ADC_COMMON_BIT;
2671				/*  mark end of queue */
2672				if (i == cmd->chanlist_len - 1)
2673					bits |= QUEUE_EOSCAN_BIT |
2674					    QUEUE_EOSEQ_BIT;
2675				writew(bits,
2676				       priv(dev)->main_iobase +
2677				       ADC_QUEUE_FIFO_REG);
2678				DEBUG_PRINT
2679				    ("wrote 0x%x to external channel queue\n",
2680				     bits);
2681			}
2682			/* doing a queue clear is not specified in board docs,
2683			 * but required for reliable operation */
2684			writew(0, priv(dev)->main_iobase + ADC_QUEUE_CLEAR_REG);
2685			/*  prime queue holding register */
2686			writew(0, priv(dev)->main_iobase + ADC_QUEUE_LOAD_REG);
2687		}
2688	} else {
2689		unsigned short old_cal_range_bits =
2690		    priv(dev)->i2c_cal_range_bits;
2691
2692		priv(dev)->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
2693		/* select BNC inputs */
2694		priv(dev)->i2c_cal_range_bits |= adc_src_4020_bits(4);
2695		/*  select ranges */
2696		for (i = 0; i < cmd->chanlist_len; i++) {
2697			unsigned int channel = CR_CHAN(cmd->chanlist[i]);
2698			unsigned int range = CR_RANGE(cmd->chanlist[i]);
2699
2700			if (range == 0)
2701				priv(dev)->i2c_cal_range_bits |=
2702				    attenuate_bit(channel);
2703			else
2704				priv(dev)->i2c_cal_range_bits &=
2705				    ~attenuate_bit(channel);
2706		}
2707		/*  update calibration/range i2c register only if necessary, as it is very slow */
2708		if (old_cal_range_bits != priv(dev)->i2c_cal_range_bits) {
2709			uint8_t i2c_data = priv(dev)->i2c_cal_range_bits;
2710			i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
2711				  sizeof(i2c_data));
2712		}
2713	}
2714	return 0;
2715}
2716
2717static inline void load_first_dma_descriptor(struct comedi_device *dev,
2718					     unsigned int dma_channel,
2719					     unsigned int descriptor_bits)
2720{
2721	/* The transfer size, pci address, and local address registers
2722	 * are supposedly unused during chained dma,
2723	 * but I have found that left over values from last operation
2724	 * occasionally cause problems with transfer of first dma
2725	 * block.  Initializing them to zero seems to fix the problem. */
2726	if (dma_channel) {
2727		writel(0,
2728		       priv(dev)->plx9080_iobase + PLX_DMA1_TRANSFER_SIZE_REG);
2729		writel(0, priv(dev)->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG);
2730		writel(0,
2731		       priv(dev)->plx9080_iobase + PLX_DMA1_LOCAL_ADDRESS_REG);
2732		writel(descriptor_bits,
2733		       priv(dev)->plx9080_iobase + PLX_DMA1_DESCRIPTOR_REG);
2734	} else {
2735		writel(0,
2736		       priv(dev)->plx9080_iobase + PLX_DMA0_TRANSFER_SIZE_REG);
2737		writel(0, priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
2738		writel(0,
2739		       priv(dev)->plx9080_iobase + PLX_DMA0_LOCAL_ADDRESS_REG);
2740		writel(descriptor_bits,
2741		       priv(dev)->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
2742	}
2743}
2744
2745static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
2746{
2747	struct comedi_async *async = s->async;
2748	struct comedi_cmd *cmd = &async->cmd;
2749	uint32_t bits;
2750	unsigned int i;
2751	unsigned long flags;
2752	int retval;
2753
2754	disable_ai_pacing(dev);
2755	abort_dma(dev, 1);
2756
2757	retval = setup_channel_queue(dev, cmd);
2758	if (retval < 0)
2759		return retval;
2760
2761	/*  make sure internal calibration source is turned off */
2762	writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
2763
2764	set_ai_pacing(dev, cmd);
2765
2766	setup_sample_counters(dev, cmd);
2767
2768	enable_ai_interrupts(dev, cmd);
2769
2770	spin_lock_irqsave(&dev->spinlock, flags);
2771	/* set mode, allow conversions through software gate */
2772	priv(dev)->adc_control1_bits |= ADC_SW_GATE_BIT;
2773	priv(dev)->adc_control1_bits &= ~ADC_DITHER_BIT;
2774	if (board(dev)->layout != LAYOUT_4020) {
2775		priv(dev)->adc_control1_bits &= ~ADC_MODE_MASK;
2776		if (cmd->convert_src == TRIG_EXT)
2777			priv(dev)->adc_control1_bits |= adc_mode_bits(13);	/*  good old mode 13 */
2778		else
2779			priv(dev)->adc_control1_bits |= adc_mode_bits(8);	/*  mode 8.  What else could you need? */
2780	} else {
2781		priv(dev)->adc_control1_bits &= ~CHANNEL_MODE_4020_MASK;
2782		if (cmd->chanlist_len == 4)
2783			priv(dev)->adc_control1_bits |= FOUR_CHANNEL_4020_BITS;
2784		else if (cmd->chanlist_len == 2)
2785			priv(dev)->adc_control1_bits |= TWO_CHANNEL_4020_BITS;
2786		priv(dev)->adc_control1_bits &= ~ADC_LO_CHANNEL_4020_MASK;
2787		priv(dev)->adc_control1_bits |=
2788		    adc_lo_chan_4020_bits(CR_CHAN(cmd->chanlist[0]));
2789		priv(dev)->adc_control1_bits &= ~ADC_HI_CHANNEL_4020_MASK;
2790		priv(dev)->adc_control1_bits |=
2791		    adc_hi_chan_4020_bits(CR_CHAN
2792					  (cmd->
2793					   chanlist[cmd->chanlist_len - 1]));
2794	}
2795	writew(priv(dev)->adc_control1_bits,
2796	       priv(dev)->main_iobase + ADC_CONTROL1_REG);
2797	DEBUG_PRINT("control1 bits 0x%x\n", priv(dev)->adc_control1_bits);
2798	spin_unlock_irqrestore(&dev->spinlock, flags);
2799
2800	/*  clear adc buffer */
2801	writew(0, priv(dev)->main_iobase + ADC_BUFFER_CLEAR_REG);
2802
2803	if ((cmd->flags & TRIG_WAKE_EOS) == 0 ||
2804	    board(dev)->layout == LAYOUT_4020) {
2805		priv(dev)->ai_dma_index = 0;
2806
2807		/*  set dma transfer size */
2808		for (i = 0; i < ai_dma_ring_count(board(dev)); i++)
2809			priv(dev)->ai_dma_desc[i].transfer_size =
2810			    cpu_to_le32(dma_transfer_size(dev) *
2811					sizeof(uint16_t));
2812
2813		/*  give location of first dma descriptor */
2814		load_first_dma_descriptor(dev, 1,
2815					  priv(dev)->ai_dma_desc_bus_addr |
2816					  PLX_DESC_IN_PCI_BIT |
2817					  PLX_INTR_TERM_COUNT |
2818					  PLX_XFER_LOCAL_TO_PCI);
2819
2820		dma_start_sync(dev, 1);
2821	}
2822
2823	if (board(dev)->layout == LAYOUT_4020) {
2824		/* set source for external triggers */
2825		bits = 0;
2826		if (cmd->start_src == TRIG_EXT && CR_CHAN(cmd->start_arg))
2827			bits |= EXT_START_TRIG_BNC_BIT;
2828		if (cmd->stop_src == TRIG_EXT && CR_CHAN(cmd->stop_arg))
2829			bits |= EXT_STOP_TRIG_BNC_BIT;
2830		writew(bits, priv(dev)->main_iobase + DAQ_ATRIG_LOW_4020_REG);
2831	}
2832
2833	spin_lock_irqsave(&dev->spinlock, flags);
2834
2835	/* enable pacing, triggering, etc */
2836	bits = ADC_ENABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT;
2837	if (cmd->flags & TRIG_WAKE_EOS)
2838		bits |= ADC_DMA_DISABLE_BIT;
2839	/*  set start trigger */
2840	if (cmd->start_src == TRIG_EXT) {
2841		bits |= ADC_START_TRIG_EXT_BITS;
2842		if (cmd->start_arg & CR_INVERT)
2843			bits |= ADC_START_TRIG_FALLING_BIT;
2844	} else if (cmd->start_src == TRIG_NOW)
2845		bits |= ADC_START_TRIG_SOFT_BITS;
2846	if (use_hw_sample_counter(cmd))
2847		bits |= ADC_SAMPLE_COUNTER_EN_BIT;
2848	writew(bits, priv(dev)->main_iobase + ADC_CONTROL0_REG);
2849	DEBUG_PRINT("control0 bits 0x%x\n", bits);
2850
2851	priv(dev)->ai_cmd_running = 1;
2852
2853	spin_unlock_irqrestore(&dev->spinlock, flags);
2854
2855	/*  start aquisition */
2856	if (cmd->start_src == TRIG_NOW) {
2857		writew(0, priv(dev)->main_iobase + ADC_START_REG);
2858		DEBUG_PRINT("soft trig\n");
2859	}
2860
2861	return 0;
2862}
2863
2864/* read num_samples from 16 bit wide ai fifo */
2865static void pio_drain_ai_fifo_16(struct comedi_device *dev)
2866{
2867	struct comedi_subdevice *s = dev->read_subdev;
2868	struct comedi_async *async = s->async;
2869	struct comedi_cmd *cmd = &async->cmd;
2870	unsigned int i;
2871	uint16_t prepost_bits;
2872	int read_segment, read_index, write_segment, write_index;
2873	int num_samples;
2874
2875	do {
2876		/*  get least significant 15 bits */
2877		read_index =
2878		    readw(priv(dev)->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2879		write_index =
2880		    readw(priv(dev)->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2881		/* Get most significant bits (grey code).  Different boards use different code
2882		 * so use a scheme that doesn't depend on encoding.  This read must
2883		 * occur after reading least significant 15 bits to avoid race
2884		 * with fifo switching to next segment. */
2885		prepost_bits = readw(priv(dev)->main_iobase + PREPOST_REG);
2886
2887		/* if read and write pointers are not on the same fifo segment, read to the
2888		 * end of the read segment */
2889		read_segment = adc_upper_read_ptr_code(prepost_bits);
2890		write_segment = adc_upper_write_ptr_code(prepost_bits);
2891
2892		DEBUG_PRINT(" rd seg %i, wrt seg %i, rd idx %i, wrt idx %i\n",
2893			    read_segment, write_segment, read_index,
2894			    write_index);
2895
2896		if (read_segment != write_segment)
2897			num_samples =
2898			    priv(dev)->ai_fifo_segment_length - read_index;
2899		else
2900			num_samples = write_index - read_index;
2901
2902		if (cmd->stop_src == TRIG_COUNT) {
2903			if (priv(dev)->ai_count == 0)
2904				break;
2905			if (num_samples > priv(dev)->ai_count)
2906				num_samples = priv(dev)->ai_count;
2907
2908			priv(dev)->ai_count -= num_samples;
2909		}
2910
2911		if (num_samples < 0) {
2912			printk(" cb_pcidas64: bug! num_samples < 0\n");
2913			break;
2914		}
2915
2916		DEBUG_PRINT(" read %i samples from fifo\n", num_samples);
2917
2918		for (i = 0; i < num_samples; i++) {
2919			cfc_write_to_buffer(s,
2920					    readw(priv(dev)->main_iobase +
2921						  ADC_FIFO_REG));
2922		}
2923
2924	} while (read_segment != write_segment);
2925}
2926
2927/* Read from 32 bit wide ai fifo of 4020 - deal with insane grey coding of pointers.
2928 * The pci-4020 hardware only supports
2929 * dma transfers (it only supports the use of pio for draining the last remaining
2930 * points from the fifo when a data aquisition operation has completed).
2931 */
2932static void pio_drain_ai_fifo_32(struct comedi_device *dev)
2933{
2934	struct comedi_subdevice *s = dev->read_subdev;
2935	struct comedi_async *async = s->async;
2936	struct comedi_cmd *cmd = &async->cmd;
2937	unsigned int i;
2938	unsigned int max_transfer = 100000;
2939	uint32_t fifo_data;
2940	int write_code =
2941	    readw(priv(dev)->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2942	int read_code =
2943	    readw(priv(dev)->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2944
2945	if (cmd->stop_src == TRIG_COUNT) {
2946		if (max_transfer > priv(dev)->ai_count)
2947			max_transfer = priv(dev)->ai_count;
2948
2949	}
2950	for (i = 0; read_code != write_code && i < max_transfer;) {
2951		fifo_data = readl(priv(dev)->dio_counter_iobase + ADC_FIFO_REG);
2952		cfc_write_to_buffer(s, fifo_data & 0xffff);
2953		i++;
2954		if (i < max_transfer) {
2955			cfc_write_to_buffer(s, (fifo_data >> 16) & 0xffff);
2956			i++;
2957		}
2958		read_code =
2959		    readw(priv(dev)->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2960	}
2961	priv(dev)->ai_count -= i;
2962}
2963
2964/* empty fifo */
2965static void pio_drain_ai_fifo(struct comedi_device *dev)
2966{
2967	if (board(dev)->layout == LAYOUT_4020)
2968		pio_drain_ai_fifo_32(dev);
2969	else
2970		pio_drain_ai_fifo_16(dev);
2971}
2972
2973static void drain_dma_buffers(struct comedi_device *dev, unsigned int channel)
2974{
2975	struct comedi_async *async = dev->read_subdev->async;
2976	uint32_t next_transfer_addr;
2977	int j;
2978	int num_samples = 0;
2979	void *pci_addr_reg;
2980
2981	if (channel)
2982		pci_addr_reg =
2983		    priv(dev)->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG;
2984	else
2985		pci_addr_reg =
2986		    priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
2987
2988	/*  loop until we have read all the full buffers */
2989	for (j = 0, next_transfer_addr = readl(pci_addr_reg);
2990	     (next_transfer_addr <
2991	      priv(dev)->ai_buffer_bus_addr[priv(dev)->ai_dma_index]
2992	      || next_transfer_addr >=
2993	      priv(dev)->ai_buffer_bus_addr[priv(dev)->ai_dma_index] +
2994	      DMA_BUFFER_SIZE) && j < ai_dma_ring_count(board(dev)); j++) {
2995		/*  transfer data from dma buffer to comedi buffer */
2996		num_samples = dma_transfer_size(dev);
2997		if (async->cmd.stop_src == TRIG_COUNT) {
2998			if (num_samples > priv(dev)->ai_count)
2999				num_samples = priv(dev)->ai_count;
3000			priv(dev)->ai_count -= num_samples;
3001		}
3002		cfc_write_array_to_buffer(dev->read_subdev,
3003					  priv(dev)->ai_buffer[priv(dev)->
3004							       ai_dma_index],
3005					  num_samples * sizeof(uint16_t));
3006		priv(dev)->ai_dma_index =
3007		    (priv(dev)->ai_dma_index +
3008		     1) % ai_dma_ring_count(board(dev));
3009
3010		DEBUG_PRINT("next buffer addr 0x%lx\n",
3011			    (unsigned long)priv(dev)->
3012			    ai_buffer_bus_addr[priv(dev)->ai_dma_index]);
3013		DEBUG_PRINT("pci addr reg 0x%x\n", next_transfer_addr);
3014	}
3015	/* XXX check for dma ring buffer overrun (use end-of-chain bit to mark last
3016	 * unused buffer) */
3017}
3018
3019void handle_ai_interrupt(struct comedi_device *dev, unsigned short status,
3020			 unsigned int plx_status)
3021{
3022	struct comedi_subdevice *s = dev->read_subdev;
3023	struct comedi_async *async = s->async;
3024	struct comedi_cmd *cmd = &async->cmd;
3025	uint8_t dma1_status;
3026	unsigned long flags;
3027
3028	/*  check for fifo overrun */
3029	if (status & ADC_OVERRUN_BIT) {
3030		comedi_error(dev, "fifo overrun");
3031		async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
3032	}
3033	/*  spin lock makes sure noone else changes plx dma control reg */
3034	spin_lock_irqsave(&dev->spinlock, flags);
3035	dma1_status = readb(priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG);
3036	if (plx_status & ICS_DMA1_A) {	/*  dma chan 1 interrupt */
3037		writeb((dma1_status & PLX_DMA_EN_BIT) | PLX_CLEAR_DMA_INTR_BIT,
3038		       priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG);
3039		DEBUG_PRINT("dma1 status 0x%x\n", dma1_status);
3040
3041		if (dma1_status & PLX_DMA_EN_BIT)
3042			drain_dma_buffers(dev, 1);
3043
3044		DEBUG_PRINT(" cleared dma ch1 interrupt\n");
3045	}
3046	spin_unlock_irqrestore(&dev->spinlock, flags);
3047
3048	if (status & ADC_DONE_BIT)
3049		DEBUG_PRINT("adc done interrupt\n");
3050
3051	/*  drain fifo with pio */
3052	if ((status & ADC_DONE_BIT) ||
3053	    ((cmd->flags & TRIG_WAKE_EOS) &&
3054	     (status & ADC_INTR_PENDING_BIT) &&
3055	     (board(dev)->layout != LAYOUT_4020))) {
3056		DEBUG_PRINT("pio fifo drain\n");
3057		spin_lock_irqsave(&dev->spinlock, flags);
3058		if (priv(dev)->ai_cmd_running) {
3059			spin_unlock_irqrestore(&dev->spinlock, flags);
3060			pio_drain_ai_fifo(dev);
3061		} else
3062			spin_unlock_irqrestore(&dev->spinlock, flags);
3063	}
3064	/*  if we are have all the data, then quit */
3065	if ((cmd->stop_src == TRIG_COUNT && priv(dev)->ai_count <= 0) ||
3066	    (cmd->stop_src == TRIG_EXT && (status & ADC_STOP_BIT))) {
3067		async->events |= COMEDI_CB_EOA;
3068	}
3069
3070	cfc_handle_events(dev, s);
3071}
3072
3073static inline unsigned int prev_ao_dma_index(struct comedi_device *dev)
3074{
3075	unsigned int buffer_index;
3076
3077	if (priv(dev)->ao_dma_index == 0)
3078		buffer_index = AO_DMA_RING_COUNT - 1;
3079	else
3080		buffer_index = priv(dev)->ao_dma_index - 1;
3081	return buffer_index;
3082}
3083
3084static int last_ao_dma_load_completed(struct comedi_device *dev)
3085{
3086	unsigned int buffer_index;
3087	unsigned int transfer_address;
3088	unsigned short dma_status;
3089
3090	buffer_index = prev_ao_dma_index(dev);
3091	dma_status = readb(priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3092	if ((dma_status & PLX_DMA_DONE_BIT) == 0)
3093		return 0;
3094
3095	transfer_address =
3096	    readl(priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
3097	if (transfer_address != priv(dev)->ao_buffer_bus_addr[buffer_index])
3098		return 0;
3099
3100	return 1;
3101}
3102
3103static int ao_stopped_by_error(struct comedi_device *dev,
3104			       const struct comedi_cmd *cmd)
3105{
3106	if (cmd->stop_src == TRIG_NONE)
3107		return 1;
3108	if (cmd->stop_src == TRIG_COUNT) {
3109		if (priv(dev)->ao_count)
3110			return 1;
3111		if (last_ao_dma_load_completed(dev) == 0)
3112			return 1;
3113	}
3114	return 0;
3115}
3116
3117static inline int ao_dma_needs_restart(struct comedi_device *dev,
3118				       unsigned short dma_status)
3119{
3120	if ((dma_status & PLX_DMA_DONE_BIT) == 0 ||
3121	    (dma_status & PLX_DMA_EN_BIT) == 0)
3122		return 0;
3123	if (last_ao_dma_load_completed(dev))
3124		return 0;
3125
3126	return 1;
3127}
3128
3129static void restart_ao_dma(struct comedi_device *dev)
3130{
3131	unsigned int dma_desc_bits;
3132
3133	dma_desc_bits =
3134	    readl(priv(dev)->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
3135	dma_desc_bits &= ~PLX_END_OF_CHAIN_BIT;
3136	DEBUG_PRINT("restarting ao dma, descriptor reg 0x%x\n", dma_desc_bits);
3137	load_first_dma_descriptor(dev, 0, dma_desc_bits);
3138
3139	dma_start_sync(dev, 0);
3140}
3141
3142static void handle_ao_interrupt(struct comedi_device *dev,
3143				unsigned short status, unsigned int plx_status)
3144{
3145	struct comedi_subdevice *s = dev->write_subdev;
3146	struct comedi_async *async;
3147	struct comedi_cmd *cmd;
3148	uint8_t dma0_status;
3149	unsigned long flags;
3150
3151	/* board might not support ao, in which case write_subdev is NULL */
3152	if (s == NULL)
3153		return;
3154	async = s->async;
3155	cmd = &async->cmd;
3156
3157	/*  spin lock makes sure noone else changes plx dma control reg */
3158	spin_lock_irqsave(&dev->spinlock, flags);
3159	dma0_status = readb(priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3160	if (plx_status & ICS_DMA0_A) {	/*  dma chan 0 interrupt */
3161		if ((dma0_status & PLX_DMA_EN_BIT)
3162		    && !(dma0_status & PLX_DMA_DONE_BIT))
3163			writeb(PLX_DMA_EN_BIT | PLX_CLEAR_DMA_INTR_BIT,
3164			       priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3165		else
3166			writeb(PLX_CLEAR_DMA_INTR_BIT,
3167			       priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3168		spin_unlock_irqrestore(&dev->spinlock, flags);
3169		DEBUG_PRINT("dma0 status 0x%x\n", dma0_status);
3170		if (dma0_status & PLX_DMA_EN_BIT) {
3171			load_ao_dma(dev, cmd);
3172			/* try to recover from dma end-of-chain event */
3173			if (ao_dma_needs_restart(dev, dma0_status))
3174				restart_ao_dma(dev);
3175		}
3176		DEBUG_PRINT(" cleared dma ch0 interrupt\n");
3177	} else
3178		spin_unlock_irqrestore(&dev->spinlock, flags);
3179
3180	if ((status & DAC_DONE_BIT)) {
3181		async->events |= COMEDI_CB_EOA;
3182		if (ao_stopped_by_error(dev, cmd))
3183			async->events |= COMEDI_CB_ERROR;
3184		DEBUG_PRINT("plx dma0 desc reg 0x%x\n",
3185			    readl(priv(dev)->plx9080_iobase +
3186				  PLX_DMA0_DESCRIPTOR_REG));
3187		DEBUG_PRINT("plx dma0 address reg 0x%x\n",
3188			    readl(priv(dev)->plx9080_iobase +
3189				  PLX_DMA0_PCI_ADDRESS_REG));
3190	}
3191	cfc_handle_events(dev, s);
3192}
3193
3194static irqreturn_t handle_interrupt(int irq, void *d)
3195{
3196	struct comedi_device *dev = d;
3197	unsigned short status;
3198	uint32_t plx_status;
3199	uint32_t plx_bits;
3200
3201	plx_status = readl(priv(dev)->plx9080_iobase + PLX_INTRCS_REG);
3202	status = readw(priv(dev)->main_iobase + HW_STATUS_REG);
3203
3204	DEBUG_PRINT("cb_pcidas64: hw status 0x%x ", status);
3205	DEBUG_PRINT("plx status 0x%x\n", plx_status);
3206
3207	/* an interrupt before all the postconfig stuff gets done could
3208	 * cause a NULL dereference if we continue through the
3209	 * interrupt handler */
3210	if (dev->attached == 0) {
3211		DEBUG_PRINT("cb_pcidas64: premature interrupt, ignoring",
3212			    status);
3213		return IRQ_HANDLED;
3214	}
3215	handle_ai_interrupt(dev, status, plx_status);
3216	handle_ao_interrupt(dev, status, plx_status);
3217
3218	/*  clear possible plx9080 interrupt sources */
3219	if (plx_status & ICS_LDIA) {	/*  clear local doorbell interrupt */
3220		plx_bits = readl(priv(dev)->plx9080_iobase + PLX_DBR_OUT_REG);
3221		writel(plx_bits, priv(dev)->plx9080_iobase + PLX_DBR_OUT_REG);
3222		DEBUG_PRINT(" cleared local doorbell bits 0x%x\n", plx_bits);
3223	}
3224
3225	DEBUG_PRINT("exiting handler\n");
3226
3227	return IRQ_HANDLED;
3228}
3229
3230void abort_dma(struct comedi_device *dev, unsigned int channel)
3231{
3232	unsigned long flags;
3233
3234	/*  spinlock for plx dma control/status reg */
3235	spin_lock_irqsave(&dev->spinlock, flags);
3236
3237	plx9080_abort_dma(priv(dev)->plx9080_iobase, channel);
3238
3239	spin_unlock_irqrestore(&dev->spinlock, flags);
3240}
3241
3242static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3243{
3244	unsigned long flags;
3245
3246	spin_lock_irqsave(&dev->spinlock, flags);
3247	if (priv(dev)->ai_cmd_running == 0) {
3248		spin_unlock_irqrestore(&dev->spinlock, flags);
3249		return 0;
3250	}
3251	priv(dev)->ai_cmd_running = 0;
3252	spin_unlock_irqrestore(&dev->spinlock, flags);
3253
3254	disable_ai_pacing(dev);
3255
3256	abort_dma(dev, 1);
3257
3258	DEBUG_PRINT("ai canceled\n");
3259	return 0;
3260}
3261
3262static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
3263		    struct comedi_insn *insn, unsigned int *data)
3264{
3265	int chan = CR_CHAN(insn->chanspec);
3266	int range = CR_RANGE(insn->chanspec);
3267
3268	/*  do some initializing */
3269	writew(0, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3270
3271	/*  set range */
3272	set_dac_range_bits(dev, &priv(dev)->dac_control1_bits, chan, range);
3273	writew(priv(dev)->dac_control1_bits,
3274	       priv(dev)->main_iobase + DAC_CONTROL1_REG);
3275
3276	/*  write to channel */
3277	if (board(dev)->layout == LAYOUT_4020) {
3278		writew(data[0] & 0xff,
3279		       priv(dev)->main_iobase + dac_lsb_4020_reg(chan));
3280		writew((data[0] >> 8) & 0xf,
3281		       priv(dev)->main_iobase + dac_msb_4020_reg(chan));
3282	} else {
3283		writew(data[0], priv(dev)->main_iobase + dac_convert_reg(chan));
3284	}
3285
3286	/*  remember output value */
3287	priv(dev)->ao_value[chan] = data[0];
3288
3289	return 1;
3290}
3291
3292static int ao_readback_insn(struct comedi_device *dev,
3293			    struct comedi_subdevice *s,
3294			    struct comedi_insn *insn, unsigned int *data)
3295{
3296	data[0] = priv(dev)->ao_value[CR_CHAN(insn->chanspec)];
3297
3298	return 1;
3299}
3300
3301static void set_dac_control0_reg(struct comedi_device *dev,
3302				 const struct comedi_cmd *cmd)
3303{
3304	unsigned int bits = DAC_ENABLE_BIT | WAVEFORM_GATE_LEVEL_BIT |
3305	    WAVEFORM_GATE_ENABLE_BIT | WAVEFORM_GATE_SELECT_BIT;
3306
3307	if (cmd->start_src == TRIG_EXT) {
3308		bits |= WAVEFORM_TRIG_EXT_BITS;
3309		if (cmd->start_arg & CR_INVERT)
3310			bits |= WAVEFORM_TRIG_FALLING_BIT;
3311	} else {
3312		bits |= WAVEFORM_TRIG_SOFT_BITS;
3313	}
3314	if (cmd->scan_begin_src == TRIG_EXT) {
3315		bits |= DAC_EXT_UPDATE_ENABLE_BIT;
3316		if (cmd->scan_begin_arg & CR_INVERT)
3317			bits |= DAC_EXT_UPDATE_FALLING_BIT;
3318	}
3319	writew(bits, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3320}
3321
3322static void set_dac_control1_reg(struct comedi_device *dev,
3323				 const struct comedi_cmd *cmd)
3324{
3325	int i;
3326
3327	for (i = 0; i < cmd->chanlist_len; i++) {
3328		int channel, range;
3329
3330		channel = CR_CHAN(cmd->chanlist[i]);
3331		range = CR_RANGE(cmd->chanlist[i]);
3332		set_dac_range_bits(dev, &priv(dev)->dac_control1_bits, channel,
3333				   range);
3334	}
3335	priv(dev)->dac_control1_bits |= DAC_SW_GATE_BIT;
3336	writew(priv(dev)->dac_control1_bits,
3337	       priv(dev)->main_iobase + DAC_CONTROL1_REG);
3338}
3339
3340static void set_dac_select_reg(struct comedi_device *dev,
3341			       const struct comedi_cmd *cmd)
3342{
3343	uint16_t bits;
3344	unsigned int first_channel, last_channel;
3345
3346	first_channel = CR_CHAN(cmd->chanlist[0]);
3347	last_channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
3348	if (last_channel < first_channel)
3349		comedi_error(dev, "bug! last ao channel < first ao channel");
3350
3351	bits = (first_channel & 0x7) | (last_channel & 0x7) << 3;
3352
3353	writew(bits, priv(dev)->main_iobase + DAC_SELECT_REG);
3354}
3355
3356static void set_dac_interval_regs(struct comedi_device *dev,
3357				  const struct comedi_cmd *cmd)
3358{
3359	unsigned int divisor;
3360
3361	if (cmd->scan_begin_src != TRIG_TIMER)
3362		return;
3363
3364	divisor = get_ao_divisor(cmd->scan_begin_arg, cmd->flags);
3365	if (divisor > max_counter_value) {
3366		comedi_error(dev, "bug! ao divisor too big");
3367		divisor = max_counter_value;
3368	}
3369	writew(divisor & 0xffff,
3370	       priv(dev)->main_iobase + DAC_SAMPLE_INTERVAL_LOWER_REG);
3371	writew((divisor >> 16) & 0xff,
3372	       priv(dev)->main_iobase + DAC_SAMPLE_INTERVAL_UPPER_REG);
3373}
3374
3375static unsigned int load_ao_dma_buffer(struct comedi_device *dev,
3376				       const struct comedi_cmd *cmd)
3377{
3378	unsigned int num_bytes, buffer_index, prev_buffer_index;
3379	unsigned int next_bits;
3380
3381	buffer_index = priv(dev)->ao_dma_index;
3382	prev_buffer_index = prev_ao_dma_index(dev);
3383
3384	DEBUG_PRINT("attempting to load ao buffer %i (0x%x)\n", buffer_index,
3385		    priv(dev)->ao_buffer_bus_addr[buffer_index]);
3386
3387	num_bytes = comedi_buf_read_n_available(dev->write_subdev->async);
3388	if (num_bytes > DMA_BUFFER_SIZE)
3389		num_bytes = DMA_BUFFER_SIZE;
3390	if (cmd->stop_src == TRIG_COUNT && num_bytes > priv(dev)->ao_count)
3391		num_bytes = priv(dev)->ao_count;
3392	num_bytes -= num_bytes % bytes_in_sample;
3393
3394	if (num_bytes == 0)
3395		return 0;
3396
3397	DEBUG_PRINT("loading %i bytes\n", num_bytes);
3398
3399	num_bytes = cfc_read_array_from_buffer(dev->write_subdev,
3400					       priv(dev)->
3401					       ao_buffer[buffer_index],
3402					       num_bytes);
3403	priv(dev)->ao_dma_desc[buffer_index].transfer_size =
3404	    cpu_to_le32(num_bytes);
3405	/* set end of chain bit so we catch underruns */
3406	next_bits = le32_to_cpu(priv(dev)->ao_dma_desc[buffer_index].next);
3407	next_bits |= PLX_END_OF_CHAIN_BIT;
3408	priv(dev)->ao_dma_desc[buffer_index].next = cpu_to_le32(next_bits);
3409	/* clear end of chain bit on previous buffer now that we have set it
3410	 * for the last buffer */
3411	next_bits = le32_to_cpu(priv(dev)->ao_dma_desc[prev_buffer_index].next);
3412	next_bits &= ~PLX_END_OF_CHAIN_BIT;
3413	priv(dev)->ao_dma_desc[prev_buffer_index].next = cpu_to_le32(next_bits);
3414
3415	priv(dev)->ao_dma_index = (buffer_index + 1) % AO_DMA_RING_COUNT;
3416	priv(dev)->ao_count -= num_bytes;
3417
3418	return num_bytes;
3419}
3420
3421static void load_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3422{
3423	unsigned int num_bytes;
3424	unsigned int next_transfer_addr;
3425	void *pci_addr_reg =
3426	    priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
3427	unsigned int buffer_index;
3428
3429	do {
3430		buffer_index = priv(dev)->ao_dma_index;
3431		/* don't overwrite data that hasn't been transferred yet */
3432		next_transfer_addr = readl(pci_addr_reg);
3433		if (next_transfer_addr >=
3434		    priv(dev)->ao_buffer_bus_addr[buffer_index]
3435		    && next_transfer_addr <
3436		    priv(dev)->ao_buffer_bus_addr[buffer_index] +
3437		    DMA_BUFFER_SIZE)
3438			return;
3439		num_bytes = load_ao_dma_buffer(dev, cmd);
3440	} while (num_bytes >= DMA_BUFFER_SIZE);
3441}
3442
3443static int prep_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3444{
3445	unsigned int num_bytes;
3446	int i;
3447
3448	/* clear queue pointer too, since external queue has
3449	 * weird interactions with ao fifo */
3450	writew(0, priv(dev)->main_iobase + ADC_QUEUE_CLEAR_REG);
3451	writew(0, priv(dev)->main_iobase + DAC_BUFFER_CLEAR_REG);
3452
3453	num_bytes = (DAC_FIFO_SIZE / 2) * bytes_in_sample;
3454	if (cmd->stop_src == TRIG_COUNT &&
3455	    num_bytes / bytes_in_sample > priv(dev)->ao_count)
3456		num_bytes = priv(dev)->ao_count * bytes_in_sample;
3457	num_bytes = cfc_read_array_from_buffer(dev->write_subdev,
3458					       priv(dev)->ao_bounce_buffer,
3459					       num_bytes);
3460	for (i = 0; i < num_bytes / bytes_in_sample; i++) {
3461		writew(priv(dev)->ao_bounce_buffer[i],
3462		       priv(dev)->main_iobase + DAC_FIFO_REG);
3463	}
3464	priv(dev)->ao_count -= num_bytes / bytes_in_sample;
3465	if (cmd->stop_src == TRIG_COUNT && priv(dev)->ao_count == 0)
3466		return 0;
3467	num_bytes = load_ao_dma_buffer(dev, cmd);
3468	if (num_bytes == 0)
3469		return -1;
3470	if (num_bytes >= DMA_BUFFER_SIZE) ;
3471	load_ao_dma(dev, cmd);
3472
3473	dma_start_sync(dev, 0);
3474
3475	return 0;
3476}
3477
3478static inline int external_ai_queue_in_use(struct comedi_device *dev)
3479{
3480	if (dev->read_subdev->busy)
3481		return 0;
3482	if (board(dev)->layout == LAYOUT_4020)
3483		return 0;
3484	else if (use_internal_queue_6xxx(&dev->read_subdev->async->cmd))
3485		return 0;
3486	return 1;
3487}
3488
3489static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
3490{
3491	struct comedi_cmd *cmd = &s->async->cmd;
3492
3493	if (external_ai_queue_in_use(dev)) {
3494		warn_external_queue(dev);
3495		return -EBUSY;
3496	}
3497	/* disable analog output system during setup */
3498	writew(0x0, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3499
3500	priv(dev)->ao_dma_index = 0;
3501	priv(dev)->ao_count = cmd->stop_arg * cmd->chanlist_len;
3502
3503	set_dac_select_reg(dev, cmd);
3504	set_dac_interval_regs(dev, cmd);
3505	load_first_dma_descriptor(dev, 0, priv(dev)->ao_dma_desc_bus_addr |
3506				  PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT);
3507
3508	set_dac_control1_reg(dev, cmd);
3509	s->async->inttrig = ao_inttrig;
3510
3511	return 0;
3512}
3513
3514static int ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
3515		      unsigned int trig_num)
3516{
3517	struct comedi_cmd *cmd = &s->async->cmd;
3518	int retval;
3519
3520	if (trig_num != 0)
3521		return -EINVAL;
3522
3523	retval = prep_ao_dma(dev, cmd);
3524	if (retval < 0)
3525		return -EPIPE;
3526
3527	set_dac_control0_reg(dev, cmd);
3528
3529	if (cmd->start_src == TRIG_INT)
3530		writew(0, priv(dev)->main_iobase + DAC_START_REG);
3531
3532	s->async->inttrig = NULL;
3533
3534	return 0;
3535}
3536
3537static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
3538		      struct comedi_cmd *cmd)
3539{
3540	int err = 0;
3541	int tmp;
3542	unsigned int tmp_arg;
3543	int i;
3544
3545	/* step 1: make sure trigger sources are trivially valid */
3546
3547	tmp = cmd->start_src;
3548	cmd->start_src &= TRIG_INT | TRIG_EXT;
3549	if (!cmd->start_src || tmp != cmd->start_src)
3550		err++;
3551
3552	tmp = cmd->scan_begin_src;
3553	cmd->scan_begin_src &= TRIG_TIMER | TRIG_EXT;
3554	if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
3555		err++;
3556
3557	tmp = cmd->convert_src;
3558	cmd->convert_src &= TRIG_NOW;
3559	if (!cmd->convert_src || tmp != cmd->convert_src)
3560		err++;
3561
3562	tmp = cmd->scan_end_src;
3563	cmd->scan_end_src &= TRIG_COUNT;
3564	if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
3565		err++;
3566
3567	tmp = cmd->stop_src;
3568	cmd->stop_src &= TRIG_NONE;
3569	if (!cmd->stop_src || tmp != cmd->stop_src)
3570		err++;
3571
3572	if (err)
3573		return 1;
3574
3575	/* step 2: make sure trigger sources are unique and mutually compatible */
3576
3577	/*  uniqueness check */
3578	if (cmd->start_src != TRIG_INT && cmd->start_src != TRIG_EXT)
3579		err++;
3580	if (cmd->scan_begin_src != TRIG_TIMER &&
3581	    cmd->scan_begin_src != TRIG_EXT)
3582		err++;
3583
3584	/*  compatibility check */
3585	if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
3586		err++;
3587	if (cmd->stop_src != TRIG_COUNT &&
3588	    cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
3589		err++;
3590
3591	if (err)
3592		return 2;
3593
3594	/* step 3: make sure arguments are trivially compatible */
3595
3596	if (cmd->scan_begin_src == TRIG_TIMER) {
3597		if (cmd->scan_begin_arg < board(dev)->ao_scan_speed) {
3598			cmd->scan_begin_arg = board(dev)->ao_scan_speed;
3599			err++;
3600		}
3601		if (get_ao_divisor(cmd->scan_begin_arg,
3602				   cmd->flags) > max_counter_value) {
3603			cmd->scan_begin_arg =
3604			    (max_counter_value + 2) * TIMER_BASE;
3605			err++;
3606		}
3607	}
3608
3609	if (!cmd->chanlist_len) {
3610		cmd->chanlist_len = 1;
3611		err++;
3612	}
3613	if (cmd->scan_end_arg != cmd->chanlist_len) {
3614		cmd->scan_end_arg = cmd->chanlist_len;
3615		err++;
3616	}
3617
3618	if (err)
3619		return 3;
3620
3621	/* step 4: fix up any arguments */
3622
3623	if (cmd->scan_begin_src == TRIG_TIMER) {
3624		tmp_arg = cmd->scan_begin_arg;
3625		cmd->scan_begin_arg =
3626		    get_divisor(cmd->scan_begin_arg, cmd->flags) * TIMER_BASE;
3627		if (tmp_arg != cmd->scan_begin_arg)
3628			err++;
3629	}
3630
3631	if (err)
3632		return 4;
3633
3634	if (cmd->chanlist) {
3635		unsigned int first_channel = CR_CHAN(cmd->chanlist[0]);
3636		for (i = 1; i < cmd->chanlist_len; i++) {
3637			if (CR_CHAN(cmd->chanlist[i]) != first_channel + i) {
3638				comedi_error(dev,
3639					     "chanlist must use consecutive channels");
3640				err++;
3641				break;
3642			}
3643		}
3644	}
3645
3646	if (err)
3647		return 5;
3648
3649	return 0;
3650}
3651
3652static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3653{
3654	writew(0x0, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3655	abort_dma(dev, 0);
3656	return 0;
3657}
3658
3659static int dio_callback(int dir, int port, int data, unsigned long iobase)
3660{
3661	if (dir) {
3662		writeb(data, (void *)(iobase + port));
3663		DEBUG_PRINT("wrote 0x%x to port %i\n", data, port);
3664		return 0;
3665	} else {
3666		return readb((void *)(iobase + port));
3667	}
3668}
3669
3670static int dio_callback_4020(int dir, int port, int data, unsigned long iobase)
3671{
3672	if (dir) {
3673		writew(data, (void *)(iobase + 2 * port));
3674		return 0;
3675	} else {
3676		return readw((void *)(iobase + 2 * port));
3677	}
3678}
3679
3680static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
3681		    struct comedi_insn *insn, unsigned int *data)
3682{
3683	unsigned int bits;
3684
3685	bits = readb(priv(dev)->dio_counter_iobase + DI_REG);
3686	bits &= 0xf;
3687	data[1] = bits;
3688	data[0] = 0;
3689
3690	return 2;
3691}
3692
3693static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
3694		    struct comedi_insn *insn, unsigned int *data)
3695{
3696	data[0] &= 0xf;
3697	/*  zero bits we are going to change */
3698	s->state &= ~data[0];
3699	/*  set new bits */
3700	s->state |= data[0] & data[1];
3701
3702	writeb(s->state, priv(dev)->dio_counter_iobase + DO_REG);
3703
3704	data[1] = s->state;
3705
3706	return 2;
3707}
3708
3709static int dio_60xx_config_insn(struct comedi_device *dev,
3710				struct comedi_subdevice *s,
3711				struct comedi_insn *insn, unsigned int *data)
3712{
3713	unsigned int mask;
3714
3715	mask = 1 << CR_CHAN(insn->chanspec);
3716
3717	switch (data[0]) {
3718	case INSN_CONFIG_DIO_INPUT:
3719		s->io_bits &= ~mask;
3720		break;
3721	case INSN_CONFIG_DIO_OUTPUT:
3722		s->io_bits |= mask;
3723		break;
3724	case INSN_CONFIG_DIO_QUERY:
3725		data[1] = (s->io_bits & mask) ? COMEDI_OUTPUT : COMEDI_INPUT;
3726		return 2;
3727	default:
3728		return -EINVAL;
3729	}
3730
3731	writeb(s->io_bits,
3732	       priv(dev)->dio_counter_iobase + DIO_DIRECTION_60XX_REG);
3733
3734	return 1;
3735}
3736
3737static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
3738			  struct comedi_insn *insn, unsigned int *data)
3739{
3740	if (data[0]) {
3741		s->state &= ~data[0];
3742		s->state |= (data[0] & data[1]);
3743		writeb(s->state,
3744		       priv(dev)->dio_counter_iobase + DIO_DATA_60XX_REG);
3745	}
3746
3747	data[1] = readb(priv(dev)->dio_counter_iobase + DIO_DATA_60XX_REG);
3748
3749	return 2;
3750}
3751
3752static void caldac_write(struct comedi_device *dev, unsigned int channel,
3753			 unsigned int value)
3754{
3755	priv(dev)->caldac_state[channel] = value;
3756
3757	switch (board(dev)->layout) {
3758	case LAYOUT_60XX:
3759	case LAYOUT_64XX:
3760		caldac_8800_write(dev, channel, value);
3761		break;
3762	case LAYOUT_4020:
3763		caldac_i2c_write(dev, channel, value);
3764		break;
3765	default:
3766		break;
3767	}
3768}
3769
3770static int calib_write_insn(struct comedi_device *dev,
3771			    struct comedi_subdevice *s,
3772			    struct comedi_insn *insn, unsigned int *data)
3773{
3774	int channel = CR_CHAN(insn->chanspec);
3775
3776	/* return immediately if setting hasn't changed, since
3777	 * programming these things is slow */
3778	if (priv(dev)->caldac_state[channel] == data[0])
3779		return 1;
3780
3781	caldac_write(dev, channel, data[0]);
3782
3783	return 1;
3784}
3785
3786static int calib_read_insn(struct comedi_device *dev,
3787			   struct comedi_subdevice *s, struct comedi_insn *insn,
3788			   unsigned int *data)
3789{
3790	unsigned int channel = CR_CHAN(insn->chanspec);
3791
3792	data[0] = priv(dev)->caldac_state[channel];
3793
3794	return 1;
3795}
3796
3797static void ad8402_write(struct comedi_device *dev, unsigned int channel,
3798			 unsigned int value)
3799{
3800	static const int bitstream_length = 10;
3801	unsigned int bit, register_bits;
3802	unsigned int bitstream = ((channel & 0x3) << 8) | (value & 0xff);
3803	static const int ad8402_udelay = 1;
3804
3805	priv(dev)->ad8402_state[channel] = value;
3806
3807	register_bits = SELECT_8402_64XX_BIT;
3808	udelay(ad8402_udelay);
3809	writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
3810
3811	for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3812		if (bitstream & bit)
3813			register_bits |= SERIAL_DATA_IN_BIT;
3814		else
3815			register_bits &= ~SERIAL_DATA_IN_BIT;
3816		udelay(ad8402_udelay);
3817		writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
3818		udelay(ad8402_udelay);
3819		writew(register_bits | SERIAL_CLOCK_BIT,
3820		       priv(dev)->main_iobase + CALIBRATION_REG);
3821	}
3822
3823	udelay(ad8402_udelay);
3824	writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
3825}
3826
3827/* for pci-das6402/16, channel 0 is analog input gain and channel 1 is offset */
3828static int ad8402_write_insn(struct comedi_device *dev,
3829			     struct comedi_subdevice *s,
3830			     struct comedi_insn *insn, unsigned int *data)
3831{
3832	int channel = CR_CHAN(insn->chanspec);
3833
3834	/* return immediately if setting hasn't changed, since
3835	 * programming these things is slow */
3836	if (priv(dev)->ad8402_state[channel] == data[0])
3837		return 1;
3838
3839	priv(dev)->ad8402_state[channel] = data[0];
3840
3841	ad8402_write(dev, channel, data[0]);
3842
3843	return 1;
3844}
3845
3846static int ad8402_read_insn(struct comedi_device *dev,
3847			    struct comedi_subdevice *s,
3848			    struct comedi_insn *insn, unsigned int *data)
3849{
3850	unsigned int channel = CR_CHAN(insn->chanspec);
3851
3852	data[0] = priv(dev)->ad8402_state[channel];
3853
3854	return 1;
3855}
3856
3857static uint16_t read_eeprom(struct comedi_device *dev, uint8_t address)
3858{
3859	static const int bitstream_length = 11;
3860	static const int read_command = 0x6;
3861	unsigned int bitstream = (read_command << 8) | address;
3862	unsigned int bit;
3863	void *const plx_control_addr =
3864	    priv(dev)->plx9080_iobase + PLX_CONTROL_REG;
3865	uint16_t value;
3866	static const int value_length = 16;
3867	static const int eeprom_udelay = 1;
3868
3869	udelay(eeprom_udelay);
3870	priv(dev)->plx_control_bits &= ~CTL_EE_CLK & ~CTL_EE_CS;
3871	/*  make sure we don't send anything to the i2c bus on 4020 */
3872	priv(dev)->plx_control_bits |= CTL_USERO;
3873	writel(priv(dev)->plx_control_bits, plx_control_addr);
3874	/*  activate serial eeprom */
3875	udelay(eeprom_udelay);
3876	priv(dev)->plx_control_bits |= CTL_EE_CS;
3877	writel(priv(dev)->plx_control_bits, plx_control_addr);
3878
3879	/*  write read command and desired memory address */
3880	for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3881		/*  set bit to be written */
3882		udelay(eeprom_udelay);
3883		if (bitstream & bit)
3884			priv(dev)->plx_control_bits |= CTL_EE_W;
3885		else
3886			priv(dev)->plx_control_bits &= ~CTL_EE_W;
3887		writel(priv(dev)->plx_control_bits, plx_control_addr);
3888		/*  clock in bit */
3889		udelay(eeprom_udelay);
3890		priv(dev)->plx_control_bits |= CTL_EE_CLK;
3891		writel(priv(dev)->plx_control_bits, plx_control_addr);
3892		udelay(eeprom_udelay);
3893		priv(dev)->plx_control_bits &= ~CTL_EE_CLK;
3894		writel(priv(dev)->plx_control_bits, plx_control_addr);
3895	}
3896	/*  read back value from eeprom memory location */
3897	value = 0;
3898	for (bit = 1 << (value_length - 1); bit; bit >>= 1) {
3899		/*  clock out bit */
3900		udelay(eeprom_udelay);
3901		priv(dev)->plx_control_bits |= CTL_EE_CLK;
3902		writel(priv(dev)->plx_control_bits, plx_control_addr);
3903		udelay(eeprom_udelay);
3904		priv(dev)->plx_control_bits &= ~CTL_EE_CLK;
3905		writel(priv(dev)->plx_control_bits, plx_control_addr);
3906		udelay(eeprom_udelay);
3907		if (readl(plx_control_addr) & CTL_EE_R)
3908			value |= bit;
3909	}
3910
3911	/*  deactivate eeprom serial input */
3912	udelay(eeprom_udelay);
3913	priv(dev)->plx_control_bits &= ~CTL_EE_CS;
3914	writel(priv(dev)->plx_control_bits, plx_control_addr);
3915
3916	return value;
3917}
3918
3919static int eeprom_read_insn(struct comedi_device *dev,
3920			    struct comedi_subdevice *s,
3921			    struct comedi_insn *insn, unsigned int *data)
3922{
3923	data[0] = read_eeprom(dev, CR_CHAN(insn->chanspec));
3924
3925	return 1;
3926}
3927
3928/* utility function that rounds desired timing to an achievable time, and
3929 * sets cmd members appropriately.
3930 * adc paces conversions from master clock by dividing by (x + 3) where x is 24 bit number
3931 */
3932static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd)
3933{
3934	unsigned int convert_divisor = 0, scan_divisor;
3935	static const int min_convert_divisor = 3;
3936	static const int max_convert_divisor =
3937	    max_counter_value + min_convert_divisor;
3938	static const int min_scan_divisor_4020 = 2;
3939	unsigned long long max_scan_divisor, min_scan_divisor;
3940
3941	if (cmd->convert_src == TRIG_TIMER) {
3942		if (board(dev)->layout == LAYOUT_4020) {
3943			cmd->convert_arg = 0;
3944		} else {
3945			convert_divisor =
3946			    get_divisor(cmd->convert_arg, cmd->flags);
3947			if (convert_divisor > max_convert_divisor)
3948				convert_divisor = max_convert_divisor;
3949			if (convert_divisor < min_convert_divisor)
3950				convert_divisor = min_convert_divisor;
3951			cmd->convert_arg = convert_divisor * TIMER_BASE;
3952		}
3953	} else if (cmd->convert_src == TRIG_NOW)
3954		cmd->convert_arg = 0;
3955
3956	if (cmd->scan_begin_src == TRIG_TIMER) {
3957		scan_divisor = get_divisor(cmd->scan_begin_arg, cmd->flags);
3958		if (cmd->convert_src == TRIG_TIMER) {
3959			/*  XXX check for integer overflows */
3960			min_scan_divisor = convert_divisor * cmd->chanlist_len;
3961			max_scan_divisor =
3962			    (convert_divisor * cmd->chanlist_len - 1) +
3963			    max_counter_value;
3964		} else {
3965			min_scan_divisor = min_scan_divisor_4020;
3966			max_scan_divisor = max_counter_value + min_scan_divisor;
3967		}
3968		if (scan_divisor > max_scan_divisor)
3969			scan_divisor = max_scan_divisor;
3970		if (scan_divisor < min_scan_divisor)
3971			scan_divisor = min_scan_divisor;
3972		cmd->scan_begin_arg = scan_divisor * TIMER_BASE;
3973	}
3974
3975	return;
3976}
3977
3978/* Gets nearest achievable timing given master clock speed, does not
3979 * take into account possible minimum/maximum divisor values.  Used
3980 * by other timing checking functions. */
3981static unsigned int get_divisor(unsigned int ns, unsigned int flags)
3982{
3983	unsigned int divisor;
3984
3985	switch (flags & TRIG_ROUND_MASK) {
3986	case TRIG_ROUND_UP:
3987		divisor = (ns + TIMER_BASE - 1) / TIMER_BASE;
3988		break;
3989	case TRIG_ROUND_DOWN:
3990		divisor = ns / TIMER_BASE;
3991		break;
3992	case TRIG_ROUND_NEAREST:
3993	default:
3994		divisor = (ns + TIMER_BASE / 2) / TIMER_BASE;
3995		break;
3996	}
3997	return divisor;
3998}
3999
4000static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags)
4001{
4002	return get_divisor(ns, flags) - 2;
4003}
4004
4005/* adjusts the size of hardware fifo (which determines block size for dma xfers) */
4006static int set_ai_fifo_size(struct comedi_device *dev, unsigned int num_samples)
4007{
4008	unsigned int num_fifo_entries;
4009	int retval;
4010	const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
4011
4012	num_fifo_entries = num_samples / fifo->sample_packing_ratio;
4013
4014	retval = set_ai_fifo_segment_length(dev,
4015					    num_fifo_entries /
4016					    fifo->num_segments);
4017	if (retval < 0)
4018		return retval;
4019
4020	num_samples = retval * fifo->num_segments * fifo->sample_packing_ratio;
4021
4022	DEBUG_PRINT("set hardware fifo size to %i\n", num_samples);
4023
4024	return num_samples;
4025}
4026
4027/* query length of fifo */
4028static unsigned int ai_fifo_size(struct comedi_device *dev)
4029{
4030	return priv(dev)->ai_fifo_segment_length *
4031	    board(dev)->ai_fifo->num_segments *
4032	    board(dev)->ai_fifo->sample_packing_ratio;
4033}
4034
4035static int set_ai_fifo_segment_length(struct comedi_device *dev,
4036				      unsigned int num_entries)
4037{
4038	static const int increment_size = 0x100;
4039	const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
4040	unsigned int num_increments;
4041	uint16_t bits;
4042
4043	if (num_entries < increment_size)
4044		num_entries = increment_size;
4045	if (num_entries > fifo->max_segment_length)
4046		num_entries = fifo->max_segment_length;
4047
4048	/*  1 == 256 entries, 2 == 512 entries, etc */
4049	num_increments = (num_entries + increment_size / 2) / increment_size;
4050
4051	bits = (~(num_increments - 1)) & fifo->fifo_size_reg_mask;
4052	priv(dev)->fifo_size_bits &= ~fifo->fifo_size_reg_mask;
4053	priv(dev)->fifo_size_bits |= bits;
4054	writew(priv(dev)->fifo_size_bits,
4055	       priv(dev)->main_iobase + FIFO_SIZE_REG);
4056
4057	priv(dev)->ai_fifo_segment_length = num_increments * increment_size;
4058
4059	DEBUG_PRINT("set hardware fifo segment length to %i\n",
4060		    priv(dev)->ai_fifo_segment_length);
4061
4062	return priv(dev)->ai_fifo_segment_length;
4063}
4064
4065/* pci-6025 8800 caldac:
4066 * address 0 == dac channel 0 offset
4067 * address 1 == dac channel 0 gain
4068 * address 2 == dac channel 1 offset
4069 * address 3 == dac channel 1 gain
4070 * address 4 == fine adc offset
4071 * address 5 == coarse adc offset
4072 * address 6 == coarse adc gain
4073 * address 7 == fine adc gain
4074 */
4075/* pci-6402/16 uses all 8 channels for dac:
4076 * address 0 == dac channel 0 fine gain
4077 * address 1 == dac channel 0 coarse gain
4078 * address 2 == dac channel 0 coarse offset
4079 * address 3 == dac channel 1 coarse offset
4080 * address 4 == dac channel 1 fine gain
4081 * address 5 == dac channel 1 coarse gain
4082 * address 6 == dac channel 0 fine offset
4083 * address 7 == dac channel 1 fine offset
4084*/
4085
4086static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
4087			     uint8_t value)
4088{
4089	static const int num_caldac_channels = 8;
4090	static const int bitstream_length = 11;
4091	unsigned int bitstream = ((address & 0x7) << 8) | value;
4092	unsigned int bit, register_bits;
4093	static const int caldac_8800_udelay = 1;
4094
4095	if (address >= num_caldac_channels) {
4096		comedi_error(dev, "illegal caldac channel");
4097		return -1;
4098	}
4099	for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
4100		register_bits = 0;
4101		if (bitstream & bit)
4102			register_bits |= SERIAL_DATA_IN_BIT;
4103		udelay(caldac_8800_udelay);
4104		writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
4105		register_bits |= SERIAL_CLOCK_BIT;
4106		udelay(caldac_8800_udelay);
4107		writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
4108	}
4109	udelay(caldac_8800_udelay);
4110	writew(SELECT_8800_BIT, priv(dev)->main_iobase + CALIBRATION_REG);
4111	udelay(caldac_8800_udelay);
4112	writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
4113	udelay(caldac_8800_udelay);
4114	return 0;
4115}
4116
4117/* 4020 caldacs */
4118static int caldac_i2c_write(struct comedi_device *dev,
4119			    unsigned int caldac_channel, unsigned int value)
4120{
4121	uint8_t serial_bytes[3];
4122	uint8_t i2c_addr;
4123	enum pointer_bits {
4124		/*  manual has gain and offset bits switched */
4125		OFFSET_0_2 = 0x1,
4126		GAIN_0_2 = 0x2,
4127		OFFSET_1_3 = 0x4,
4128		GAIN_1_3 = 0x8,
4129	};
4130	enum data_bits {
4131		NOT_CLEAR_REGISTERS = 0x20,
4132	};
4133
4134	switch (caldac_channel) {
4135	case 0:		/*  chan 0 offset */
4136		i2c_addr = CALDAC0_I2C_ADDR;
4137		serial_bytes[0] = OFFSET_0_2;
4138		break;
4139	case 1:		/*  chan 1 offset */
4140		i2c_addr = CALDAC0_I2C_ADDR;
4141		serial_bytes[0] = OFFSET_1_3;
4142		break;
4143	case 2:		/*  chan 2 offset */
4144		i2c_addr = CALDAC1_I2C_ADDR;
4145		serial_bytes[0] = OFFSET_0_2;
4146		break;
4147	case 3:		/*  chan 3 offset */
4148		i2c_addr = CALDAC1_I2C_ADDR;
4149		serial_bytes[0] = OFFSET_1_3;
4150		break;
4151	case 4:		/*  chan 0 gain */
4152		i2c_addr = CALDAC0_I2C_ADDR;
4153		serial_bytes[0] = GAIN_0_2;
4154		break;
4155	case 5:		/*  chan 1 gain */
4156		i2c_addr = CALDAC0_I2C_ADDR;
4157		serial_bytes[0] = GAIN_1_3;
4158		break;
4159	case 6:		/*  chan 2 gain */
4160		i2c_addr = CALDAC1_I2C_ADDR;
4161		serial_bytes[0] = GAIN_0_2;
4162		break;
4163	case 7:		/*  chan 3 gain */
4164		i2c_addr = CALDAC1_I2C_ADDR;
4165		serial_bytes[0] = GAIN_1_3;
4166		break;
4167	default:
4168		comedi_error(dev, "invalid caldac channel\n");
4169		return -1;
4170		break;
4171	}
4172	serial_bytes[1] = NOT_CLEAR_REGISTERS | ((value >> 8) & 0xf);
4173	serial_bytes[2] = value & 0xff;
4174	i2c_write(dev, i2c_addr, serial_bytes, 3);
4175	return 0;
4176}
4177
4178/* Their i2c requires a huge delay on setting clock or data high for some reason */
4179static const int i2c_high_udelay = 1000;
4180static const int i2c_low_udelay = 10;
4181
4182/* set i2c data line high or low */
4183static void i2c_set_sda(struct comedi_device *dev, int state)
4184{
4185	static const int data_bit = CTL_EE_W;
4186	void *plx_control_addr = priv(dev)->plx9080_iobase + PLX_CONTROL_REG;
4187
4188	if (state) {
4189		/*  set data line high */
4190		priv(dev)->plx_control_bits &= ~data_bit;
4191		writel(priv(dev)->plx_control_bits, plx_control_addr);
4192		udelay(i2c_high_udelay);
4193	} else {		/*  set data line low */
4194
4195		priv(dev)->plx_control_bits |= data_bit;
4196		writel(priv(dev)->plx_control_bits, plx_control_addr);
4197		udelay(i2c_low_udelay);
4198	}
4199}
4200
4201/* set i2c clock line high or low */
4202static void i2c_set_scl(struct comedi_device *dev, int state)
4203{
4204	static const int clock_bit = CTL_USERO;
4205	void *plx_control_addr = priv(dev)->plx9080_iobase + PLX_CONTROL_REG;
4206
4207	if (state) {
4208		/*  set clock line high */
4209		priv(dev)->plx_control_bits &= ~clock_bit;
4210		writel(priv(dev)->plx_control_bits, plx_control_addr);
4211		udelay(i2c_high_udelay);
4212	} else {		/*  set clock line low */
4213
4214		priv(dev)->plx_control_bits |= clock_bit;
4215		writel(priv(dev)->plx_control_bits, plx_control_addr);
4216		udelay(i2c_low_udelay);
4217	}
4218}
4219
4220static void i2c_write_byte(struct comedi_device *dev, uint8_t byte)
4221{
4222	uint8_t bit;
4223	unsigned int num_bits = 8;
4224
4225	DEBUG_PRINT("writing to i2c byte 0x%x\n", byte);
4226
4227	for (bit = 1 << (num_bits - 1); bit; bit >>= 1) {
4228		i2c_set_scl(dev, 0);
4229		if ((byte & bit))
4230			i2c_set_sda(dev, 1);
4231		else
4232			i2c_set_sda(dev, 0);
4233		i2c_set_scl(dev, 1);
4234	}
4235}
4236
4237/* we can't really read the lines, so fake it */
4238static int i2c_read_ack(struct comedi_device *dev)
4239{
4240	i2c_set_scl(dev, 0);
4241	i2c_set_sda(dev, 1);
4242	i2c_set_scl(dev, 1);
4243
4244	return 0;		/*  return fake acknowledge bit */
4245}
4246
4247/* send start bit */
4248static void i2c_start(struct comedi_device *dev)
4249{
4250	i2c_set_scl(dev, 1);
4251	i2c_set_sda(dev, 1);
4252	i2c_set_sda(dev, 0);
4253}
4254
4255/* send stop bit */
4256static void i2c_stop(struct comedi_device *dev)
4257{
4258	i2c_set_scl(dev, 0);
4259	i2c_set_sda(dev, 0);
4260	i2c_set_scl(dev, 1);
4261	i2c_set_sda(dev, 1);
4262}
4263
4264static void i2c_write(struct comedi_device *dev, unsigned int address,
4265		      const uint8_t * data, unsigned int length)
4266{
4267	unsigned int i;
4268	uint8_t bitstream;
4269	static const int read_bit = 0x1;
4270
4271/* XXX need mutex to prevent simultaneous attempts to access eeprom and i2c bus */
4272
4273	/*  make sure we dont send anything to eeprom */
4274	priv(dev)->plx_control_bits &= ~CTL_EE_CS;
4275
4276	i2c_stop(dev);
4277	i2c_start(dev);
4278
4279	/*  send address and write bit */
4280	bitstream = (address << 1) & ~read_bit;
4281	i2c_write_byte(dev, bitstream);
4282
4283	/*  get acknowledge */
4284	if (i2c_read_ack(dev) != 0) {
4285		comedi_error(dev, "i2c write failed: no acknowledge");
4286		i2c_stop(dev);
4287		return;
4288	}
4289	/*  write data bytes */
4290	for (i = 0; i < length; i++) {
4291		i2c_write_byte(dev, data[i]);
4292		if (i2c_read_ack(dev) != 0) {
4293			comedi_error(dev, "i2c write failed: no acknowledge");
4294			i2c_stop(dev);
4295			return;
4296		}
4297	}
4298	i2c_stop(dev);
4299}
4300