2 comedi/drivers/cb_pcidas64.c
3 This is a driver for the ComputerBoards/MeasurementComputing PCI-DAS
4 64xx, 60xx, and 4020 cards.
6 Author: Frank Mori Hess <fmhess@users.sourceforge.net>
7 Copyright (C) 2001, 2002 Frank Mori Hess
9 Thanks also go to the following people:
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.
17 John Sims, for much testing and feedback on pcidas-4020 support.
19 COMEDI - Linux Control and Measurement Device Interface
20 Copyright (C) 1997-8 David A. Schleef <ds@schleef.org>
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.
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.
35 * Description: MeasurementComputing PCI-DAS64xx, 60XX, and 4020 series
36 * with the PLX 9080 PCI controller
37 * Author: Frank Mori Hess <fmhess@users.sourceforge.net>
39 * Updated: Fri, 02 Nov 2012 18:58:55 +0000
40 * Devices: [Measurement Computing] PCI-DAS6402/16 (cb_pcidas64),
41 * PCI-DAS6402/12, PCI-DAS64/M1/16, PCI-DAS64/M2/16,
42 * PCI-DAS64/M3/16, PCI-DAS6402/16/JR, PCI-DAS64/M1/16/JR,
43 * PCI-DAS64/M2/16/JR, PCI-DAS64/M3/16/JR, PCI-DAS64/M1/14,
44 * PCI-DAS64/M2/14, PCI-DAS64/M3/14, PCI-DAS6013, PCI-DAS6014,
45 * PCI-DAS6023, PCI-DAS6025, PCI-DAS6030,
46 * PCI-DAS6031, PCI-DAS6032, PCI-DAS6033, PCI-DAS6034,
47 * PCI-DAS6035, PCI-DAS6036, PCI-DAS6040, PCI-DAS6052,
48 * PCI-DAS6070, PCI-DAS6071, PCI-DAS4020/12
50 * Configuration options:
53 * Manual attachment of PCI cards with the comedi_config utility is not
54 * supported by this driver; they are attached automatically.
56 * These boards may be autocalibrated with the comedi_calibrate utility.
58 * To select the bnc trigger input on the 4020 (instead of the dio input),
59 * specify a nonzero channel in the chanspec. If you wish to use an external
60 * master clock on the 4020, you may do so by setting the scan_begin_src
61 * to TRIG_OTHER, and using an INSN_CONFIG_TIMER_1 configuration insn
62 * to configure the divisor to use for the external clock.
64 * Some devices are not identified because the PCI device IDs are not yet
65 * known. If you have such a board, please let the maintainers know.
71 make it return error if user attempts an ai command that uses the
72 external queue, and an ao command simultaneously user counter subdevice
73 there are a number of boards this driver will support when they are
74 fully released, but does not yet since the pci device id numbers
75 are not yet available.
77 support prescaled 100khz clock for slow pacing (not available on 6000
80 make ao fifo size adjustable like ai fifo
83 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
85 #include <linux/module.h>
86 #include <linux/pci.h>
87 #include <linux/delay.h>
88 #include <linux/interrupt.h>
90 #include "../comedidev.h"
95 #include "comedi_fc.h"
97 #undef PCIDAS64_DEBUG /* disable debugging code */
98 /* #define PCIDAS64_DEBUG enable debugging code */
100 #ifdef PCIDAS64_DEBUG
101 #define DEBUG_PRINT(format, args...) pr_debug(format, ## args)
103 #define DEBUG_PRINT(format, args...) no_printk(format, ## args)
106 #define TIMER_BASE 25 /* 40MHz master clock */
107 /* 100kHz 'prescaled' clock for slow acquisition,
108 * maybe I'll support this someday */
109 #define PRESCALED_TIMER_BASE 10000
110 #define DMA_BUFFER_SIZE 0x1000
112 /* maximum value that can be loaded into board's 24-bit counters*/
113 static const int max_counter_value = 0xffffff;
115 /* PCI-DAS64xxx base addresses */
117 /* devpriv->main_iobase registers */
118 enum write_only_registers {
119 INTR_ENABLE_REG = 0x0, /* interrupt enable register */
120 HW_CONFIG_REG = 0x2, /* hardware config register */
122 DAQ_ATRIG_LOW_4020_REG = 0xc,
123 ADC_CONTROL0_REG = 0x10, /* adc control register 0 */
124 ADC_CONTROL1_REG = 0x12, /* adc control register 1 */
125 CALIBRATION_REG = 0x14,
126 /* lower 16 bits of adc sample interval counter */
127 ADC_SAMPLE_INTERVAL_LOWER_REG = 0x16,
128 /* upper 8 bits of adc sample interval counter */
129 ADC_SAMPLE_INTERVAL_UPPER_REG = 0x18,
130 /* lower 16 bits of delay interval counter */
131 ADC_DELAY_INTERVAL_LOWER_REG = 0x1a,
132 /* upper 8 bits of delay interval counter */
133 ADC_DELAY_INTERVAL_UPPER_REG = 0x1c,
134 /* lower 16 bits of hardware conversion/scan counter */
135 ADC_COUNT_LOWER_REG = 0x1e,
136 /* upper 8 bits of hardware conversion/scan counter */
137 ADC_COUNT_UPPER_REG = 0x20,
138 ADC_START_REG = 0x22, /* software trigger to start acquisition */
139 ADC_CONVERT_REG = 0x24, /* initiates single conversion */
140 ADC_QUEUE_CLEAR_REG = 0x26, /* clears adc queue */
141 ADC_QUEUE_LOAD_REG = 0x28, /* loads adc queue */
142 ADC_BUFFER_CLEAR_REG = 0x2a,
143 /* high channel for internal queue, use adc_chan_bits() inline above */
144 ADC_QUEUE_HIGH_REG = 0x2c,
145 DAC_CONTROL0_REG = 0x50, /* dac control register 0 */
146 DAC_CONTROL1_REG = 0x52, /* dac control register 0 */
147 /* lower 16 bits of dac sample interval counter */
148 DAC_SAMPLE_INTERVAL_LOWER_REG = 0x54,
149 /* upper 8 bits of dac sample interval counter */
150 DAC_SAMPLE_INTERVAL_UPPER_REG = 0x56,
151 DAC_SELECT_REG = 0x60,
152 DAC_START_REG = 0x64,
153 DAC_BUFFER_CLEAR_REG = 0x66, /* clear dac buffer */
156 static inline unsigned int dac_convert_reg(unsigned int channel)
158 return 0x70 + (2 * (channel & 0x1));
161 static inline unsigned int dac_lsb_4020_reg(unsigned int channel)
163 return 0x70 + (4 * (channel & 0x1));
166 static inline unsigned int dac_msb_4020_reg(unsigned int channel)
168 return 0x72 + (4 * (channel & 0x1));
171 enum read_only_registers {
172 /* hardware status register,
173 * reading this apparently clears pending interrupts as well */
175 PIPE1_READ_REG = 0x4,
176 ADC_READ_PNTR_REG = 0x8,
177 LOWER_XFER_REG = 0x10,
178 ADC_WRITE_PNTR_REG = 0xc,
182 enum read_write_registers {
183 I8255_4020_REG = 0x48, /* 8255 offset, for 4020 only */
184 /* external channel/gain queue, uses same bits as ADC_QUEUE_LOAD_REG */
185 ADC_QUEUE_FIFO_REG = 0x100,
186 ADC_FIFO_REG = 0x200, /* adc data fifo */
187 /* dac data fifo, has weird interactions with external channel queue */
188 DAC_FIFO_REG = 0x300,
191 /* devpriv->dio_counter_iobase registers */
192 enum dio_counter_registers {
193 DIO_8255_OFFSET = 0x0,
196 DIO_DIRECTION_60XX_REG = 0x40,
197 DIO_DATA_60XX_REG = 0x48,
200 /* bit definitions for write-only registers */
202 enum intr_enable_contents {
203 ADC_INTR_SRC_MASK = 0x3, /* adc interrupt source mask */
204 ADC_INTR_QFULL_BITS = 0x0, /* interrupt fifo quarter full */
205 ADC_INTR_EOC_BITS = 0x1, /* interrupt end of conversion */
206 ADC_INTR_EOSCAN_BITS = 0x2, /* interrupt end of scan */
207 ADC_INTR_EOSEQ_BITS = 0x3, /* interrupt end of sequence mask */
208 EN_ADC_INTR_SRC_BIT = 0x4, /* enable adc interrupt source */
209 EN_ADC_DONE_INTR_BIT = 0x8, /* enable adc acquisition done intr */
210 DAC_INTR_SRC_MASK = 0x30,
211 DAC_INTR_QEMPTY_BITS = 0x0,
212 DAC_INTR_HIGH_CHAN_BITS = 0x10,
213 EN_DAC_INTR_SRC_BIT = 0x40, /* enable dac interrupt source */
214 EN_DAC_DONE_INTR_BIT = 0x80,
215 EN_ADC_ACTIVE_INTR_BIT = 0x200, /* enable adc active interrupt */
216 EN_ADC_STOP_INTR_BIT = 0x400, /* enable adc stop trigger interrupt */
217 EN_DAC_ACTIVE_INTR_BIT = 0x800, /* enable dac active interrupt */
218 EN_DAC_UNDERRUN_BIT = 0x4000, /* enable dac underrun status bit */
219 EN_ADC_OVERRUN_BIT = 0x8000, /* enable adc overrun status bit */
222 enum hw_config_contents {
223 MASTER_CLOCK_4020_MASK = 0x3, /* master clock source mask for 4020 */
224 INTERNAL_CLOCK_4020_BITS = 0x1, /* use 40 MHz internal master clock */
225 BNC_CLOCK_4020_BITS = 0x2, /* use BNC input for master clock */
226 EXT_CLOCK_4020_BITS = 0x3, /* use dio input for master clock */
227 EXT_QUEUE_BIT = 0x200, /* use external channel/gain queue */
228 /* use 225 nanosec strobe when loading dac instead of 50 nanosec */
229 SLOW_DAC_BIT = 0x400,
230 /* bit with unknown function yet given as default value in pci-das64
232 HW_CONFIG_DUMMY_BITS = 0x2000,
233 /* bit selects channels 1/0 for analog input/output, otherwise 0/1 */
234 DMA_CH_SELECT_BIT = 0x8000,
235 FIFO_SIZE_REG = 0x4, /* allows adjustment of fifo sizes */
236 DAC_FIFO_SIZE_MASK = 0xff00, /* bits that set dac fifo size */
237 DAC_FIFO_BITS = 0xf800, /* 8k sample ao fifo */
239 #define DAC_FIFO_SIZE 0x2000
241 enum daq_atrig_low_4020_contents {
242 /* use trig/ext clk bnc input for analog gate signal */
243 EXT_AGATE_BNC_BIT = 0x8000,
244 /* use trig/ext clk bnc input for external stop trigger signal */
245 EXT_STOP_TRIG_BNC_BIT = 0x4000,
246 /* use trig/ext clk bnc input for external start trigger signal */
247 EXT_START_TRIG_BNC_BIT = 0x2000,
250 static inline uint16_t analog_trig_low_threshold_bits(uint16_t threshold)
252 return threshold & 0xfff;
255 enum adc_control0_contents {
256 ADC_GATE_SRC_MASK = 0x3, /* bits that select gate */
257 ADC_SOFT_GATE_BITS = 0x1, /* software gate */
258 ADC_EXT_GATE_BITS = 0x2, /* external digital gate */
259 ADC_ANALOG_GATE_BITS = 0x3, /* analog level gate */
260 ADC_GATE_LEVEL_BIT = 0x4, /* level-sensitive gate (for digital) */
261 ADC_GATE_POLARITY_BIT = 0x8, /* gate active low */
262 ADC_START_TRIG_SOFT_BITS = 0x10,
263 ADC_START_TRIG_EXT_BITS = 0x20,
264 ADC_START_TRIG_ANALOG_BITS = 0x30,
265 ADC_START_TRIG_MASK = 0x30,
266 ADC_START_TRIG_FALLING_BIT = 0x40, /* trig 1 uses falling edge */
267 /* external pacing uses falling edge */
268 ADC_EXT_CONV_FALLING_BIT = 0x800,
269 /* enable hardware scan counter */
270 ADC_SAMPLE_COUNTER_EN_BIT = 0x1000,
271 ADC_DMA_DISABLE_BIT = 0x4000, /* disables dma */
272 ADC_ENABLE_BIT = 0x8000, /* master adc enable */
275 enum adc_control1_contents {
276 /* should be set for boards with > 16 channels */
277 ADC_QUEUE_CONFIG_BIT = 0x1,
278 CONVERT_POLARITY_BIT = 0x10,
279 EOC_POLARITY_BIT = 0x20,
280 ADC_SW_GATE_BIT = 0x40, /* software gate of adc */
281 ADC_DITHER_BIT = 0x200, /* turn on extra noise for dithering */
282 RETRIGGER_BIT = 0x800,
283 ADC_LO_CHANNEL_4020_MASK = 0x300,
284 ADC_HI_CHANNEL_4020_MASK = 0xc00,
285 TWO_CHANNEL_4020_BITS = 0x1000, /* two channel mode for 4020 */
286 FOUR_CHANNEL_4020_BITS = 0x2000, /* four channel mode for 4020 */
287 CHANNEL_MODE_4020_MASK = 0x3000,
288 ADC_MODE_MASK = 0xf000,
291 static inline uint16_t adc_lo_chan_4020_bits(unsigned int channel)
293 return (channel & 0x3) << 8;
296 static inline uint16_t adc_hi_chan_4020_bits(unsigned int channel)
298 return (channel & 0x3) << 10;
301 static inline uint16_t adc_mode_bits(unsigned int mode)
303 return (mode & 0xf) << 12;
306 enum calibration_contents {
307 SELECT_8800_BIT = 0x1,
308 SELECT_8402_64XX_BIT = 0x2,
309 SELECT_1590_60XX_BIT = 0x2,
310 CAL_EN_64XX_BIT = 0x40, /* calibration enable for 64xx series */
311 SERIAL_DATA_IN_BIT = 0x80,
312 SERIAL_CLOCK_BIT = 0x100,
313 CAL_EN_60XX_BIT = 0x200, /* calibration enable for 60xx series */
314 CAL_GAIN_BIT = 0x800,
317 /* calibration sources for 6025 are:
328 static inline uint16_t adc_src_bits(unsigned int source)
330 return (source & 0xf) << 3;
333 static inline uint16_t adc_convert_chan_4020_bits(unsigned int channel)
335 return (channel & 0x3) << 8;
338 enum adc_queue_load_contents {
339 UNIP_BIT = 0x800, /* unipolar/bipolar bit */
340 ADC_SE_DIFF_BIT = 0x1000, /* single-ended/ differential bit */
341 /* non-referenced single-ended (common-mode input) */
342 ADC_COMMON_BIT = 0x2000,
343 QUEUE_EOSEQ_BIT = 0x4000, /* queue end of sequence */
344 QUEUE_EOSCAN_BIT = 0x8000, /* queue end of scan */
347 static inline uint16_t adc_chan_bits(unsigned int channel)
349 return channel & 0x3f;
352 enum dac_control0_contents {
353 DAC_ENABLE_BIT = 0x8000, /* dac controller enable bit */
354 DAC_CYCLIC_STOP_BIT = 0x4000,
355 DAC_WAVEFORM_MODE_BIT = 0x100,
356 DAC_EXT_UPDATE_FALLING_BIT = 0x80,
357 DAC_EXT_UPDATE_ENABLE_BIT = 0x40,
358 WAVEFORM_TRIG_MASK = 0x30,
359 WAVEFORM_TRIG_DISABLED_BITS = 0x0,
360 WAVEFORM_TRIG_SOFT_BITS = 0x10,
361 WAVEFORM_TRIG_EXT_BITS = 0x20,
362 WAVEFORM_TRIG_ADC1_BITS = 0x30,
363 WAVEFORM_TRIG_FALLING_BIT = 0x8,
364 WAVEFORM_GATE_LEVEL_BIT = 0x4,
365 WAVEFORM_GATE_ENABLE_BIT = 0x2,
366 WAVEFORM_GATE_SELECT_BIT = 0x1,
369 enum dac_control1_contents {
370 DAC_WRITE_POLARITY_BIT = 0x800, /* board-dependent setting */
371 DAC1_EXT_REF_BIT = 0x200,
372 DAC0_EXT_REF_BIT = 0x100,
373 DAC_OUTPUT_ENABLE_BIT = 0x80, /* dac output enable bit */
374 DAC_UPDATE_POLARITY_BIT = 0x40, /* board-dependent setting */
375 DAC_SW_GATE_BIT = 0x20,
376 DAC1_UNIPOLAR_BIT = 0x8,
377 DAC0_UNIPOLAR_BIT = 0x2,
380 /* bit definitions for read-only registers */
381 enum hw_status_contents {
382 DAC_UNDERRUN_BIT = 0x1,
383 ADC_OVERRUN_BIT = 0x2,
384 DAC_ACTIVE_BIT = 0x4,
385 ADC_ACTIVE_BIT = 0x8,
386 DAC_INTR_PENDING_BIT = 0x10,
387 ADC_INTR_PENDING_BIT = 0x20,
390 EXT_INTR_PENDING_BIT = 0x100,
391 ADC_STOP_BIT = 0x200,
394 static inline uint16_t pipe_full_bits(uint16_t hw_status_bits)
396 return (hw_status_bits >> 10) & 0x3;
399 static inline unsigned int dma_chain_flag_bits(uint16_t prepost_bits)
401 return (prepost_bits >> 6) & 0x3;
404 static inline unsigned int adc_upper_read_ptr_code(uint16_t prepost_bits)
406 return (prepost_bits >> 12) & 0x3;
409 static inline unsigned int adc_upper_write_ptr_code(uint16_t prepost_bits)
411 return (prepost_bits >> 14) & 0x3;
414 /* I2C addresses for 4020 */
416 RANGE_CAL_I2C_ADDR = 0x20,
417 CALDAC0_I2C_ADDR = 0xc,
418 CALDAC1_I2C_ADDR = 0xd,
421 enum range_cal_i2c_contents {
422 /* bits that set what source the adc converter measures */
423 ADC_SRC_4020_MASK = 0x70,
424 /* make bnc trig/ext clock threshold 0V instead of 2.5V */
425 BNC_TRIG_THRESHOLD_0V_BIT = 0x80,
428 static inline uint8_t adc_src_4020_bits(unsigned int source)
430 return (source << 4) & ADC_SRC_4020_MASK;
433 static inline uint8_t attenuate_bit(unsigned int channel)
435 /* attenuate channel (+-5V input range) */
436 return 1 << (channel & 0x3);
439 /* analog input ranges for 64xx boards */
440 static const struct comedi_lrange ai_ranges_64xx = {
454 /* analog input ranges for 60xx boards */
455 static const struct comedi_lrange ai_ranges_60xx = {
465 /* analog input ranges for 6030, etc boards */
466 static const struct comedi_lrange ai_ranges_6030 = {
486 /* analog input ranges for 6052, etc boards */
487 static const struct comedi_lrange ai_ranges_6052 = {
508 /* analog input ranges for 4020 board */
509 static const struct comedi_lrange ai_ranges_4020 = {
517 /* analog output ranges */
518 static const struct comedi_lrange ao_ranges_64xx = {
528 static const int ao_range_code_64xx[] = {
535 static const int ao_range_code_60xx[] = {
539 static const struct comedi_lrange ao_ranges_6030 = {
547 static const int ao_range_code_6030[] = {
552 static const struct comedi_lrange ao_ranges_4020 = {
560 static const int ao_range_code_4020[] = {
565 enum register_layout {
571 struct hw_fifo_info {
572 unsigned int num_segments;
573 unsigned int max_segment_length;
574 unsigned int sample_packing_ratio;
575 uint16_t fifo_size_reg_mask;
578 enum pcidas64_boardid {
581 BOARD_PCIDAS64_M1_16,
582 BOARD_PCIDAS64_M2_16,
583 BOARD_PCIDAS64_M3_16,
600 BOARD_PCIDAS6402_16_JR,
601 BOARD_PCIDAS64_M1_16_JR,
602 BOARD_PCIDAS64_M2_16_JR,
603 BOARD_PCIDAS64_M3_16_JR,
604 BOARD_PCIDAS64_M1_14,
605 BOARD_PCIDAS64_M2_14,
606 BOARD_PCIDAS64_M3_14,
609 struct pcidas64_board {
611 int ai_se_chans; /* number of ai inputs in single-ended mode */
612 int ai_bits; /* analog input resolution */
613 int ai_speed; /* fastest conversion period in ns */
614 const struct comedi_lrange *ai_range_table;
615 int ao_nchan; /* number of analog out channels */
616 int ao_bits; /* analog output resolution */
617 int ao_scan_speed; /* analog output scan speed */
618 const struct comedi_lrange *ao_range_table;
619 const int *ao_range_code;
620 const struct hw_fifo_info *const ai_fifo;
621 /* different board families have slightly different registers */
622 enum register_layout layout;
626 static const struct hw_fifo_info ai_fifo_4020 = {
628 .max_segment_length = 0x8000,
629 .sample_packing_ratio = 2,
630 .fifo_size_reg_mask = 0x7f,
633 static const struct hw_fifo_info ai_fifo_64xx = {
635 .max_segment_length = 0x800,
636 .sample_packing_ratio = 1,
637 .fifo_size_reg_mask = 0x3f,
640 static const struct hw_fifo_info ai_fifo_60xx = {
642 .max_segment_length = 0x800,
643 .sample_packing_ratio = 1,
644 .fifo_size_reg_mask = 0x7f,
647 /* maximum number of dma transfers we will chain together into a ring
648 * (and the maximum number of dma buffers we maintain) */
649 #define MAX_AI_DMA_RING_COUNT (0x80000 / DMA_BUFFER_SIZE)
650 #define MIN_AI_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
651 #define AO_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
652 static inline unsigned int ai_dma_ring_count(const struct pcidas64_board *board)
654 if (board->layout == LAYOUT_4020)
655 return MAX_AI_DMA_RING_COUNT;
657 return MIN_AI_DMA_RING_COUNT;
660 static const int bytes_in_sample = 2;
662 static const struct pcidas64_board pcidas64_boards[] = {
663 [BOARD_PCIDAS6402_16] = {
664 .name = "pci-das6402/16",
670 .ao_scan_speed = 10000,
671 .layout = LAYOUT_64XX,
672 .ai_range_table = &ai_ranges_64xx,
673 .ao_range_table = &ao_ranges_64xx,
674 .ao_range_code = ao_range_code_64xx,
675 .ai_fifo = &ai_fifo_64xx,
678 [BOARD_PCIDAS6402_12] = {
679 .name = "pci-das6402/12", /* XXX check */
685 .ao_scan_speed = 10000,
686 .layout = LAYOUT_64XX,
687 .ai_range_table = &ai_ranges_64xx,
688 .ao_range_table = &ao_ranges_64xx,
689 .ao_range_code = ao_range_code_64xx,
690 .ai_fifo = &ai_fifo_64xx,
693 [BOARD_PCIDAS64_M1_16] = {
694 .name = "pci-das64/m1/16",
700 .ao_scan_speed = 10000,
701 .layout = LAYOUT_64XX,
702 .ai_range_table = &ai_ranges_64xx,
703 .ao_range_table = &ao_ranges_64xx,
704 .ao_range_code = ao_range_code_64xx,
705 .ai_fifo = &ai_fifo_64xx,
708 [BOARD_PCIDAS64_M2_16] = {
709 .name = "pci-das64/m2/16",
715 .ao_scan_speed = 10000,
716 .layout = LAYOUT_64XX,
717 .ai_range_table = &ai_ranges_64xx,
718 .ao_range_table = &ao_ranges_64xx,
719 .ao_range_code = ao_range_code_64xx,
720 .ai_fifo = &ai_fifo_64xx,
723 [BOARD_PCIDAS64_M3_16] = {
724 .name = "pci-das64/m3/16",
730 .ao_scan_speed = 10000,
731 .layout = LAYOUT_64XX,
732 .ai_range_table = &ai_ranges_64xx,
733 .ao_range_table = &ao_ranges_64xx,
734 .ao_range_code = ao_range_code_64xx,
735 .ai_fifo = &ai_fifo_64xx,
738 [BOARD_PCIDAS6013] = {
739 .name = "pci-das6013",
745 .layout = LAYOUT_60XX,
746 .ai_range_table = &ai_ranges_60xx,
747 .ao_range_table = &range_bipolar10,
748 .ao_range_code = ao_range_code_60xx,
749 .ai_fifo = &ai_fifo_60xx,
752 [BOARD_PCIDAS6014] = {
753 .name = "pci-das6014",
759 .ao_scan_speed = 100000,
760 .layout = LAYOUT_60XX,
761 .ai_range_table = &ai_ranges_60xx,
762 .ao_range_table = &range_bipolar10,
763 .ao_range_code = ao_range_code_60xx,
764 .ai_fifo = &ai_fifo_60xx,
767 [BOARD_PCIDAS6023] = {
768 .name = "pci-das6023",
773 .ao_scan_speed = 100000,
774 .layout = LAYOUT_60XX,
775 .ai_range_table = &ai_ranges_60xx,
776 .ao_range_table = &range_bipolar10,
777 .ao_range_code = ao_range_code_60xx,
778 .ai_fifo = &ai_fifo_60xx,
781 [BOARD_PCIDAS6025] = {
782 .name = "pci-das6025",
788 .ao_scan_speed = 100000,
789 .layout = LAYOUT_60XX,
790 .ai_range_table = &ai_ranges_60xx,
791 .ao_range_table = &range_bipolar10,
792 .ao_range_code = ao_range_code_60xx,
793 .ai_fifo = &ai_fifo_60xx,
796 [BOARD_PCIDAS6030] = {
797 .name = "pci-das6030",
803 .ao_scan_speed = 10000,
804 .layout = LAYOUT_60XX,
805 .ai_range_table = &ai_ranges_6030,
806 .ao_range_table = &ao_ranges_6030,
807 .ao_range_code = ao_range_code_6030,
808 .ai_fifo = &ai_fifo_60xx,
811 [BOARD_PCIDAS6031] = {
812 .name = "pci-das6031",
818 .ao_scan_speed = 10000,
819 .layout = LAYOUT_60XX,
820 .ai_range_table = &ai_ranges_6030,
821 .ao_range_table = &ao_ranges_6030,
822 .ao_range_code = ao_range_code_6030,
823 .ai_fifo = &ai_fifo_60xx,
826 [BOARD_PCIDAS6032] = {
827 .name = "pci-das6032",
832 .layout = LAYOUT_60XX,
833 .ai_range_table = &ai_ranges_6030,
834 .ai_fifo = &ai_fifo_60xx,
837 [BOARD_PCIDAS6033] = {
838 .name = "pci-das6033",
843 .layout = LAYOUT_60XX,
844 .ai_range_table = &ai_ranges_6030,
845 .ai_fifo = &ai_fifo_60xx,
848 [BOARD_PCIDAS6034] = {
849 .name = "pci-das6034",
855 .layout = LAYOUT_60XX,
856 .ai_range_table = &ai_ranges_60xx,
857 .ai_fifo = &ai_fifo_60xx,
860 [BOARD_PCIDAS6035] = {
861 .name = "pci-das6035",
867 .ao_scan_speed = 100000,
868 .layout = LAYOUT_60XX,
869 .ai_range_table = &ai_ranges_60xx,
870 .ao_range_table = &range_bipolar10,
871 .ao_range_code = ao_range_code_60xx,
872 .ai_fifo = &ai_fifo_60xx,
875 [BOARD_PCIDAS6036] = {
876 .name = "pci-das6036",
882 .ao_scan_speed = 100000,
883 .layout = LAYOUT_60XX,
884 .ai_range_table = &ai_ranges_60xx,
885 .ao_range_table = &range_bipolar10,
886 .ao_range_code = ao_range_code_60xx,
887 .ai_fifo = &ai_fifo_60xx,
890 [BOARD_PCIDAS6040] = {
891 .name = "pci-das6040",
897 .ao_scan_speed = 1000,
898 .layout = LAYOUT_60XX,
899 .ai_range_table = &ai_ranges_6052,
900 .ao_range_table = &ao_ranges_6030,
901 .ao_range_code = ao_range_code_6030,
902 .ai_fifo = &ai_fifo_60xx,
905 [BOARD_PCIDAS6052] = {
906 .name = "pci-das6052",
912 .ao_scan_speed = 3333,
913 .layout = LAYOUT_60XX,
914 .ai_range_table = &ai_ranges_6052,
915 .ao_range_table = &ao_ranges_6030,
916 .ao_range_code = ao_range_code_6030,
917 .ai_fifo = &ai_fifo_60xx,
920 [BOARD_PCIDAS6070] = {
921 .name = "pci-das6070",
927 .ao_scan_speed = 1000,
928 .layout = LAYOUT_60XX,
929 .ai_range_table = &ai_ranges_6052,
930 .ao_range_table = &ao_ranges_6030,
931 .ao_range_code = ao_range_code_6030,
932 .ai_fifo = &ai_fifo_60xx,
935 [BOARD_PCIDAS6071] = {
936 .name = "pci-das6071",
942 .ao_scan_speed = 1000,
943 .layout = LAYOUT_60XX,
944 .ai_range_table = &ai_ranges_6052,
945 .ao_range_table = &ao_ranges_6030,
946 .ao_range_code = ao_range_code_6030,
947 .ai_fifo = &ai_fifo_60xx,
950 [BOARD_PCIDAS4020_12] = {
951 .name = "pci-das4020/12",
957 .ao_scan_speed = 0, /* no hardware pacing on ao */
958 .layout = LAYOUT_4020,
959 .ai_range_table = &ai_ranges_4020,
960 .ao_range_table = &ao_ranges_4020,
961 .ao_range_code = ao_range_code_4020,
962 .ai_fifo = &ai_fifo_4020,
967 * The device id for these boards is unknown
970 [BOARD_PCIDAS6402_16_JR] = {
971 .name = "pci-das6402/16/jr",
976 .ao_scan_speed = 10000,
977 .layout = LAYOUT_64XX,
978 .ai_range_table = &ai_ranges_64xx,
979 .ai_fifo = ai_fifo_64xx,
982 [BOARD_PCIDAS64_M1_16_JR] = {
983 .name = "pci-das64/m1/16/jr",
988 .ao_scan_speed = 10000,
989 .layout = LAYOUT_64XX,
990 .ai_range_table = &ai_ranges_64xx,
991 .ai_fifo = ai_fifo_64xx,
994 [BOARD_PCIDAS64_M2_16_JR] = {
995 .name = "pci-das64/m2/16/jr",
1000 .ao_scan_speed = 10000,
1001 .layout = LAYOUT_64XX,
1002 .ai_range_table = &ai_ranges_64xx,
1003 .ai_fifo = ai_fifo_64xx,
1006 [BOARD_PCIDAS64_M3_16_JR] = {
1007 .name = "pci-das64/m3/16/jr",
1012 .ao_scan_speed = 10000,
1013 .layout = LAYOUT_64XX,
1014 .ai_range_table = &ai_ranges_64xx,
1015 .ai_fifo = ai_fifo_64xx,
1018 [BOARD_PCIDAS64_M1_14] = {
1019 .name = "pci-das64/m1/14",
1024 .ao_scan_speed = 10000,
1025 .layout = LAYOUT_64XX,
1026 .ai_range_table = &ai_ranges_64xx,
1027 .ai_fifo = ai_fifo_64xx,
1030 [BOARD_PCIDAS64_M2_14] = {
1031 .name = "pci-das64/m2/14",
1036 .ao_scan_speed = 10000,
1037 .layout = LAYOUT_64XX,
1038 .ai_range_table = &ai_ranges_64xx,
1039 .ai_fifo = ai_fifo_64xx,
1042 [BOARD_PCIDAS64_M3_14] = {
1043 .name = "pci-das64/m3/14",
1048 .ao_scan_speed = 10000,
1049 .layout = LAYOUT_64XX,
1050 .ai_range_table = &ai_ranges_64xx,
1051 .ai_fifo = ai_fifo_64xx,
1057 static inline unsigned short se_diff_bit_6xxx(struct comedi_device *dev,
1058 int use_differential)
1060 const struct pcidas64_board *thisboard = comedi_board(dev);
1062 if ((thisboard->layout == LAYOUT_64XX && !use_differential) ||
1063 (thisboard->layout == LAYOUT_60XX && use_differential))
1064 return ADC_SE_DIFF_BIT;
1069 struct ext_clock_info {
1070 /* master clock divisor to use for scans with external master clock */
1071 unsigned int divisor;
1072 /* chanspec for master clock input when used as scan begin src */
1073 unsigned int chanspec;
1076 /* this structure is for data unique to this hardware driver. */
1077 struct pcidas64_private {
1078 /* base addresses (physical) */
1079 resource_size_t main_phys_iobase;
1080 resource_size_t dio_counter_phys_iobase;
1081 /* base addresses (ioremapped) */
1082 void __iomem *plx9080_iobase;
1083 void __iomem *main_iobase;
1084 void __iomem *dio_counter_iobase;
1085 /* local address (used by dma controller) */
1086 uint32_t local0_iobase;
1087 uint32_t local1_iobase;
1088 /* number of analog input samples remaining */
1089 volatile unsigned int ai_count;
1090 /* dma buffers for analog input */
1091 uint16_t *ai_buffer[MAX_AI_DMA_RING_COUNT];
1092 /* physical addresses of ai dma buffers */
1093 dma_addr_t ai_buffer_bus_addr[MAX_AI_DMA_RING_COUNT];
1094 /* array of ai dma descriptors read by plx9080,
1095 * allocated to get proper alignment */
1096 struct plx_dma_desc *ai_dma_desc;
1097 /* physical address of ai dma descriptor array */
1098 dma_addr_t ai_dma_desc_bus_addr;
1099 /* index of the ai dma descriptor/buffer
1100 * that is currently being used */
1101 volatile unsigned int ai_dma_index;
1102 /* dma buffers for analog output */
1103 uint16_t *ao_buffer[AO_DMA_RING_COUNT];
1104 /* physical addresses of ao dma buffers */
1105 dma_addr_t ao_buffer_bus_addr[AO_DMA_RING_COUNT];
1106 struct plx_dma_desc *ao_dma_desc;
1107 dma_addr_t ao_dma_desc_bus_addr;
1108 /* keeps track of buffer where the next ao sample should go */
1109 volatile unsigned int ao_dma_index;
1110 /* number of analog output samples remaining */
1111 volatile unsigned long ao_count;
1112 /* remember what the analog outputs are set to, to allow readback */
1113 volatile unsigned int ao_value[2];
1114 unsigned int hw_revision; /* stc chip hardware revision number */
1115 /* last bits sent to INTR_ENABLE_REG register */
1116 volatile unsigned int intr_enable_bits;
1117 /* last bits sent to ADC_CONTROL1_REG register */
1118 volatile uint16_t adc_control1_bits;
1119 /* last bits sent to FIFO_SIZE_REG register */
1120 volatile uint16_t fifo_size_bits;
1121 /* last bits sent to HW_CONFIG_REG register */
1122 volatile uint16_t hw_config_bits;
1123 volatile uint16_t dac_control1_bits;
1124 /* last bits written to plx9080 control register */
1125 volatile uint32_t plx_control_bits;
1126 /* last bits written to plx interrupt control and status register */
1127 volatile uint32_t plx_intcsr_bits;
1128 /* index of calibration source readable through ai ch0 */
1129 volatile int calibration_source;
1130 /* bits written to i2c calibration/range register */
1131 volatile uint8_t i2c_cal_range_bits;
1132 /* configure digital triggers to trigger on falling edge */
1133 volatile unsigned int ext_trig_falling;
1134 /* states of various devices stored to enable read-back */
1135 unsigned int ad8402_state[2];
1136 unsigned int caldac_state[8];
1137 volatile short ai_cmd_running;
1138 unsigned int ai_fifo_segment_length;
1139 struct ext_clock_info ext_clock;
1140 unsigned short ao_bounce_buffer[DAC_FIFO_SIZE];
1143 static unsigned int ai_range_bits_6xxx(const struct comedi_device *dev,
1144 unsigned int range_index)
1146 const struct pcidas64_board *thisboard = comedi_board(dev);
1147 const struct comedi_krange *range =
1148 &thisboard->ai_range_table->range[range_index];
1149 unsigned int bits = 0;
1151 switch (range->max) {
1180 comedi_error(dev, "bug! in ai_range_bits_6xxx");
1183 if (range->min == 0)
1188 static unsigned int hw_revision(const struct comedi_device *dev,
1189 uint16_t hw_status_bits)
1191 const struct pcidas64_board *thisboard = comedi_board(dev);
1193 if (thisboard->layout == LAYOUT_4020)
1194 return (hw_status_bits >> 13) & 0x7;
1196 return (hw_status_bits >> 12) & 0xf;
1199 static void set_dac_range_bits(struct comedi_device *dev,
1200 volatile uint16_t *bits, unsigned int channel,
1203 const struct pcidas64_board *thisboard = comedi_board(dev);
1204 unsigned int code = thisboard->ao_range_code[range];
1207 comedi_error(dev, "bug! bad channel?");
1209 comedi_error(dev, "bug! bad range code?");
1211 *bits &= ~(0x3 << (2 * channel));
1212 *bits |= code << (2 * channel);
1215 static inline int ao_cmd_is_supported(const struct pcidas64_board *board)
1217 return board->ao_nchan && board->layout != LAYOUT_4020;
1220 static void abort_dma(struct comedi_device *dev, unsigned int channel)
1222 struct pcidas64_private *devpriv = dev->private;
1223 unsigned long flags;
1225 /* spinlock for plx dma control/status reg */
1226 spin_lock_irqsave(&dev->spinlock, flags);
1228 plx9080_abort_dma(devpriv->plx9080_iobase, channel);
1230 spin_unlock_irqrestore(&dev->spinlock, flags);
1233 static void disable_plx_interrupts(struct comedi_device *dev)
1235 struct pcidas64_private *devpriv = dev->private;
1237 devpriv->plx_intcsr_bits = 0;
1238 writel(devpriv->plx_intcsr_bits,
1239 devpriv->plx9080_iobase + PLX_INTRCS_REG);
1242 static void disable_ai_interrupts(struct comedi_device *dev)
1244 struct pcidas64_private *devpriv = dev->private;
1245 unsigned long flags;
1247 spin_lock_irqsave(&dev->spinlock, flags);
1248 devpriv->intr_enable_bits &=
1249 ~EN_ADC_INTR_SRC_BIT & ~EN_ADC_DONE_INTR_BIT &
1250 ~EN_ADC_ACTIVE_INTR_BIT & ~EN_ADC_STOP_INTR_BIT &
1251 ~EN_ADC_OVERRUN_BIT & ~ADC_INTR_SRC_MASK;
1252 writew(devpriv->intr_enable_bits,
1253 devpriv->main_iobase + INTR_ENABLE_REG);
1254 spin_unlock_irqrestore(&dev->spinlock, flags);
1256 DEBUG_PRINT("intr enable bits 0x%x\n", devpriv->intr_enable_bits);
1259 static void enable_ai_interrupts(struct comedi_device *dev,
1260 const struct comedi_cmd *cmd)
1262 const struct pcidas64_board *thisboard = comedi_board(dev);
1263 struct pcidas64_private *devpriv = dev->private;
1265 unsigned long flags;
1267 bits = EN_ADC_OVERRUN_BIT | EN_ADC_DONE_INTR_BIT |
1268 EN_ADC_ACTIVE_INTR_BIT | EN_ADC_STOP_INTR_BIT;
1269 /* Use pio transfer and interrupt on end of conversion
1270 * if TRIG_WAKE_EOS flag is set. */
1271 if (cmd->flags & TRIG_WAKE_EOS) {
1272 /* 4020 doesn't support pio transfers except for fifo dregs */
1273 if (thisboard->layout != LAYOUT_4020)
1274 bits |= ADC_INTR_EOSCAN_BITS | EN_ADC_INTR_SRC_BIT;
1276 spin_lock_irqsave(&dev->spinlock, flags);
1277 devpriv->intr_enable_bits |= bits;
1278 writew(devpriv->intr_enable_bits,
1279 devpriv->main_iobase + INTR_ENABLE_REG);
1280 DEBUG_PRINT("intr enable bits 0x%x\n", devpriv->intr_enable_bits);
1281 spin_unlock_irqrestore(&dev->spinlock, flags);
1284 /* initialize plx9080 chip */
1285 static void init_plx9080(struct comedi_device *dev)
1287 const struct pcidas64_board *thisboard = comedi_board(dev);
1288 struct pcidas64_private *devpriv = dev->private;
1290 void __iomem *plx_iobase = devpriv->plx9080_iobase;
1292 devpriv->plx_control_bits =
1293 readl(devpriv->plx9080_iobase + PLX_CONTROL_REG);
1296 DEBUG_PRINT(" plx interrupt status 0x%x\n",
1297 readl(plx_iobase + PLX_INTRCS_REG));
1298 DEBUG_PRINT(" plx id bits 0x%x\n", readl(plx_iobase + PLX_ID_REG));
1299 DEBUG_PRINT(" plx control reg 0x%x\n", devpriv->plx_control_bits);
1300 DEBUG_PRINT(" plx mode/arbitration reg 0x%x\n",
1301 readl(plx_iobase + PLX_MARB_REG));
1302 DEBUG_PRINT(" plx region0 reg 0x%x\n",
1303 readl(plx_iobase + PLX_REGION0_REG));
1304 DEBUG_PRINT(" plx region1 reg 0x%x\n",
1305 readl(plx_iobase + PLX_REGION1_REG));
1307 DEBUG_PRINT(" plx revision 0x%x\n",
1308 readl(plx_iobase + PLX_REVISION_REG));
1309 DEBUG_PRINT(" plx dma channel 0 mode 0x%x\n",
1310 readl(plx_iobase + PLX_DMA0_MODE_REG));
1311 DEBUG_PRINT(" plx dma channel 1 mode 0x%x\n",
1312 readl(plx_iobase + PLX_DMA1_MODE_REG));
1313 DEBUG_PRINT(" plx dma channel 0 pci address 0x%x\n",
1314 readl(plx_iobase + PLX_DMA0_PCI_ADDRESS_REG));
1315 DEBUG_PRINT(" plx dma channel 0 local address 0x%x\n",
1316 readl(plx_iobase + PLX_DMA0_LOCAL_ADDRESS_REG));
1317 DEBUG_PRINT(" plx dma channel 0 transfer size 0x%x\n",
1318 readl(plx_iobase + PLX_DMA0_TRANSFER_SIZE_REG));
1319 DEBUG_PRINT(" plx dma channel 0 descriptor 0x%x\n",
1320 readl(plx_iobase + PLX_DMA0_DESCRIPTOR_REG));
1321 DEBUG_PRINT(" plx dma channel 0 command status 0x%x\n",
1322 readb(plx_iobase + PLX_DMA0_CS_REG));
1323 DEBUG_PRINT(" plx dma channel 0 threshold 0x%x\n",
1324 readl(plx_iobase + PLX_DMA0_THRESHOLD_REG));
1325 DEBUG_PRINT(" plx bigend 0x%x\n", readl(plx_iobase + PLX_BIGEND_REG));
1328 bits = BIGEND_DMA0 | BIGEND_DMA1;
1332 writel(bits, devpriv->plx9080_iobase + PLX_BIGEND_REG);
1334 disable_plx_interrupts(dev);
1339 /* configure dma0 mode */
1341 /* enable ready input, not sure if this is necessary */
1342 bits |= PLX_DMA_EN_READYIN_BIT;
1343 /* enable bterm, not sure if this is necessary */
1344 bits |= PLX_EN_BTERM_BIT;
1345 /* enable dma chaining */
1346 bits |= PLX_EN_CHAIN_BIT;
1347 /* enable interrupt on dma done
1348 * (probably don't need this, since chain never finishes) */
1349 bits |= PLX_EN_DMA_DONE_INTR_BIT;
1350 /* don't increment local address during transfers
1351 * (we are transferring from a fixed fifo register) */
1352 bits |= PLX_LOCAL_ADDR_CONST_BIT;
1353 /* route dma interrupt to pci bus */
1354 bits |= PLX_DMA_INTR_PCI_BIT;
1355 /* enable demand mode */
1356 bits |= PLX_DEMAND_MODE_BIT;
1357 /* enable local burst mode */
1358 bits |= PLX_DMA_LOCAL_BURST_EN_BIT;
1359 /* 4020 uses 32 bit dma */
1360 if (thisboard->layout == LAYOUT_4020)
1361 bits |= PLX_LOCAL_BUS_32_WIDE_BITS;
1362 else /* localspace0 bus is 16 bits wide */
1363 bits |= PLX_LOCAL_BUS_16_WIDE_BITS;
1364 writel(bits, plx_iobase + PLX_DMA1_MODE_REG);
1365 if (ao_cmd_is_supported(thisboard))
1366 writel(bits, plx_iobase + PLX_DMA0_MODE_REG);
1368 /* enable interrupts on plx 9080 */
1369 devpriv->plx_intcsr_bits |=
1370 ICS_AERR | ICS_PERR | ICS_PIE | ICS_PLIE | ICS_PAIE | ICS_LIE |
1371 ICS_DMA0_E | ICS_DMA1_E;
1372 writel(devpriv->plx_intcsr_bits,
1373 devpriv->plx9080_iobase + PLX_INTRCS_REG);
1376 static void disable_ai_pacing(struct comedi_device *dev)
1378 struct pcidas64_private *devpriv = dev->private;
1379 unsigned long flags;
1381 disable_ai_interrupts(dev);
1383 spin_lock_irqsave(&dev->spinlock, flags);
1384 devpriv->adc_control1_bits &= ~ADC_SW_GATE_BIT;
1385 writew(devpriv->adc_control1_bits,
1386 devpriv->main_iobase + ADC_CONTROL1_REG);
1387 spin_unlock_irqrestore(&dev->spinlock, flags);
1389 /* disable pacing, triggering, etc */
1390 writew(ADC_DMA_DISABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT,
1391 devpriv->main_iobase + ADC_CONTROL0_REG);
1394 static int set_ai_fifo_segment_length(struct comedi_device *dev,
1395 unsigned int num_entries)
1397 const struct pcidas64_board *thisboard = comedi_board(dev);
1398 struct pcidas64_private *devpriv = dev->private;
1399 static const int increment_size = 0x100;
1400 const struct hw_fifo_info *const fifo = thisboard->ai_fifo;
1401 unsigned int num_increments;
1404 if (num_entries < increment_size)
1405 num_entries = increment_size;
1406 if (num_entries > fifo->max_segment_length)
1407 num_entries = fifo->max_segment_length;
1409 /* 1 == 256 entries, 2 == 512 entries, etc */
1410 num_increments = (num_entries + increment_size / 2) / increment_size;
1412 bits = (~(num_increments - 1)) & fifo->fifo_size_reg_mask;
1413 devpriv->fifo_size_bits &= ~fifo->fifo_size_reg_mask;
1414 devpriv->fifo_size_bits |= bits;
1415 writew(devpriv->fifo_size_bits,
1416 devpriv->main_iobase + FIFO_SIZE_REG);
1418 devpriv->ai_fifo_segment_length = num_increments * increment_size;
1420 DEBUG_PRINT("set hardware fifo segment length to %i\n",
1421 devpriv->ai_fifo_segment_length);
1423 return devpriv->ai_fifo_segment_length;
1426 /* adjusts the size of hardware fifo (which determines block size for dma xfers) */
1427 static int set_ai_fifo_size(struct comedi_device *dev, unsigned int num_samples)
1429 const struct pcidas64_board *thisboard = comedi_board(dev);
1430 unsigned int num_fifo_entries;
1432 const struct hw_fifo_info *const fifo = thisboard->ai_fifo;
1434 num_fifo_entries = num_samples / fifo->sample_packing_ratio;
1436 retval = set_ai_fifo_segment_length(dev,
1438 fifo->num_segments);
1442 num_samples = retval * fifo->num_segments * fifo->sample_packing_ratio;
1444 DEBUG_PRINT("set hardware fifo size to %i\n", num_samples);
1449 /* query length of fifo */
1450 static unsigned int ai_fifo_size(struct comedi_device *dev)
1452 const struct pcidas64_board *thisboard = comedi_board(dev);
1453 struct pcidas64_private *devpriv = dev->private;
1455 return devpriv->ai_fifo_segment_length *
1456 thisboard->ai_fifo->num_segments *
1457 thisboard->ai_fifo->sample_packing_ratio;
1460 static void init_stc_registers(struct comedi_device *dev)
1462 const struct pcidas64_board *thisboard = comedi_board(dev);
1463 struct pcidas64_private *devpriv = dev->private;
1465 unsigned long flags;
1467 spin_lock_irqsave(&dev->spinlock, flags);
1469 /* bit should be set for 6025,
1470 * although docs say boards with <= 16 chans should be cleared XXX */
1472 devpriv->adc_control1_bits |= ADC_QUEUE_CONFIG_BIT;
1473 writew(devpriv->adc_control1_bits,
1474 devpriv->main_iobase + ADC_CONTROL1_REG);
1476 /* 6402/16 manual says this register must be initialized to 0xff? */
1477 writew(0xff, devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1479 bits = SLOW_DAC_BIT | DMA_CH_SELECT_BIT;
1480 if (thisboard->layout == LAYOUT_4020)
1481 bits |= INTERNAL_CLOCK_4020_BITS;
1482 devpriv->hw_config_bits |= bits;
1483 writew(devpriv->hw_config_bits,
1484 devpriv->main_iobase + HW_CONFIG_REG);
1486 writew(0, devpriv->main_iobase + DAQ_SYNC_REG);
1487 writew(0, devpriv->main_iobase + CALIBRATION_REG);
1489 spin_unlock_irqrestore(&dev->spinlock, flags);
1491 /* set fifos to maximum size */
1492 devpriv->fifo_size_bits |= DAC_FIFO_BITS;
1493 set_ai_fifo_segment_length(dev,
1494 thisboard->ai_fifo->max_segment_length);
1496 devpriv->dac_control1_bits = DAC_OUTPUT_ENABLE_BIT;
1497 devpriv->intr_enable_bits =
1498 /* EN_DAC_INTR_SRC_BIT | DAC_INTR_QEMPTY_BITS | */
1499 EN_DAC_DONE_INTR_BIT | EN_DAC_UNDERRUN_BIT;
1500 writew(devpriv->intr_enable_bits,
1501 devpriv->main_iobase + INTR_ENABLE_REG);
1503 disable_ai_pacing(dev);
1506 static int alloc_and_init_dma_members(struct comedi_device *dev)
1508 const struct pcidas64_board *thisboard = comedi_board(dev);
1509 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1510 struct pcidas64_private *devpriv = dev->private;
1513 /* allocate pci dma buffers */
1514 for (i = 0; i < ai_dma_ring_count(thisboard); i++) {
1515 devpriv->ai_buffer[i] =
1516 pci_alloc_consistent(pcidev, DMA_BUFFER_SIZE,
1517 &devpriv->ai_buffer_bus_addr[i]);
1518 if (devpriv->ai_buffer[i] == NULL)
1522 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1523 if (ao_cmd_is_supported(thisboard)) {
1524 devpriv->ao_buffer[i] =
1525 pci_alloc_consistent(pcidev, DMA_BUFFER_SIZE,
1527 ao_buffer_bus_addr[i]);
1528 if (devpriv->ao_buffer[i] == NULL)
1533 /* allocate dma descriptors */
1534 devpriv->ai_dma_desc =
1535 pci_alloc_consistent(pcidev, sizeof(struct plx_dma_desc) *
1536 ai_dma_ring_count(thisboard),
1537 &devpriv->ai_dma_desc_bus_addr);
1538 if (devpriv->ai_dma_desc == NULL)
1541 DEBUG_PRINT("ai dma descriptors start at bus addr 0x%llx\n",
1542 (unsigned long long)devpriv->ai_dma_desc_bus_addr);
1543 if (ao_cmd_is_supported(thisboard)) {
1544 devpriv->ao_dma_desc =
1545 pci_alloc_consistent(pcidev,
1546 sizeof(struct plx_dma_desc) *
1548 &devpriv->ao_dma_desc_bus_addr);
1549 if (devpriv->ao_dma_desc == NULL)
1552 DEBUG_PRINT("ao dma descriptors start at bus addr 0x%llx\n",
1553 (unsigned long long)devpriv->ao_dma_desc_bus_addr);
1555 /* initialize dma descriptors */
1556 for (i = 0; i < ai_dma_ring_count(thisboard); i++) {
1557 devpriv->ai_dma_desc[i].pci_start_addr =
1558 cpu_to_le32(devpriv->ai_buffer_bus_addr[i]);
1559 if (thisboard->layout == LAYOUT_4020)
1560 devpriv->ai_dma_desc[i].local_start_addr =
1561 cpu_to_le32(devpriv->local1_iobase +
1564 devpriv->ai_dma_desc[i].local_start_addr =
1565 cpu_to_le32(devpriv->local0_iobase +
1567 devpriv->ai_dma_desc[i].transfer_size = cpu_to_le32(0);
1568 devpriv->ai_dma_desc[i].next =
1569 cpu_to_le32((devpriv->ai_dma_desc_bus_addr +
1570 ((i + 1) % ai_dma_ring_count(thisboard)) *
1571 sizeof(devpriv->ai_dma_desc[0])) |
1572 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT |
1573 PLX_XFER_LOCAL_TO_PCI);
1575 if (ao_cmd_is_supported(thisboard)) {
1576 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1577 devpriv->ao_dma_desc[i].pci_start_addr =
1578 cpu_to_le32(devpriv->ao_buffer_bus_addr[i]);
1579 devpriv->ao_dma_desc[i].local_start_addr =
1580 cpu_to_le32(devpriv->local0_iobase +
1582 devpriv->ao_dma_desc[i].transfer_size = cpu_to_le32(0);
1583 devpriv->ao_dma_desc[i].next =
1584 cpu_to_le32((devpriv->ao_dma_desc_bus_addr +
1585 ((i + 1) % (AO_DMA_RING_COUNT)) *
1586 sizeof(devpriv->ao_dma_desc[0])) |
1587 PLX_DESC_IN_PCI_BIT |
1588 PLX_INTR_TERM_COUNT);
1594 static inline void warn_external_queue(struct comedi_device *dev)
1597 "AO command and AI external channel queue cannot be used simultaneously.");
1599 "Use internal AI channel queue (channels must be consecutive and use same range/aref)");
1602 /* Their i2c requires a huge delay on setting clock or data high for some reason */
1603 static const int i2c_high_udelay = 1000;
1604 static const int i2c_low_udelay = 10;
1606 /* set i2c data line high or low */
1607 static void i2c_set_sda(struct comedi_device *dev, int state)
1609 struct pcidas64_private *devpriv = dev->private;
1610 static const int data_bit = CTL_EE_W;
1611 void __iomem *plx_control_addr = devpriv->plx9080_iobase +
1615 /* set data line high */
1616 devpriv->plx_control_bits &= ~data_bit;
1617 writel(devpriv->plx_control_bits, plx_control_addr);
1618 udelay(i2c_high_udelay);
1619 } else { /* set data line low */
1621 devpriv->plx_control_bits |= data_bit;
1622 writel(devpriv->plx_control_bits, plx_control_addr);
1623 udelay(i2c_low_udelay);
1627 /* set i2c clock line high or low */
1628 static void i2c_set_scl(struct comedi_device *dev, int state)
1630 struct pcidas64_private *devpriv = dev->private;
1631 static const int clock_bit = CTL_USERO;
1632 void __iomem *plx_control_addr = devpriv->plx9080_iobase +
1636 /* set clock line high */
1637 devpriv->plx_control_bits &= ~clock_bit;
1638 writel(devpriv->plx_control_bits, plx_control_addr);
1639 udelay(i2c_high_udelay);
1640 } else { /* set clock line low */
1642 devpriv->plx_control_bits |= clock_bit;
1643 writel(devpriv->plx_control_bits, plx_control_addr);
1644 udelay(i2c_low_udelay);
1648 static void i2c_write_byte(struct comedi_device *dev, uint8_t byte)
1651 unsigned int num_bits = 8;
1653 DEBUG_PRINT("writing to i2c byte 0x%x\n", byte);
1655 for (bit = 1 << (num_bits - 1); bit; bit >>= 1) {
1656 i2c_set_scl(dev, 0);
1658 i2c_set_sda(dev, 1);
1660 i2c_set_sda(dev, 0);
1661 i2c_set_scl(dev, 1);
1665 /* we can't really read the lines, so fake it */
1666 static int i2c_read_ack(struct comedi_device *dev)
1668 i2c_set_scl(dev, 0);
1669 i2c_set_sda(dev, 1);
1670 i2c_set_scl(dev, 1);
1672 return 0; /* return fake acknowledge bit */
1675 /* send start bit */
1676 static void i2c_start(struct comedi_device *dev)
1678 i2c_set_scl(dev, 1);
1679 i2c_set_sda(dev, 1);
1680 i2c_set_sda(dev, 0);
1684 static void i2c_stop(struct comedi_device *dev)
1686 i2c_set_scl(dev, 0);
1687 i2c_set_sda(dev, 0);
1688 i2c_set_scl(dev, 1);
1689 i2c_set_sda(dev, 1);
1692 static void i2c_write(struct comedi_device *dev, unsigned int address,
1693 const uint8_t *data, unsigned int length)
1695 struct pcidas64_private *devpriv = dev->private;
1698 static const int read_bit = 0x1;
1700 /* XXX need mutex to prevent simultaneous attempts to access
1701 * eeprom and i2c bus */
1703 /* make sure we dont send anything to eeprom */
1704 devpriv->plx_control_bits &= ~CTL_EE_CS;
1709 /* send address and write bit */
1710 bitstream = (address << 1) & ~read_bit;
1711 i2c_write_byte(dev, bitstream);
1713 /* get acknowledge */
1714 if (i2c_read_ack(dev) != 0) {
1715 comedi_error(dev, "i2c write failed: no acknowledge");
1719 /* write data bytes */
1720 for (i = 0; i < length; i++) {
1721 i2c_write_byte(dev, data[i]);
1722 if (i2c_read_ack(dev) != 0) {
1723 comedi_error(dev, "i2c write failed: no acknowledge");
1731 static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1732 struct comedi_insn *insn, unsigned int *data)
1734 const struct pcidas64_board *thisboard = comedi_board(dev);
1735 struct pcidas64_private *devpriv = dev->private;
1736 unsigned int bits = 0, n, i;
1737 unsigned int channel, range, aref;
1738 unsigned long flags;
1739 static const int timeout = 100;
1741 DEBUG_PRINT("chanspec 0x%x\n", insn->chanspec);
1742 channel = CR_CHAN(insn->chanspec);
1743 range = CR_RANGE(insn->chanspec);
1744 aref = CR_AREF(insn->chanspec);
1746 /* disable card's analog input interrupt sources and pacing */
1747 /* 4020 generates dac done interrupts even though they are disabled */
1748 disable_ai_pacing(dev);
1750 spin_lock_irqsave(&dev->spinlock, flags);
1751 if (insn->chanspec & CR_ALT_FILTER)
1752 devpriv->adc_control1_bits |= ADC_DITHER_BIT;
1754 devpriv->adc_control1_bits &= ~ADC_DITHER_BIT;
1755 writew(devpriv->adc_control1_bits,
1756 devpriv->main_iobase + ADC_CONTROL1_REG);
1757 spin_unlock_irqrestore(&dev->spinlock, flags);
1759 if (thisboard->layout != LAYOUT_4020) {
1760 /* use internal queue */
1761 devpriv->hw_config_bits &= ~EXT_QUEUE_BIT;
1762 writew(devpriv->hw_config_bits,
1763 devpriv->main_iobase + HW_CONFIG_REG);
1765 /* ALT_SOURCE is internal calibration reference */
1766 if (insn->chanspec & CR_ALT_SOURCE) {
1767 unsigned int cal_en_bit;
1769 DEBUG_PRINT("reading calibration source\n");
1770 if (thisboard->layout == LAYOUT_60XX)
1771 cal_en_bit = CAL_EN_60XX_BIT;
1773 cal_en_bit = CAL_EN_64XX_BIT;
1774 /* select internal reference source to connect
1777 adc_src_bits(devpriv->calibration_source),
1778 devpriv->main_iobase + CALIBRATION_REG);
1780 /* make sure internal calibration source
1782 writew(0, devpriv->main_iobase + CALIBRATION_REG);
1784 /* load internal queue */
1787 bits |= ai_range_bits_6xxx(dev, CR_RANGE(insn->chanspec));
1788 /* set single-ended / differential */
1789 bits |= se_diff_bit_6xxx(dev, aref == AREF_DIFF);
1790 if (aref == AREF_COMMON)
1791 bits |= ADC_COMMON_BIT;
1792 bits |= adc_chan_bits(channel);
1793 /* set stop channel */
1794 writew(adc_chan_bits(channel),
1795 devpriv->main_iobase + ADC_QUEUE_HIGH_REG);
1796 /* set start channel, and rest of settings */
1797 writew(bits, devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
1799 uint8_t old_cal_range_bits = devpriv->i2c_cal_range_bits;
1801 devpriv->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
1802 if (insn->chanspec & CR_ALT_SOURCE) {
1803 DEBUG_PRINT("reading calibration source\n");
1804 devpriv->i2c_cal_range_bits |=
1805 adc_src_4020_bits(devpriv->calibration_source);
1806 } else { /* select BNC inputs */
1807 devpriv->i2c_cal_range_bits |= adc_src_4020_bits(4);
1811 devpriv->i2c_cal_range_bits |= attenuate_bit(channel);
1813 devpriv->i2c_cal_range_bits &= ~attenuate_bit(channel);
1814 /* update calibration/range i2c register only if necessary,
1815 * as it is very slow */
1816 if (old_cal_range_bits != devpriv->i2c_cal_range_bits) {
1817 uint8_t i2c_data = devpriv->i2c_cal_range_bits;
1818 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
1822 /* 4020 manual asks that sample interval register to be set
1823 * before writing to convert register.
1824 * Using somewhat arbitrary setting of 4 master clock ticks
1826 writew(0, devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1827 writew(2, devpriv->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
1830 for (n = 0; n < insn->n; n++) {
1832 /* clear adc buffer (inside loop for 4020 sake) */
1833 writew(0, devpriv->main_iobase + ADC_BUFFER_CLEAR_REG);
1835 /* trigger conversion, bits sent only matter for 4020 */
1836 writew(adc_convert_chan_4020_bits(CR_CHAN(insn->chanspec)),
1837 devpriv->main_iobase + ADC_CONVERT_REG);
1840 for (i = 0; i < timeout; i++) {
1841 bits = readw(devpriv->main_iobase + HW_STATUS_REG);
1842 DEBUG_PRINT(" pipe bits 0x%x\n", pipe_full_bits(bits));
1843 if (thisboard->layout == LAYOUT_4020) {
1844 if (readw(devpriv->main_iobase +
1845 ADC_WRITE_PNTR_REG))
1848 if (pipe_full_bits(bits))
1853 DEBUG_PRINT(" looped %i times waiting for data\n", i);
1855 comedi_error(dev, " analog input read insn timed out");
1856 dev_info(dev->class_dev, "status 0x%x\n", bits);
1859 if (thisboard->layout == LAYOUT_4020)
1860 data[n] = readl(devpriv->dio_counter_iobase +
1861 ADC_FIFO_REG) & 0xffff;
1863 data[n] = readw(devpriv->main_iobase + PIPE1_READ_REG);
1869 static int ai_config_calibration_source(struct comedi_device *dev,
1872 const struct pcidas64_board *thisboard = comedi_board(dev);
1873 struct pcidas64_private *devpriv = dev->private;
1874 unsigned int source = data[1];
1875 int num_calibration_sources;
1877 if (thisboard->layout == LAYOUT_60XX)
1878 num_calibration_sources = 16;
1880 num_calibration_sources = 8;
1881 if (source >= num_calibration_sources) {
1882 dev_dbg(dev->class_dev, "invalid calibration source: %i\n",
1887 DEBUG_PRINT("setting calibration source to %i\n", source);
1888 devpriv->calibration_source = source;
1893 static int ai_config_block_size(struct comedi_device *dev, unsigned int *data)
1895 const struct pcidas64_board *thisboard = comedi_board(dev);
1897 const struct hw_fifo_info *const fifo = thisboard->ai_fifo;
1898 unsigned int block_size, requested_block_size;
1901 requested_block_size = data[1];
1903 if (requested_block_size) {
1904 fifo_size = requested_block_size * fifo->num_segments /
1907 retval = set_ai_fifo_size(dev, fifo_size);
1913 block_size = ai_fifo_size(dev) / fifo->num_segments * bytes_in_sample;
1915 data[1] = block_size;
1920 static int ai_config_master_clock_4020(struct comedi_device *dev,
1923 struct pcidas64_private *devpriv = dev->private;
1924 unsigned int divisor = data[4];
1933 case COMEDI_EV_SCAN_BEGIN:
1934 devpriv->ext_clock.divisor = divisor;
1935 devpriv->ext_clock.chanspec = data[2];
1944 return retval ? retval : 5;
1947 /* XXX could add support for 60xx series */
1948 static int ai_config_master_clock(struct comedi_device *dev, unsigned int *data)
1950 const struct pcidas64_board *thisboard = comedi_board(dev);
1952 switch (thisboard->layout) {
1954 return ai_config_master_clock_4020(dev, data);
1964 static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
1965 struct comedi_insn *insn, unsigned int *data)
1970 case INSN_CONFIG_ALT_SOURCE:
1971 return ai_config_calibration_source(dev, data);
1973 case INSN_CONFIG_BLOCK_SIZE:
1974 return ai_config_block_size(dev, data);
1976 case INSN_CONFIG_TIMER_1:
1977 return ai_config_master_clock(dev, data);
1986 /* Gets nearest achievable timing given master clock speed, does not
1987 * take into account possible minimum/maximum divisor values. Used
1988 * by other timing checking functions. */
1989 static unsigned int get_divisor(unsigned int ns, unsigned int flags)
1991 unsigned int divisor;
1993 switch (flags & TRIG_ROUND_MASK) {
1995 divisor = (ns + TIMER_BASE - 1) / TIMER_BASE;
1997 case TRIG_ROUND_DOWN:
1998 divisor = ns / TIMER_BASE;
2000 case TRIG_ROUND_NEAREST:
2002 divisor = (ns + TIMER_BASE / 2) / TIMER_BASE;
2008 /* utility function that rounds desired timing to an achievable time, and
2009 * sets cmd members appropriately.
2010 * adc paces conversions from master clock by dividing by (x + 3) where x is 24 bit number
2012 static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd)
2014 const struct pcidas64_board *thisboard = comedi_board(dev);
2015 unsigned int convert_divisor = 0, scan_divisor;
2016 static const int min_convert_divisor = 3;
2017 static const int max_convert_divisor =
2018 max_counter_value + min_convert_divisor;
2019 static const int min_scan_divisor_4020 = 2;
2020 unsigned long long max_scan_divisor, min_scan_divisor;
2022 if (cmd->convert_src == TRIG_TIMER) {
2023 if (thisboard->layout == LAYOUT_4020) {
2024 cmd->convert_arg = 0;
2026 convert_divisor = get_divisor(cmd->convert_arg,
2028 if (convert_divisor > max_convert_divisor)
2029 convert_divisor = max_convert_divisor;
2030 if (convert_divisor < min_convert_divisor)
2031 convert_divisor = min_convert_divisor;
2032 cmd->convert_arg = convert_divisor * TIMER_BASE;
2034 } else if (cmd->convert_src == TRIG_NOW) {
2035 cmd->convert_arg = 0;
2038 if (cmd->scan_begin_src == TRIG_TIMER) {
2039 scan_divisor = get_divisor(cmd->scan_begin_arg, cmd->flags);
2040 if (cmd->convert_src == TRIG_TIMER) {
2041 /* XXX check for integer overflows */
2042 min_scan_divisor = convert_divisor * cmd->chanlist_len;
2044 (convert_divisor * cmd->chanlist_len - 1) +
2047 min_scan_divisor = min_scan_divisor_4020;
2048 max_scan_divisor = max_counter_value + min_scan_divisor;
2050 if (scan_divisor > max_scan_divisor)
2051 scan_divisor = max_scan_divisor;
2052 if (scan_divisor < min_scan_divisor)
2053 scan_divisor = min_scan_divisor;
2054 cmd->scan_begin_arg = scan_divisor * TIMER_BASE;
2060 static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
2061 struct comedi_cmd *cmd)
2063 const struct pcidas64_board *thisboard = comedi_board(dev);
2065 unsigned int tmp_arg, tmp_arg2;
2068 unsigned int triggers;
2070 /* Step 1 : check if triggers are trivially valid */
2072 err |= cfc_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_EXT);
2074 triggers = TRIG_TIMER;
2075 if (thisboard->layout == LAYOUT_4020)
2076 triggers |= TRIG_OTHER;
2078 triggers |= TRIG_FOLLOW;
2079 err |= cfc_check_trigger_src(&cmd->scan_begin_src, triggers);
2081 triggers = TRIG_TIMER;
2082 if (thisboard->layout == LAYOUT_4020)
2083 triggers |= TRIG_NOW;
2085 triggers |= TRIG_EXT;
2086 err |= cfc_check_trigger_src(&cmd->convert_src, triggers);
2087 err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
2088 err |= cfc_check_trigger_src(&cmd->stop_src,
2089 TRIG_COUNT | TRIG_EXT | TRIG_NONE);
2094 /* Step 2a : make sure trigger sources are unique */
2096 err |= cfc_check_trigger_is_unique(cmd->start_src);
2097 err |= cfc_check_trigger_is_unique(cmd->scan_begin_src);
2098 err |= cfc_check_trigger_is_unique(cmd->convert_src);
2099 err |= cfc_check_trigger_is_unique(cmd->stop_src);
2101 /* Step 2b : and mutually compatible */
2103 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
2105 if (cmd->stop_src != TRIG_COUNT &&
2106 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
2112 /* Step 3: check if arguments are trivially valid */
2114 if (cmd->convert_src == TRIG_TIMER) {
2115 if (thisboard->layout == LAYOUT_4020) {
2116 err |= cfc_check_trigger_arg_is(&cmd->convert_arg, 0);
2118 err |= cfc_check_trigger_arg_min(&cmd->convert_arg,
2119 thisboard->ai_speed);
2120 /* if scans are timed faster than conversion rate allows */
2121 if (cmd->scan_begin_src == TRIG_TIMER)
2122 err |= cfc_check_trigger_arg_min(
2123 &cmd->scan_begin_arg,
2129 err |= cfc_check_trigger_arg_min(&cmd->chanlist_len, 1);
2130 err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
2132 switch (cmd->stop_src) {
2136 err |= cfc_check_trigger_arg_min(&cmd->stop_arg, 1);
2139 err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
2148 /* step 4: fix up any arguments */
2150 if (cmd->convert_src == TRIG_TIMER) {
2151 tmp_arg = cmd->convert_arg;
2152 tmp_arg2 = cmd->scan_begin_arg;
2153 check_adc_timing(dev, cmd);
2154 if (tmp_arg != cmd->convert_arg)
2156 if (tmp_arg2 != cmd->scan_begin_arg)
2163 /* make sure user is doesn't change analog reference mid chanlist */
2164 if (cmd->chanlist) {
2165 aref = CR_AREF(cmd->chanlist[0]);
2166 for (i = 1; i < cmd->chanlist_len; i++) {
2167 if (aref != CR_AREF(cmd->chanlist[i])) {
2169 "all elements in chanlist must use the same analog reference");
2174 /* check 4020 chanlist */
2175 if (thisboard->layout == LAYOUT_4020) {
2176 unsigned int first_channel = CR_CHAN(cmd->chanlist[0]);
2177 for (i = 1; i < cmd->chanlist_len; i++) {
2178 if (CR_CHAN(cmd->chanlist[i]) !=
2179 first_channel + i) {
2181 "chanlist must use consecutive channels");
2186 if (cmd->chanlist_len == 3) {
2188 "chanlist cannot be 3 channels long, use 1, 2, or 4 channels");
2200 static int use_hw_sample_counter(struct comedi_cmd *cmd)
2202 /* disable for now until I work out a race */
2205 if (cmd->stop_src == TRIG_COUNT && cmd->stop_arg <= max_counter_value)
2211 static void setup_sample_counters(struct comedi_device *dev,
2212 struct comedi_cmd *cmd)
2214 struct pcidas64_private *devpriv = dev->private;
2216 if (cmd->stop_src == TRIG_COUNT) {
2217 /* set software count */
2218 devpriv->ai_count = cmd->stop_arg * cmd->chanlist_len;
2220 /* load hardware conversion counter */
2221 if (use_hw_sample_counter(cmd)) {
2222 writew(cmd->stop_arg & 0xffff,
2223 devpriv->main_iobase + ADC_COUNT_LOWER_REG);
2224 writew((cmd->stop_arg >> 16) & 0xff,
2225 devpriv->main_iobase + ADC_COUNT_UPPER_REG);
2227 writew(1, devpriv->main_iobase + ADC_COUNT_LOWER_REG);
2231 static inline unsigned int dma_transfer_size(struct comedi_device *dev)
2233 const struct pcidas64_board *thisboard = comedi_board(dev);
2234 struct pcidas64_private *devpriv = dev->private;
2235 unsigned int num_samples;
2237 num_samples = devpriv->ai_fifo_segment_length *
2238 thisboard->ai_fifo->sample_packing_ratio;
2239 if (num_samples > DMA_BUFFER_SIZE / sizeof(uint16_t))
2240 num_samples = DMA_BUFFER_SIZE / sizeof(uint16_t);
2245 static uint32_t ai_convert_counter_6xxx(const struct comedi_device *dev,
2246 const struct comedi_cmd *cmd)
2248 /* supposed to load counter with desired divisor minus 3 */
2249 return cmd->convert_arg / TIMER_BASE - 3;
2252 static uint32_t ai_scan_counter_6xxx(struct comedi_device *dev,
2253 struct comedi_cmd *cmd)
2257 /* figure out how long we need to delay at end of scan */
2258 switch (cmd->scan_begin_src) {
2260 count = (cmd->scan_begin_arg -
2261 (cmd->convert_arg * (cmd->chanlist_len - 1))) /
2265 count = cmd->convert_arg / TIMER_BASE;
2274 static uint32_t ai_convert_counter_4020(struct comedi_device *dev,
2275 struct comedi_cmd *cmd)
2277 struct pcidas64_private *devpriv = dev->private;
2278 unsigned int divisor;
2280 switch (cmd->scan_begin_src) {
2282 divisor = cmd->scan_begin_arg / TIMER_BASE;
2285 divisor = devpriv->ext_clock.divisor;
2287 default: /* should never happen */
2288 comedi_error(dev, "bug! failed to set ai pacing!");
2293 /* supposed to load counter with desired divisor minus 2 for 4020 */
2297 static void select_master_clock_4020(struct comedi_device *dev,
2298 const struct comedi_cmd *cmd)
2300 struct pcidas64_private *devpriv = dev->private;
2302 /* select internal/external master clock */
2303 devpriv->hw_config_bits &= ~MASTER_CLOCK_4020_MASK;
2304 if (cmd->scan_begin_src == TRIG_OTHER) {
2305 int chanspec = devpriv->ext_clock.chanspec;
2307 if (CR_CHAN(chanspec))
2308 devpriv->hw_config_bits |= BNC_CLOCK_4020_BITS;
2310 devpriv->hw_config_bits |= EXT_CLOCK_4020_BITS;
2312 devpriv->hw_config_bits |= INTERNAL_CLOCK_4020_BITS;
2314 writew(devpriv->hw_config_bits,
2315 devpriv->main_iobase + HW_CONFIG_REG);
2318 static void select_master_clock(struct comedi_device *dev,
2319 const struct comedi_cmd *cmd)
2321 const struct pcidas64_board *thisboard = comedi_board(dev);
2323 switch (thisboard->layout) {
2325 select_master_clock_4020(dev, cmd);
2332 static inline void dma_start_sync(struct comedi_device *dev,
2333 unsigned int channel)
2335 struct pcidas64_private *devpriv = dev->private;
2336 unsigned long flags;
2338 /* spinlock for plx dma control/status reg */
2339 spin_lock_irqsave(&dev->spinlock, flags);
2341 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2342 PLX_CLEAR_DMA_INTR_BIT,
2343 devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2345 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2346 PLX_CLEAR_DMA_INTR_BIT,
2347 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
2348 spin_unlock_irqrestore(&dev->spinlock, flags);
2351 static void set_ai_pacing(struct comedi_device *dev, struct comedi_cmd *cmd)
2353 const struct pcidas64_board *thisboard = comedi_board(dev);
2354 struct pcidas64_private *devpriv = dev->private;
2355 uint32_t convert_counter = 0, scan_counter = 0;
2357 check_adc_timing(dev, cmd);
2359 select_master_clock(dev, cmd);
2361 if (thisboard->layout == LAYOUT_4020) {
2362 convert_counter = ai_convert_counter_4020(dev, cmd);
2364 convert_counter = ai_convert_counter_6xxx(dev, cmd);
2365 scan_counter = ai_scan_counter_6xxx(dev, cmd);
2368 /* load lower 16 bits of convert interval */
2369 writew(convert_counter & 0xffff,
2370 devpriv->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
2371 DEBUG_PRINT("convert counter 0x%x\n", convert_counter);
2372 /* load upper 8 bits of convert interval */
2373 writew((convert_counter >> 16) & 0xff,
2374 devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
2375 /* load lower 16 bits of scan delay */
2376 writew(scan_counter & 0xffff,
2377 devpriv->main_iobase + ADC_DELAY_INTERVAL_LOWER_REG);
2378 /* load upper 8 bits of scan delay */
2379 writew((scan_counter >> 16) & 0xff,
2380 devpriv->main_iobase + ADC_DELAY_INTERVAL_UPPER_REG);
2381 DEBUG_PRINT("scan counter 0x%x\n", scan_counter);
2384 static int use_internal_queue_6xxx(const struct comedi_cmd *cmd)
2388 for (i = 0; i + 1 < cmd->chanlist_len; i++) {
2389 if (CR_CHAN(cmd->chanlist[i + 1]) !=
2390 CR_CHAN(cmd->chanlist[i]) + 1)
2392 if (CR_RANGE(cmd->chanlist[i + 1]) !=
2393 CR_RANGE(cmd->chanlist[i]))
2395 if (CR_AREF(cmd->chanlist[i + 1]) != CR_AREF(cmd->chanlist[i]))
2401 static int setup_channel_queue(struct comedi_device *dev,
2402 const struct comedi_cmd *cmd)
2404 const struct pcidas64_board *thisboard = comedi_board(dev);
2405 struct pcidas64_private *devpriv = dev->private;
2406 unsigned short bits;
2409 if (thisboard->layout != LAYOUT_4020) {
2410 if (use_internal_queue_6xxx(cmd)) {
2411 devpriv->hw_config_bits &= ~EXT_QUEUE_BIT;
2412 writew(devpriv->hw_config_bits,
2413 devpriv->main_iobase + HW_CONFIG_REG);
2416 bits |= adc_chan_bits(CR_CHAN(cmd->chanlist[0]));
2418 bits |= ai_range_bits_6xxx(dev,
2419 CR_RANGE(cmd->chanlist[0]));
2420 /* set single-ended / differential */
2421 bits |= se_diff_bit_6xxx(dev,
2422 CR_AREF(cmd->chanlist[0]) ==
2424 if (CR_AREF(cmd->chanlist[0]) == AREF_COMMON)
2425 bits |= ADC_COMMON_BIT;
2426 /* set stop channel */
2427 writew(adc_chan_bits
2428 (CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1])),
2429 devpriv->main_iobase + ADC_QUEUE_HIGH_REG);
2430 /* set start channel, and rest of settings */
2432 devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
2434 /* use external queue */
2435 if (dev->write_subdev && dev->write_subdev->busy) {
2436 warn_external_queue(dev);
2439 devpriv->hw_config_bits |= EXT_QUEUE_BIT;
2440 writew(devpriv->hw_config_bits,
2441 devpriv->main_iobase + HW_CONFIG_REG);
2442 /* clear DAC buffer to prevent weird interactions */
2444 devpriv->main_iobase + DAC_BUFFER_CLEAR_REG);
2445 /* clear queue pointer */
2446 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
2447 /* load external queue */
2448 for (i = 0; i < cmd->chanlist_len; i++) {
2451 bits |= adc_chan_bits(CR_CHAN(cmd->
2454 bits |= ai_range_bits_6xxx(dev,
2458 /* set single-ended / differential */
2459 bits |= se_diff_bit_6xxx(dev,
2463 if (CR_AREF(cmd->chanlist[i]) == AREF_COMMON)
2464 bits |= ADC_COMMON_BIT;
2465 /* mark end of queue */
2466 if (i == cmd->chanlist_len - 1)
2467 bits |= QUEUE_EOSCAN_BIT |
2470 devpriv->main_iobase +
2471 ADC_QUEUE_FIFO_REG);
2473 "wrote 0x%x to external channel queue\n",
2476 /* doing a queue clear is not specified in board docs,
2477 * but required for reliable operation */
2478 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
2479 /* prime queue holding register */
2480 writew(0, devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
2483 unsigned short old_cal_range_bits = devpriv->i2c_cal_range_bits;
2485 devpriv->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
2486 /* select BNC inputs */
2487 devpriv->i2c_cal_range_bits |= adc_src_4020_bits(4);
2489 for (i = 0; i < cmd->chanlist_len; i++) {
2490 unsigned int channel = CR_CHAN(cmd->chanlist[i]);
2491 unsigned int range = CR_RANGE(cmd->chanlist[i]);
2494 devpriv->i2c_cal_range_bits |=
2495 attenuate_bit(channel);
2497 devpriv->i2c_cal_range_bits &=
2498 ~attenuate_bit(channel);
2500 /* update calibration/range i2c register only if necessary,
2501 * as it is very slow */
2502 if (old_cal_range_bits != devpriv->i2c_cal_range_bits) {
2503 uint8_t i2c_data = devpriv->i2c_cal_range_bits;
2504 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
2511 static inline void load_first_dma_descriptor(struct comedi_device *dev,
2512 unsigned int dma_channel,
2513 unsigned int descriptor_bits)
2515 struct pcidas64_private *devpriv = dev->private;
2517 /* The transfer size, pci address, and local address registers
2518 * are supposedly unused during chained dma,
2519 * but I have found that left over values from last operation
2520 * occasionally cause problems with transfer of first dma
2521 * block. Initializing them to zero seems to fix the problem. */
2524 devpriv->plx9080_iobase + PLX_DMA1_TRANSFER_SIZE_REG);
2525 writel(0, devpriv->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG);
2527 devpriv->plx9080_iobase + PLX_DMA1_LOCAL_ADDRESS_REG);
2528 writel(descriptor_bits,
2529 devpriv->plx9080_iobase + PLX_DMA1_DESCRIPTOR_REG);
2532 devpriv->plx9080_iobase + PLX_DMA0_TRANSFER_SIZE_REG);
2533 writel(0, devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
2535 devpriv->plx9080_iobase + PLX_DMA0_LOCAL_ADDRESS_REG);
2536 writel(descriptor_bits,
2537 devpriv->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
2541 static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
2543 const struct pcidas64_board *thisboard = comedi_board(dev);
2544 struct pcidas64_private *devpriv = dev->private;
2545 struct comedi_async *async = s->async;
2546 struct comedi_cmd *cmd = &async->cmd;
2549 unsigned long flags;
2552 disable_ai_pacing(dev);
2555 retval = setup_channel_queue(dev, cmd);
2559 /* make sure internal calibration source is turned off */
2560 writew(0, devpriv->main_iobase + CALIBRATION_REG);
2562 set_ai_pacing(dev, cmd);
2564 setup_sample_counters(dev, cmd);
2566 enable_ai_interrupts(dev, cmd);
2568 spin_lock_irqsave(&dev->spinlock, flags);
2569 /* set mode, allow conversions through software gate */
2570 devpriv->adc_control1_bits |= ADC_SW_GATE_BIT;
2571 devpriv->adc_control1_bits &= ~ADC_DITHER_BIT;
2572 if (thisboard->layout != LAYOUT_4020) {
2573 devpriv->adc_control1_bits &= ~ADC_MODE_MASK;
2574 if (cmd->convert_src == TRIG_EXT)
2575 /* good old mode 13 */
2576 devpriv->adc_control1_bits |= adc_mode_bits(13);
2578 /* mode 8. What else could you need? */
2579 devpriv->adc_control1_bits |= adc_mode_bits(8);
2581 devpriv->adc_control1_bits &= ~CHANNEL_MODE_4020_MASK;
2582 if (cmd->chanlist_len == 4)
2583 devpriv->adc_control1_bits |= FOUR_CHANNEL_4020_BITS;
2584 else if (cmd->chanlist_len == 2)
2585 devpriv->adc_control1_bits |= TWO_CHANNEL_4020_BITS;
2586 devpriv->adc_control1_bits &= ~ADC_LO_CHANNEL_4020_MASK;
2587 devpriv->adc_control1_bits |=
2588 adc_lo_chan_4020_bits(CR_CHAN(cmd->chanlist[0]));
2589 devpriv->adc_control1_bits &= ~ADC_HI_CHANNEL_4020_MASK;
2590 devpriv->adc_control1_bits |=
2591 adc_hi_chan_4020_bits(CR_CHAN(cmd->chanlist
2592 [cmd->chanlist_len - 1]));
2594 writew(devpriv->adc_control1_bits,
2595 devpriv->main_iobase + ADC_CONTROL1_REG);
2596 DEBUG_PRINT("control1 bits 0x%x\n", devpriv->adc_control1_bits);
2597 spin_unlock_irqrestore(&dev->spinlock, flags);
2599 /* clear adc buffer */
2600 writew(0, devpriv->main_iobase + ADC_BUFFER_CLEAR_REG);
2602 if ((cmd->flags & TRIG_WAKE_EOS) == 0 ||
2603 thisboard->layout == LAYOUT_4020) {
2604 devpriv->ai_dma_index = 0;
2606 /* set dma transfer size */
2607 for (i = 0; i < ai_dma_ring_count(thisboard); i++)
2608 devpriv->ai_dma_desc[i].transfer_size =
2609 cpu_to_le32(dma_transfer_size(dev) *
2612 /* give location of first dma descriptor */
2613 load_first_dma_descriptor(dev, 1,
2614 devpriv->ai_dma_desc_bus_addr |
2615 PLX_DESC_IN_PCI_BIT |
2616 PLX_INTR_TERM_COUNT |
2617 PLX_XFER_LOCAL_TO_PCI);
2619 dma_start_sync(dev, 1);
2622 if (thisboard->layout == LAYOUT_4020) {
2623 /* set source for external triggers */
2625 if (cmd->start_src == TRIG_EXT && CR_CHAN(cmd->start_arg))
2626 bits |= EXT_START_TRIG_BNC_BIT;
2627 if (cmd->stop_src == TRIG_EXT && CR_CHAN(cmd->stop_arg))
2628 bits |= EXT_STOP_TRIG_BNC_BIT;
2629 writew(bits, devpriv->main_iobase + DAQ_ATRIG_LOW_4020_REG);
2632 spin_lock_irqsave(&dev->spinlock, flags);
2634 /* enable pacing, triggering, etc */
2635 bits = ADC_ENABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT;
2636 if (cmd->flags & TRIG_WAKE_EOS)
2637 bits |= ADC_DMA_DISABLE_BIT;
2638 /* set start trigger */
2639 if (cmd->start_src == TRIG_EXT) {
2640 bits |= ADC_START_TRIG_EXT_BITS;
2641 if (cmd->start_arg & CR_INVERT)
2642 bits |= ADC_START_TRIG_FALLING_BIT;
2643 } else if (cmd->start_src == TRIG_NOW)
2644 bits |= ADC_START_TRIG_SOFT_BITS;
2645 if (use_hw_sample_counter(cmd))
2646 bits |= ADC_SAMPLE_COUNTER_EN_BIT;
2647 writew(bits, devpriv->main_iobase + ADC_CONTROL0_REG);
2648 DEBUG_PRINT("control0 bits 0x%x\n", bits);
2650 devpriv->ai_cmd_running = 1;
2652 spin_unlock_irqrestore(&dev->spinlock, flags);
2654 /* start acquisition */
2655 if (cmd->start_src == TRIG_NOW) {
2656 writew(0, devpriv->main_iobase + ADC_START_REG);
2657 DEBUG_PRINT("soft trig\n");
2663 /* read num_samples from 16 bit wide ai fifo */
2664 static void pio_drain_ai_fifo_16(struct comedi_device *dev)
2666 struct pcidas64_private *devpriv = dev->private;
2667 struct comedi_subdevice *s = dev->read_subdev;
2668 struct comedi_async *async = s->async;
2669 struct comedi_cmd *cmd = &async->cmd;
2671 uint16_t prepost_bits;
2672 int read_segment, read_index, write_segment, write_index;
2676 /* get least significant 15 bits */
2677 read_index = readw(devpriv->main_iobase + ADC_READ_PNTR_REG) &
2679 write_index = readw(devpriv->main_iobase + ADC_WRITE_PNTR_REG) &
2681 /* Get most significant bits (grey code).
2682 * Different boards use different code so use a scheme
2683 * that doesn't depend on encoding. This read must
2684 * occur after reading least significant 15 bits to avoid race
2685 * with fifo switching to next segment. */
2686 prepost_bits = readw(devpriv->main_iobase + PREPOST_REG);
2688 /* if read and write pointers are not on the same fifo segment,
2689 * read to the end of the read segment */
2690 read_segment = adc_upper_read_ptr_code(prepost_bits);
2691 write_segment = adc_upper_write_ptr_code(prepost_bits);
2693 DEBUG_PRINT(" rd seg %i, wrt seg %i, rd idx %i, wrt idx %i\n",
2694 read_segment, write_segment, read_index,
2697 if (read_segment != write_segment)
2699 devpriv->ai_fifo_segment_length - read_index;
2701 num_samples = write_index - read_index;
2703 if (cmd->stop_src == TRIG_COUNT) {
2704 if (devpriv->ai_count == 0)
2706 if (num_samples > devpriv->ai_count)
2707 num_samples = devpriv->ai_count;
2709 devpriv->ai_count -= num_samples;
2712 if (num_samples < 0) {
2713 dev_err(dev->class_dev,
2714 "cb_pcidas64: bug! num_samples < 0\n");
2718 DEBUG_PRINT(" read %i samples from fifo\n", num_samples);
2720 for (i = 0; i < num_samples; i++) {
2721 cfc_write_to_buffer(s,
2722 readw(devpriv->main_iobase +
2726 } while (read_segment != write_segment);
2729 /* Read from 32 bit wide ai fifo of 4020 - deal with insane grey coding of
2730 * pointers. The pci-4020 hardware only supports dma transfers (it only
2731 * supports the use of pio for draining the last remaining points from the
2732 * fifo when a data acquisition operation has completed).
2734 static void pio_drain_ai_fifo_32(struct comedi_device *dev)
2736 struct pcidas64_private *devpriv = dev->private;
2737 struct comedi_subdevice *s = dev->read_subdev;
2738 struct comedi_async *async = s->async;
2739 struct comedi_cmd *cmd = &async->cmd;
2741 unsigned int max_transfer = 100000;
2744 readw(devpriv->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2746 readw(devpriv->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2748 if (cmd->stop_src == TRIG_COUNT) {
2749 if (max_transfer > devpriv->ai_count)
2750 max_transfer = devpriv->ai_count;
2753 for (i = 0; read_code != write_code && i < max_transfer;) {
2754 fifo_data = readl(devpriv->dio_counter_iobase + ADC_FIFO_REG);
2755 cfc_write_to_buffer(s, fifo_data & 0xffff);
2757 if (i < max_transfer) {
2758 cfc_write_to_buffer(s, (fifo_data >> 16) & 0xffff);
2761 read_code = readw(devpriv->main_iobase + ADC_READ_PNTR_REG) &
2764 devpriv->ai_count -= i;
2768 static void pio_drain_ai_fifo(struct comedi_device *dev)
2770 const struct pcidas64_board *thisboard = comedi_board(dev);
2772 if (thisboard->layout == LAYOUT_4020)
2773 pio_drain_ai_fifo_32(dev);
2775 pio_drain_ai_fifo_16(dev);
2778 static void drain_dma_buffers(struct comedi_device *dev, unsigned int channel)
2780 const struct pcidas64_board *thisboard = comedi_board(dev);
2781 struct pcidas64_private *devpriv = dev->private;
2782 struct comedi_async *async = dev->read_subdev->async;
2783 uint32_t next_transfer_addr;
2785 int num_samples = 0;
2786 void __iomem *pci_addr_reg;
2790 devpriv->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG;
2793 devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
2795 /* loop until we have read all the full buffers */
2796 for (j = 0, next_transfer_addr = readl(pci_addr_reg);
2797 (next_transfer_addr <
2798 devpriv->ai_buffer_bus_addr[devpriv->ai_dma_index] ||
2799 next_transfer_addr >=
2800 devpriv->ai_buffer_bus_addr[devpriv->ai_dma_index] +
2801 DMA_BUFFER_SIZE) && j < ai_dma_ring_count(thisboard); j++) {
2802 /* transfer data from dma buffer to comedi buffer */
2803 num_samples = dma_transfer_size(dev);
2804 if (async->cmd.stop_src == TRIG_COUNT) {
2805 if (num_samples > devpriv->ai_count)
2806 num_samples = devpriv->ai_count;
2807 devpriv->ai_count -= num_samples;
2809 cfc_write_array_to_buffer(dev->read_subdev,
2810 devpriv->ai_buffer[devpriv->
2812 num_samples * sizeof(uint16_t));
2813 devpriv->ai_dma_index = (devpriv->ai_dma_index + 1) %
2814 ai_dma_ring_count(thisboard);
2816 DEBUG_PRINT("next buffer addr 0x%lx\n",
2817 (unsigned long)devpriv->
2818 ai_buffer_bus_addr[devpriv->ai_dma_index]);
2819 DEBUG_PRINT("pci addr reg 0x%x\n", next_transfer_addr);
2821 /* XXX check for dma ring buffer overrun
2822 * (use end-of-chain bit to mark last unused buffer) */
2825 static void handle_ai_interrupt(struct comedi_device *dev,
2826 unsigned short status,
2827 unsigned int plx_status)
2829 const struct pcidas64_board *thisboard = comedi_board(dev);
2830 struct pcidas64_private *devpriv = dev->private;
2831 struct comedi_subdevice *s = dev->read_subdev;
2832 struct comedi_async *async = s->async;
2833 struct comedi_cmd *cmd = &async->cmd;
2834 uint8_t dma1_status;
2835 unsigned long flags;
2837 /* check for fifo overrun */
2838 if (status & ADC_OVERRUN_BIT) {
2839 comedi_error(dev, "fifo overrun");
2840 async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
2842 /* spin lock makes sure no one else changes plx dma control reg */
2843 spin_lock_irqsave(&dev->spinlock, flags);
2844 dma1_status = readb(devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2845 if (plx_status & ICS_DMA1_A) { /* dma chan 1 interrupt */
2846 writeb((dma1_status & PLX_DMA_EN_BIT) | PLX_CLEAR_DMA_INTR_BIT,
2847 devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2848 DEBUG_PRINT("dma1 status 0x%x\n", dma1_status);
2850 if (dma1_status & PLX_DMA_EN_BIT)
2851 drain_dma_buffers(dev, 1);
2853 DEBUG_PRINT(" cleared dma ch1 interrupt\n");
2855 spin_unlock_irqrestore(&dev->spinlock, flags);
2857 if (status & ADC_DONE_BIT)
2858 DEBUG_PRINT("adc done interrupt\n");
2860 /* drain fifo with pio */
2861 if ((status & ADC_DONE_BIT) ||
2862 ((cmd->flags & TRIG_WAKE_EOS) &&
2863 (status & ADC_INTR_PENDING_BIT) &&
2864 (thisboard->layout != LAYOUT_4020))) {
2865 DEBUG_PRINT("pio fifo drain\n");
2866 spin_lock_irqsave(&dev->spinlock, flags);
2867 if (devpriv->ai_cmd_running) {
2868 spin_unlock_irqrestore(&dev->spinlock, flags);
2869 pio_drain_ai_fifo(dev);
2871 spin_unlock_irqrestore(&dev->spinlock, flags);
2873 /* if we are have all the data, then quit */
2874 if ((cmd->stop_src == TRIG_COUNT && (int)devpriv->ai_count <= 0) ||
2875 (cmd->stop_src == TRIG_EXT && (status & ADC_STOP_BIT))) {
2876 async->events |= COMEDI_CB_EOA;
2879 cfc_handle_events(dev, s);
2882 static inline unsigned int prev_ao_dma_index(struct comedi_device *dev)
2884 struct pcidas64_private *devpriv = dev->private;
2885 unsigned int buffer_index;
2887 if (devpriv->ao_dma_index == 0)
2888 buffer_index = AO_DMA_RING_COUNT - 1;
2890 buffer_index = devpriv->ao_dma_index - 1;
2891 return buffer_index;
2894 static int last_ao_dma_load_completed(struct comedi_device *dev)
2896 struct pcidas64_private *devpriv = dev->private;
2897 unsigned int buffer_index;
2898 unsigned int transfer_address;
2899 unsigned short dma_status;
2901 buffer_index = prev_ao_dma_index(dev);
2902 dma_status = readb(devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
2903 if ((dma_status & PLX_DMA_DONE_BIT) == 0)
2907 readl(devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
2908 if (transfer_address != devpriv->ao_buffer_bus_addr[buffer_index])
2914 static int ao_stopped_by_error(struct comedi_device *dev,
2915 const struct comedi_cmd *cmd)
2917 struct pcidas64_private *devpriv = dev->private;
2919 if (cmd->stop_src == TRIG_NONE)
2921 if (cmd->stop_src == TRIG_COUNT) {
2922 if (devpriv->ao_count)
2924 if (last_ao_dma_load_completed(dev) == 0)
2930 static inline int ao_dma_needs_restart(struct comedi_device *dev,
2931 unsigned short dma_status)
2933 if ((dma_status & PLX_DMA_DONE_BIT) == 0 ||
2934 (dma_status & PLX_DMA_EN_BIT) == 0)
2936 if (last_ao_dma_load_completed(dev))
2942 static void restart_ao_dma(struct comedi_device *dev)
2944 struct pcidas64_private *devpriv = dev->private;
2945 unsigned int dma_desc_bits;
2948 readl(devpriv->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
2949 dma_desc_bits &= ~PLX_END_OF_CHAIN_BIT;
2950 DEBUG_PRINT("restarting ao dma, descriptor reg 0x%x\n", dma_desc_bits);
2951 load_first_dma_descriptor(dev, 0, dma_desc_bits);
2953 dma_start_sync(dev, 0);
2956 static unsigned int load_ao_dma_buffer(struct comedi_device *dev,
2957 const struct comedi_cmd *cmd)
2959 struct pcidas64_private *devpriv = dev->private;
2960 unsigned int num_bytes, buffer_index, prev_buffer_index;
2961 unsigned int next_bits;
2963 buffer_index = devpriv->ao_dma_index;
2964 prev_buffer_index = prev_ao_dma_index(dev);
2966 DEBUG_PRINT("attempting to load ao buffer %i (0x%llx)\n", buffer_index,
2967 (unsigned long long)devpriv->ao_buffer_bus_addr[
2970 num_bytes = comedi_buf_read_n_available(dev->write_subdev->async);
2971 if (num_bytes > DMA_BUFFER_SIZE)
2972 num_bytes = DMA_BUFFER_SIZE;
2973 if (cmd->stop_src == TRIG_COUNT && num_bytes > devpriv->ao_count)
2974 num_bytes = devpriv->ao_count;
2975 num_bytes -= num_bytes % bytes_in_sample;
2980 DEBUG_PRINT("loading %i bytes\n", num_bytes);
2982 num_bytes = cfc_read_array_from_buffer(dev->write_subdev,
2984 ao_buffer[buffer_index],
2986 devpriv->ao_dma_desc[buffer_index].transfer_size =
2987 cpu_to_le32(num_bytes);
2988 /* set end of chain bit so we catch underruns */
2989 next_bits = le32_to_cpu(devpriv->ao_dma_desc[buffer_index].next);
2990 next_bits |= PLX_END_OF_CHAIN_BIT;
2991 devpriv->ao_dma_desc[buffer_index].next = cpu_to_le32(next_bits);
2992 /* clear end of chain bit on previous buffer now that we have set it
2993 * for the last buffer */
2994 next_bits = le32_to_cpu(devpriv->ao_dma_desc[prev_buffer_index].next);
2995 next_bits &= ~PLX_END_OF_CHAIN_BIT;
2996 devpriv->ao_dma_desc[prev_buffer_index].next = cpu_to_le32(next_bits);
2998 devpriv->ao_dma_index = (buffer_index + 1) % AO_DMA_RING_COUNT;
2999 devpriv->ao_count -= num_bytes;
3004 static void load_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3006 struct pcidas64_private *devpriv = dev->private;
3007 unsigned int num_bytes;
3008 unsigned int next_transfer_addr;
3009 void __iomem *pci_addr_reg =
3010 devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
3011 unsigned int buffer_index;
3014 buffer_index = devpriv->ao_dma_index;
3015 /* don't overwrite data that hasn't been transferred yet */
3016 next_transfer_addr = readl(pci_addr_reg);
3017 if (next_transfer_addr >=
3018 devpriv->ao_buffer_bus_addr[buffer_index] &&
3019 next_transfer_addr <
3020 devpriv->ao_buffer_bus_addr[buffer_index] +
3023 num_bytes = load_ao_dma_buffer(dev, cmd);
3024 } while (num_bytes >= DMA_BUFFER_SIZE);
3027 static void handle_ao_interrupt(struct comedi_device *dev,
3028 unsigned short status, unsigned int plx_status)
3030 struct pcidas64_private *devpriv = dev->private;
3031 struct comedi_subdevice *s = dev->write_subdev;
3032 struct comedi_async *async;
3033 struct comedi_cmd *cmd;
3034 uint8_t dma0_status;
3035 unsigned long flags;
3037 /* board might not support ao, in which case write_subdev is NULL */
3043 /* spin lock makes sure no one else changes plx dma control reg */
3044 spin_lock_irqsave(&dev->spinlock, flags);
3045 dma0_status = readb(devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
3046 if (plx_status & ICS_DMA0_A) { /* dma chan 0 interrupt */
3047 if ((dma0_status & PLX_DMA_EN_BIT) &&
3048 !(dma0_status & PLX_DMA_DONE_BIT))
3049 writeb(PLX_DMA_EN_BIT | PLX_CLEAR_DMA_INTR_BIT,
3050 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
3052 writeb(PLX_CLEAR_DMA_INTR_BIT,
3053 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
3054 spin_unlock_irqrestore(&dev->spinlock, flags);
3055 DEBUG_PRINT("dma0 status 0x%x\n", dma0_status);
3056 if (dma0_status & PLX_DMA_EN_BIT) {
3057 load_ao_dma(dev, cmd);
3058 /* try to recover from dma end-of-chain event */
3059 if (ao_dma_needs_restart(dev, dma0_status))
3060 restart_ao_dma(dev);
3062 DEBUG_PRINT(" cleared dma ch0 interrupt\n");
3064 spin_unlock_irqrestore(&dev->spinlock, flags);
3067 if ((status & DAC_DONE_BIT)) {
3068 async->events |= COMEDI_CB_EOA;
3069 if (ao_stopped_by_error(dev, cmd))
3070 async->events |= COMEDI_CB_ERROR;
3071 DEBUG_PRINT("plx dma0 desc reg 0x%x\n",
3072 readl(devpriv->plx9080_iobase +
3073 PLX_DMA0_DESCRIPTOR_REG));
3074 DEBUG_PRINT("plx dma0 address reg 0x%x\n",
3075 readl(devpriv->plx9080_iobase +
3076 PLX_DMA0_PCI_ADDRESS_REG));
3078 cfc_handle_events(dev, s);
3081 static irqreturn_t handle_interrupt(int irq, void *d)
3083 struct comedi_device *dev = d;
3084 struct pcidas64_private *devpriv = dev->private;
3085 unsigned short status;
3086 uint32_t plx_status;
3089 plx_status = readl(devpriv->plx9080_iobase + PLX_INTRCS_REG);
3090 status = readw(devpriv->main_iobase + HW_STATUS_REG);
3092 DEBUG_PRINT("hw status 0x%x, plx status 0x%x\n", status, plx_status);
3094 /* an interrupt before all the postconfig stuff gets done could
3095 * cause a NULL dereference if we continue through the
3096 * interrupt handler */
3097 if (!dev->attached) {
3098 DEBUG_PRINT("premature interrupt, ignoring\n");
3101 handle_ai_interrupt(dev, status, plx_status);
3102 handle_ao_interrupt(dev, status, plx_status);
3104 /* clear possible plx9080 interrupt sources */
3105 if (plx_status & ICS_LDIA) { /* clear local doorbell interrupt */
3106 plx_bits = readl(devpriv->plx9080_iobase + PLX_DBR_OUT_REG);
3107 writel(plx_bits, devpriv->plx9080_iobase + PLX_DBR_OUT_REG);
3108 DEBUG_PRINT(" cleared local doorbell bits 0x%x\n", plx_bits);
3111 DEBUG_PRINT("exiting handler\n");
3116 static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3118 struct pcidas64_private *devpriv = dev->private;
3119 unsigned long flags;
3121 spin_lock_irqsave(&dev->spinlock, flags);
3122 if (devpriv->ai_cmd_running == 0) {
3123 spin_unlock_irqrestore(&dev->spinlock, flags);
3126 devpriv->ai_cmd_running = 0;
3127 spin_unlock_irqrestore(&dev->spinlock, flags);
3129 disable_ai_pacing(dev);
3133 DEBUG_PRINT("ai canceled\n");
3137 static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
3138 struct comedi_insn *insn, unsigned int *data)
3140 const struct pcidas64_board *thisboard = comedi_board(dev);
3141 struct pcidas64_private *devpriv = dev->private;
3142 int chan = CR_CHAN(insn->chanspec);
3143 int range = CR_RANGE(insn->chanspec);
3145 /* do some initializing */
3146 writew(0, devpriv->main_iobase + DAC_CONTROL0_REG);
3149 set_dac_range_bits(dev, &devpriv->dac_control1_bits, chan, range);
3150 writew(devpriv->dac_control1_bits,
3151 devpriv->main_iobase + DAC_CONTROL1_REG);
3153 /* write to channel */
3154 if (thisboard->layout == LAYOUT_4020) {
3155 writew(data[0] & 0xff,
3156 devpriv->main_iobase + dac_lsb_4020_reg(chan));
3157 writew((data[0] >> 8) & 0xf,
3158 devpriv->main_iobase + dac_msb_4020_reg(chan));
3160 writew(data[0], devpriv->main_iobase + dac_convert_reg(chan));
3163 /* remember output value */
3164 devpriv->ao_value[chan] = data[0];
3169 static int ao_readback_insn(struct comedi_device *dev,
3170 struct comedi_subdevice *s,
3171 struct comedi_insn *insn, unsigned int *data)
3173 struct pcidas64_private *devpriv = dev->private;
3175 data[0] = devpriv->ao_value[CR_CHAN(insn->chanspec)];
3180 static void set_dac_control0_reg(struct comedi_device *dev,
3181 const struct comedi_cmd *cmd)
3183 struct pcidas64_private *devpriv = dev->private;
3184 unsigned int bits = DAC_ENABLE_BIT | WAVEFORM_GATE_LEVEL_BIT |
3185 WAVEFORM_GATE_ENABLE_BIT | WAVEFORM_GATE_SELECT_BIT;
3187 if (cmd->start_src == TRIG_EXT) {
3188 bits |= WAVEFORM_TRIG_EXT_BITS;
3189 if (cmd->start_arg & CR_INVERT)
3190 bits |= WAVEFORM_TRIG_FALLING_BIT;
3192 bits |= WAVEFORM_TRIG_SOFT_BITS;
3194 if (cmd->scan_begin_src == TRIG_EXT) {
3195 bits |= DAC_EXT_UPDATE_ENABLE_BIT;
3196 if (cmd->scan_begin_arg & CR_INVERT)
3197 bits |= DAC_EXT_UPDATE_FALLING_BIT;
3199 writew(bits, devpriv->main_iobase + DAC_CONTROL0_REG);
3202 static void set_dac_control1_reg(struct comedi_device *dev,
3203 const struct comedi_cmd *cmd)
3205 struct pcidas64_private *devpriv = dev->private;
3208 for (i = 0; i < cmd->chanlist_len; i++) {
3211 channel = CR_CHAN(cmd->chanlist[i]);
3212 range = CR_RANGE(cmd->chanlist[i]);
3213 set_dac_range_bits(dev, &devpriv->dac_control1_bits, channel,
3216 devpriv->dac_control1_bits |= DAC_SW_GATE_BIT;
3217 writew(devpriv->dac_control1_bits,
3218 devpriv->main_iobase + DAC_CONTROL1_REG);
3221 static void set_dac_select_reg(struct comedi_device *dev,
3222 const struct comedi_cmd *cmd)
3224 struct pcidas64_private *devpriv = dev->private;
3226 unsigned int first_channel, last_channel;
3228 first_channel = CR_CHAN(cmd->chanlist[0]);
3229 last_channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
3230 if (last_channel < first_channel)
3231 comedi_error(dev, "bug! last ao channel < first ao channel");
3233 bits = (first_channel & 0x7) | (last_channel & 0x7) << 3;
3235 writew(bits, devpriv->main_iobase + DAC_SELECT_REG);
3238 static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags)
3240 return get_divisor(ns, flags) - 2;
3243 static void set_dac_interval_regs(struct comedi_device *dev,
3244 const struct comedi_cmd *cmd)
3246 struct pcidas64_private *devpriv = dev->private;
3247 unsigned int divisor;
3249 if (cmd->scan_begin_src != TRIG_TIMER)
3252 divisor = get_ao_divisor(cmd->scan_begin_arg, cmd->flags);
3253 if (divisor > max_counter_value) {
3254 comedi_error(dev, "bug! ao divisor too big");
3255 divisor = max_counter_value;
3257 writew(divisor & 0xffff,
3258 devpriv->main_iobase + DAC_SAMPLE_INTERVAL_LOWER_REG);
3259 writew((divisor >> 16) & 0xff,
3260 devpriv->main_iobase + DAC_SAMPLE_INTERVAL_UPPER_REG);
3263 static int prep_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3265 struct pcidas64_private *devpriv = dev->private;
3266 unsigned int num_bytes;
3269 /* clear queue pointer too, since external queue has
3270 * weird interactions with ao fifo */
3271 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
3272 writew(0, devpriv->main_iobase + DAC_BUFFER_CLEAR_REG);
3274 num_bytes = (DAC_FIFO_SIZE / 2) * bytes_in_sample;
3275 if (cmd->stop_src == TRIG_COUNT &&
3276 num_bytes / bytes_in_sample > devpriv->ao_count)
3277 num_bytes = devpriv->ao_count * bytes_in_sample;
3278 num_bytes = cfc_read_array_from_buffer(dev->write_subdev,
3279 devpriv->ao_bounce_buffer,
3281 for (i = 0; i < num_bytes / bytes_in_sample; i++) {
3282 writew(devpriv->ao_bounce_buffer[i],
3283 devpriv->main_iobase + DAC_FIFO_REG);
3285 devpriv->ao_count -= num_bytes / bytes_in_sample;
3286 if (cmd->stop_src == TRIG_COUNT && devpriv->ao_count == 0)
3288 num_bytes = load_ao_dma_buffer(dev, cmd);
3291 load_ao_dma(dev, cmd);
3293 dma_start_sync(dev, 0);
3298 static inline int external_ai_queue_in_use(struct comedi_device *dev)
3300 const struct pcidas64_board *thisboard = comedi_board(dev);
3302 if (dev->read_subdev->busy)
3304 if (thisboard->layout == LAYOUT_4020)
3306 else if (use_internal_queue_6xxx(&dev->read_subdev->async->cmd))
3311 static int ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
3312 unsigned int trig_num)
3314 struct pcidas64_private *devpriv = dev->private;
3315 struct comedi_cmd *cmd = &s->async->cmd;
3321 retval = prep_ao_dma(dev, cmd);
3325 set_dac_control0_reg(dev, cmd);
3327 if (cmd->start_src == TRIG_INT)
3328 writew(0, devpriv->main_iobase + DAC_START_REG);
3330 s->async->inttrig = NULL;
3335 static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
3337 struct pcidas64_private *devpriv = dev->private;
3338 struct comedi_cmd *cmd = &s->async->cmd;
3340 if (external_ai_queue_in_use(dev)) {
3341 warn_external_queue(dev);
3344 /* disable analog output system during setup */
3345 writew(0x0, devpriv->main_iobase + DAC_CONTROL0_REG);
3347 devpriv->ao_dma_index = 0;
3348 devpriv->ao_count = cmd->stop_arg * cmd->chanlist_len;
3350 set_dac_select_reg(dev, cmd);
3351 set_dac_interval_regs(dev, cmd);
3352 load_first_dma_descriptor(dev, 0, devpriv->ao_dma_desc_bus_addr |
3353 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT);
3355 set_dac_control1_reg(dev, cmd);
3356 s->async->inttrig = ao_inttrig;
3361 static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
3362 struct comedi_cmd *cmd)
3364 const struct pcidas64_board *thisboard = comedi_board(dev);
3366 unsigned int tmp_arg;
3369 /* Step 1 : check if triggers are trivially valid */
3371 err |= cfc_check_trigger_src(&cmd->start_src, TRIG_INT | TRIG_EXT);
3372 err |= cfc_check_trigger_src(&cmd->scan_begin_src,
3373 TRIG_TIMER | TRIG_EXT);
3374 err |= cfc_check_trigger_src(&cmd->convert_src, TRIG_NOW);
3375 err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
3376 err |= cfc_check_trigger_src(&cmd->stop_src, TRIG_NONE);
3381 /* Step 2a : make sure trigger sources are unique */
3383 err |= cfc_check_trigger_is_unique(cmd->start_src);
3384 err |= cfc_check_trigger_is_unique(cmd->scan_begin_src);
3386 /* Step 2b : and mutually compatible */
3388 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
3390 if (cmd->stop_src != TRIG_COUNT &&
3391 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
3397 /* Step 3: check if arguments are trivially valid */
3399 if (cmd->scan_begin_src == TRIG_TIMER) {
3400 err |= cfc_check_trigger_arg_min(&cmd->scan_begin_arg,
3401 thisboard->ao_scan_speed);
3402 if (get_ao_divisor(cmd->scan_begin_arg, cmd->flags) >
3403 max_counter_value) {
3404 cmd->scan_begin_arg = (max_counter_value + 2) *
3410 err |= cfc_check_trigger_arg_min(&cmd->chanlist_len, 1);
3411 err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
3416 /* step 4: fix up any arguments */
3418 if (cmd->scan_begin_src == TRIG_TIMER) {
3419 tmp_arg = cmd->scan_begin_arg;
3420 cmd->scan_begin_arg = get_divisor(cmd->scan_begin_arg,
3421 cmd->flags) * TIMER_BASE;
3422 if (tmp_arg != cmd->scan_begin_arg)
3429 if (cmd->chanlist) {
3430 unsigned int first_channel = CR_CHAN(cmd->chanlist[0]);
3431 for (i = 1; i < cmd->chanlist_len; i++) {
3432 if (CR_CHAN(cmd->chanlist[i]) != first_channel + i) {
3434 "chanlist must use consecutive channels");
3447 static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3449 struct pcidas64_private *devpriv = dev->private;
3451 writew(0x0, devpriv->main_iobase + DAC_CONTROL0_REG);
3456 static int dio_callback(int dir, int port, int data, unsigned long arg)
3458 void __iomem *iobase = (void __iomem *)arg;
3460 writeb(data, iobase + port);
3461 DEBUG_PRINT("wrote 0x%x to port %i\n", data, port);
3464 return readb(iobase + port);
3468 static int dio_callback_4020(int dir, int port, int data, unsigned long arg)
3470 void __iomem *iobase = (void __iomem *)arg;
3472 writew(data, iobase + 2 * port);
3475 return readw(iobase + 2 * port);
3479 static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
3480 struct comedi_insn *insn, unsigned int *data)
3482 struct pcidas64_private *devpriv = dev->private;
3485 bits = readb(devpriv->dio_counter_iobase + DI_REG);
3493 static int do_wbits(struct comedi_device *dev,
3494 struct comedi_subdevice *s,
3495 struct comedi_insn *insn,
3498 struct pcidas64_private *devpriv = dev->private;
3500 if (comedi_dio_update_state(s, data))
3501 writeb(s->state, devpriv->dio_counter_iobase + DO_REG);
3508 static int dio_60xx_config_insn(struct comedi_device *dev,
3509 struct comedi_subdevice *s,
3510 struct comedi_insn *insn,
3513 struct pcidas64_private *devpriv = dev->private;
3516 ret = comedi_dio_insn_config(dev, s, insn, data, 0);
3521 devpriv->dio_counter_iobase + DIO_DIRECTION_60XX_REG);
3526 static int dio_60xx_wbits(struct comedi_device *dev,
3527 struct comedi_subdevice *s,
3528 struct comedi_insn *insn,
3531 struct pcidas64_private *devpriv = dev->private;
3533 if (comedi_dio_update_state(s, data)) {
3535 devpriv->dio_counter_iobase + DIO_DATA_60XX_REG);
3538 data[1] = readb(devpriv->dio_counter_iobase + DIO_DATA_60XX_REG);
3543 /* pci-6025 8800 caldac:
3544 * address 0 == dac channel 0 offset
3545 * address 1 == dac channel 0 gain
3546 * address 2 == dac channel 1 offset
3547 * address 3 == dac channel 1 gain
3548 * address 4 == fine adc offset
3549 * address 5 == coarse adc offset
3550 * address 6 == coarse adc gain
3551 * address 7 == fine adc gain
3553 /* pci-6402/16 uses all 8 channels for dac:
3554 * address 0 == dac channel 0 fine gain
3555 * address 1 == dac channel 0 coarse gain
3556 * address 2 == dac channel 0 coarse offset
3557 * address 3 == dac channel 1 coarse offset
3558 * address 4 == dac channel 1 fine gain
3559 * address 5 == dac channel 1 coarse gain
3560 * address 6 == dac channel 0 fine offset
3561 * address 7 == dac channel 1 fine offset
3564 static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
3567 struct pcidas64_private *devpriv = dev->private;
3568 static const int num_caldac_channels = 8;
3569 static const int bitstream_length = 11;
3570 unsigned int bitstream = ((address & 0x7) << 8) | value;
3571 unsigned int bit, register_bits;
3572 static const int caldac_8800_udelay = 1;
3574 if (address >= num_caldac_channels) {
3575 comedi_error(dev, "illegal caldac channel");
3578 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3580 if (bitstream & bit)
3581 register_bits |= SERIAL_DATA_IN_BIT;
3582 udelay(caldac_8800_udelay);
3583 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3584 register_bits |= SERIAL_CLOCK_BIT;
3585 udelay(caldac_8800_udelay);
3586 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3588 udelay(caldac_8800_udelay);
3589 writew(SELECT_8800_BIT, devpriv->main_iobase + CALIBRATION_REG);
3590 udelay(caldac_8800_udelay);
3591 writew(0, devpriv->main_iobase + CALIBRATION_REG);
3592 udelay(caldac_8800_udelay);
3597 static int caldac_i2c_write(struct comedi_device *dev,
3598 unsigned int caldac_channel, unsigned int value)
3600 uint8_t serial_bytes[3];
3603 /* manual has gain and offset bits switched */
3610 NOT_CLEAR_REGISTERS = 0x20,
3613 switch (caldac_channel) {
3614 case 0: /* chan 0 offset */
3615 i2c_addr = CALDAC0_I2C_ADDR;
3616 serial_bytes[0] = OFFSET_0_2;
3618 case 1: /* chan 1 offset */
3619 i2c_addr = CALDAC0_I2C_ADDR;
3620 serial_bytes[0] = OFFSET_1_3;
3622 case 2: /* chan 2 offset */
3623 i2c_addr = CALDAC1_I2C_ADDR;
3624 serial_bytes[0] = OFFSET_0_2;
3626 case 3: /* chan 3 offset */
3627 i2c_addr = CALDAC1_I2C_ADDR;
3628 serial_bytes[0] = OFFSET_1_3;
3630 case 4: /* chan 0 gain */
3631 i2c_addr = CALDAC0_I2C_ADDR;
3632 serial_bytes[0] = GAIN_0_2;
3634 case 5: /* chan 1 gain */
3635 i2c_addr = CALDAC0_I2C_ADDR;
3636 serial_bytes[0] = GAIN_1_3;
3638 case 6: /* chan 2 gain */
3639 i2c_addr = CALDAC1_I2C_ADDR;
3640 serial_bytes[0] = GAIN_0_2;
3642 case 7: /* chan 3 gain */
3643 i2c_addr = CALDAC1_I2C_ADDR;
3644 serial_bytes[0] = GAIN_1_3;
3647 comedi_error(dev, "invalid caldac channel\n");
3651 serial_bytes[1] = NOT_CLEAR_REGISTERS | ((value >> 8) & 0xf);
3652 serial_bytes[2] = value & 0xff;
3653 i2c_write(dev, i2c_addr, serial_bytes, 3);
3657 static void caldac_write(struct comedi_device *dev, unsigned int channel,
3660 const struct pcidas64_board *thisboard = comedi_board(dev);
3661 struct pcidas64_private *devpriv = dev->private;
3663 devpriv->caldac_state[channel] = value;
3665 switch (thisboard->layout) {
3668 caldac_8800_write(dev, channel, value);
3671 caldac_i2c_write(dev, channel, value);
3678 static int calib_write_insn(struct comedi_device *dev,
3679 struct comedi_subdevice *s,
3680 struct comedi_insn *insn, unsigned int *data)
3682 struct pcidas64_private *devpriv = dev->private;
3683 int channel = CR_CHAN(insn->chanspec);
3685 /* return immediately if setting hasn't changed, since
3686 * programming these things is slow */
3687 if (devpriv->caldac_state[channel] == data[0])
3690 caldac_write(dev, channel, data[0]);
3695 static int calib_read_insn(struct comedi_device *dev,
3696 struct comedi_subdevice *s, struct comedi_insn *insn,
3699 struct pcidas64_private *devpriv = dev->private;
3700 unsigned int channel = CR_CHAN(insn->chanspec);
3702 data[0] = devpriv->caldac_state[channel];
3707 static void ad8402_write(struct comedi_device *dev, unsigned int channel,
3710 struct pcidas64_private *devpriv = dev->private;
3711 static const int bitstream_length = 10;
3712 unsigned int bit, register_bits;
3713 unsigned int bitstream = ((channel & 0x3) << 8) | (value & 0xff);
3714 static const int ad8402_udelay = 1;
3716 devpriv->ad8402_state[channel] = value;
3718 register_bits = SELECT_8402_64XX_BIT;
3719 udelay(ad8402_udelay);
3720 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3722 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3723 if (bitstream & bit)
3724 register_bits |= SERIAL_DATA_IN_BIT;
3726 register_bits &= ~SERIAL_DATA_IN_BIT;
3727 udelay(ad8402_udelay);
3728 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3729 udelay(ad8402_udelay);
3730 writew(register_bits | SERIAL_CLOCK_BIT,
3731 devpriv->main_iobase + CALIBRATION_REG);
3734 udelay(ad8402_udelay);
3735 writew(0, devpriv->main_iobase + CALIBRATION_REG);
3738 /* for pci-das6402/16, channel 0 is analog input gain and channel 1 is offset */
3739 static int ad8402_write_insn(struct comedi_device *dev,
3740 struct comedi_subdevice *s,
3741 struct comedi_insn *insn, unsigned int *data)
3743 struct pcidas64_private *devpriv = dev->private;
3744 int channel = CR_CHAN(insn->chanspec);
3746 /* return immediately if setting hasn't changed, since
3747 * programming these things is slow */
3748 if (devpriv->ad8402_state[channel] == data[0])
3751 devpriv->ad8402_state[channel] = data[0];
3753 ad8402_write(dev, channel, data[0]);
3758 static int ad8402_read_insn(struct comedi_device *dev,
3759 struct comedi_subdevice *s,
3760 struct comedi_insn *insn, unsigned int *data)
3762 struct pcidas64_private *devpriv = dev->private;
3763 unsigned int channel = CR_CHAN(insn->chanspec);
3765 data[0] = devpriv->ad8402_state[channel];
3770 static uint16_t read_eeprom(struct comedi_device *dev, uint8_t address)
3772 struct pcidas64_private *devpriv = dev->private;
3773 static const int bitstream_length = 11;
3774 static const int read_command = 0x6;
3775 unsigned int bitstream = (read_command << 8) | address;
3777 void __iomem * const plx_control_addr =
3778 devpriv->plx9080_iobase + PLX_CONTROL_REG;
3780 static const int value_length = 16;
3781 static const int eeprom_udelay = 1;
3783 udelay(eeprom_udelay);
3784 devpriv->plx_control_bits &= ~CTL_EE_CLK & ~CTL_EE_CS;
3785 /* make sure we don't send anything to the i2c bus on 4020 */
3786 devpriv->plx_control_bits |= CTL_USERO;
3787 writel(devpriv->plx_control_bits, plx_control_addr);
3788 /* activate serial eeprom */
3789 udelay(eeprom_udelay);
3790 devpriv->plx_control_bits |= CTL_EE_CS;
3791 writel(devpriv->plx_control_bits, plx_control_addr);
3793 /* write read command and desired memory address */
3794 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3795 /* set bit to be written */
3796 udelay(eeprom_udelay);
3797 if (bitstream & bit)
3798 devpriv->plx_control_bits |= CTL_EE_W;
3800 devpriv->plx_control_bits &= ~CTL_EE_W;
3801 writel(devpriv->plx_control_bits, plx_control_addr);
3803 udelay(eeprom_udelay);
3804 devpriv->plx_control_bits |= CTL_EE_CLK;
3805 writel(devpriv->plx_control_bits, plx_control_addr);
3806 udelay(eeprom_udelay);
3807 devpriv->plx_control_bits &= ~CTL_EE_CLK;
3808 writel(devpriv->plx_control_bits, plx_control_addr);
3810 /* read back value from eeprom memory location */
3812 for (bit = 1 << (value_length - 1); bit; bit >>= 1) {
3814 udelay(eeprom_udelay);
3815 devpriv->plx_control_bits |= CTL_EE_CLK;
3816 writel(devpriv->plx_control_bits, plx_control_addr);
3817 udelay(eeprom_udelay);
3818 devpriv->plx_control_bits &= ~CTL_EE_CLK;
3819 writel(devpriv->plx_control_bits, plx_control_addr);
3820 udelay(eeprom_udelay);
3821 if (readl(plx_control_addr) & CTL_EE_R)
3825 /* deactivate eeprom serial input */
3826 udelay(eeprom_udelay);
3827 devpriv->plx_control_bits &= ~CTL_EE_CS;
3828 writel(devpriv->plx_control_bits, plx_control_addr);
3833 static int eeprom_read_insn(struct comedi_device *dev,
3834 struct comedi_subdevice *s,
3835 struct comedi_insn *insn, unsigned int *data)
3837 data[0] = read_eeprom(dev, CR_CHAN(insn->chanspec));
3842 /* Allocate and initialize the subdevice structures.
3844 static int setup_subdevices(struct comedi_device *dev)
3846 const struct pcidas64_board *thisboard = comedi_board(dev);
3847 struct pcidas64_private *devpriv = dev->private;
3848 struct comedi_subdevice *s;
3849 void __iomem *dio_8255_iobase;
3853 ret = comedi_alloc_subdevices(dev, 10);
3857 s = &dev->subdevices[0];
3858 /* analog input subdevice */
3859 dev->read_subdev = s;
3860 s->type = COMEDI_SUBD_AI;
3861 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DITHER | SDF_CMD_READ;
3862 if (thisboard->layout == LAYOUT_60XX)
3863 s->subdev_flags |= SDF_COMMON | SDF_DIFF;
3864 else if (thisboard->layout == LAYOUT_64XX)
3865 s->subdev_flags |= SDF_DIFF;
3866 /* XXX Number of inputs in differential mode is ignored */
3867 s->n_chan = thisboard->ai_se_chans;
3868 s->len_chanlist = 0x2000;
3869 s->maxdata = (1 << thisboard->ai_bits) - 1;
3870 s->range_table = thisboard->ai_range_table;
3871 s->insn_read = ai_rinsn;
3872 s->insn_config = ai_config_insn;
3874 s->do_cmdtest = ai_cmdtest;
3875 s->cancel = ai_cancel;
3876 if (thisboard->layout == LAYOUT_4020) {
3878 /* set adc to read from inputs
3879 * (not internal calibration sources) */
3880 devpriv->i2c_cal_range_bits = adc_src_4020_bits(4);
3881 /* set channels to +-5 volt input ranges */
3882 for (i = 0; i < s->n_chan; i++)
3883 devpriv->i2c_cal_range_bits |= attenuate_bit(i);
3884 data = devpriv->i2c_cal_range_bits;
3885 i2c_write(dev, RANGE_CAL_I2C_ADDR, &data, sizeof(data));
3888 /* analog output subdevice */
3889 s = &dev->subdevices[1];
3890 if (thisboard->ao_nchan) {
3891 s->type = COMEDI_SUBD_AO;
3892 s->subdev_flags = SDF_READABLE | SDF_WRITABLE |
3893 SDF_GROUND | SDF_CMD_WRITE;
3894 s->n_chan = thisboard->ao_nchan;
3895 s->maxdata = (1 << thisboard->ao_bits) - 1;
3896 s->range_table = thisboard->ao_range_table;
3897 s->insn_read = ao_readback_insn;
3898 s->insn_write = ao_winsn;
3899 if (ao_cmd_is_supported(thisboard)) {
3900 dev->write_subdev = s;
3901 s->do_cmdtest = ao_cmdtest;
3903 s->len_chanlist = thisboard->ao_nchan;
3904 s->cancel = ao_cancel;
3907 s->type = COMEDI_SUBD_UNUSED;
3911 s = &dev->subdevices[2];
3912 if (thisboard->layout == LAYOUT_64XX) {
3913 s->type = COMEDI_SUBD_DI;
3914 s->subdev_flags = SDF_READABLE;
3917 s->range_table = &range_digital;
3918 s->insn_bits = di_rbits;
3920 s->type = COMEDI_SUBD_UNUSED;
3922 /* digital output */
3923 if (thisboard->layout == LAYOUT_64XX) {
3924 s = &dev->subdevices[3];
3925 s->type = COMEDI_SUBD_DO;
3926 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
3929 s->range_table = &range_digital;
3930 s->insn_bits = do_wbits;
3932 s->type = COMEDI_SUBD_UNUSED;
3935 s = &dev->subdevices[4];
3936 if (thisboard->has_8255) {
3937 if (thisboard->layout == LAYOUT_4020) {
3938 dio_8255_iobase = devpriv->main_iobase + I8255_4020_REG;
3939 subdev_8255_init(dev, s, dio_callback_4020,
3940 (unsigned long)dio_8255_iobase);
3943 devpriv->dio_counter_iobase + DIO_8255_OFFSET;
3944 subdev_8255_init(dev, s, dio_callback,
3945 (unsigned long)dio_8255_iobase);
3948 s->type = COMEDI_SUBD_UNUSED;
3950 /* 8 channel dio for 60xx */
3951 s = &dev->subdevices[5];
3952 if (thisboard->layout == LAYOUT_60XX) {
3953 s->type = COMEDI_SUBD_DIO;
3954 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
3957 s->range_table = &range_digital;
3958 s->insn_config = dio_60xx_config_insn;
3959 s->insn_bits = dio_60xx_wbits;
3961 s->type = COMEDI_SUBD_UNUSED;
3964 s = &dev->subdevices[6];
3965 s->type = COMEDI_SUBD_CALIB;
3966 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3968 if (thisboard->layout == LAYOUT_4020)
3972 s->insn_read = calib_read_insn;
3973 s->insn_write = calib_write_insn;
3974 for (i = 0; i < s->n_chan; i++)
3975 caldac_write(dev, i, s->maxdata / 2);
3977 /* 2 channel ad8402 potentiometer */
3978 s = &dev->subdevices[7];
3979 if (thisboard->layout == LAYOUT_64XX) {
3980 s->type = COMEDI_SUBD_CALIB;
3981 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3983 s->insn_read = ad8402_read_insn;
3984 s->insn_write = ad8402_write_insn;
3986 for (i = 0; i < s->n_chan; i++)
3987 ad8402_write(dev, i, s->maxdata / 2);
3989 s->type = COMEDI_SUBD_UNUSED;
3991 /* serial EEPROM, if present */
3992 s = &dev->subdevices[8];
3993 if (readl(devpriv->plx9080_iobase + PLX_CONTROL_REG) & CTL_EECHK) {
3994 s->type = COMEDI_SUBD_MEMORY;
3995 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
3997 s->maxdata = 0xffff;
3998 s->insn_read = eeprom_read_insn;
4000 s->type = COMEDI_SUBD_UNUSED;
4002 /* user counter subd XXX */
4003 s = &dev->subdevices[9];
4004 s->type = COMEDI_SUBD_UNUSED;
4009 static int auto_attach(struct comedi_device *dev,
4010 unsigned long context)
4012 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
4013 const struct pcidas64_board *thisboard = NULL;
4014 struct pcidas64_private *devpriv;
4015 uint32_t local_range, local_decode;
4018 if (context < ARRAY_SIZE(pcidas64_boards))
4019 thisboard = &pcidas64_boards[context];
4022 dev->board_ptr = thisboard;
4024 devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
4028 retval = comedi_pci_enable(dev);
4031 pci_set_master(pcidev);
4033 /* Initialize dev->board_name */
4034 dev->board_name = thisboard->name;
4036 devpriv->main_phys_iobase = pci_resource_start(pcidev, 2);
4037 devpriv->dio_counter_phys_iobase = pci_resource_start(pcidev, 3);
4039 devpriv->plx9080_iobase = pci_ioremap_bar(pcidev, 0);
4040 devpriv->main_iobase = pci_ioremap_bar(pcidev, 2);
4041 devpriv->dio_counter_iobase = pci_ioremap_bar(pcidev, 3);
4043 if (!devpriv->plx9080_iobase || !devpriv->main_iobase
4044 || !devpriv->dio_counter_iobase) {
4045 dev_warn(dev->class_dev, "failed to remap io memory\n");
4049 DEBUG_PRINT(" plx9080 remapped to 0x%p\n", devpriv->plx9080_iobase);
4050 DEBUG_PRINT(" main remapped to 0x%p\n", devpriv->main_iobase);
4051 DEBUG_PRINT(" diocounter remapped to 0x%p\n",
4052 devpriv->dio_counter_iobase);
4054 /* figure out what local addresses are */
4055 local_range = readl(devpriv->plx9080_iobase + PLX_LAS0RNG_REG) &
4057 local_decode = readl(devpriv->plx9080_iobase + PLX_LAS0MAP_REG) &
4058 local_range & LMAP_MEM_MASK;
4059 devpriv->local0_iobase = ((uint32_t)devpriv->main_phys_iobase &
4060 ~local_range) | local_decode;
4061 local_range = readl(devpriv->plx9080_iobase + PLX_LAS1RNG_REG) &
4063 local_decode = readl(devpriv->plx9080_iobase + PLX_LAS1MAP_REG) &
4064 local_range & LMAP_MEM_MASK;
4065 devpriv->local1_iobase = ((uint32_t)devpriv->dio_counter_phys_iobase &
4066 ~local_range) | local_decode;
4068 DEBUG_PRINT(" local 0 io addr 0x%x\n", devpriv->local0_iobase);
4069 DEBUG_PRINT(" local 1 io addr 0x%x\n", devpriv->local1_iobase);
4071 retval = alloc_and_init_dma_members(dev);
4075 devpriv->hw_revision =
4076 hw_revision(dev, readw(devpriv->main_iobase + HW_STATUS_REG));
4077 dev_dbg(dev->class_dev, "stc hardware revision %i\n",
4078 devpriv->hw_revision);
4080 init_stc_registers(dev);
4082 if (request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED,
4083 "cb_pcidas64", dev)) {
4084 dev_dbg(dev->class_dev, "unable to allocate irq %u\n",
4088 dev->irq = pcidev->irq;
4089 dev_dbg(dev->class_dev, "irq %u\n", dev->irq);
4091 retval = setup_subdevices(dev);
4098 static void detach(struct comedi_device *dev)
4100 const struct pcidas64_board *thisboard = comedi_board(dev);
4101 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
4102 struct pcidas64_private *devpriv = dev->private;
4106 free_irq(dev->irq, dev);
4109 if (devpriv->plx9080_iobase) {
4110 disable_plx_interrupts(dev);
4111 iounmap(devpriv->plx9080_iobase);
4113 if (devpriv->main_iobase)
4114 iounmap(devpriv->main_iobase);
4115 if (devpriv->dio_counter_iobase)
4116 iounmap(devpriv->dio_counter_iobase);
4117 /* free pci dma buffers */
4118 for (i = 0; i < ai_dma_ring_count(thisboard); i++) {
4119 if (devpriv->ai_buffer[i])
4120 pci_free_consistent(pcidev,
4122 devpriv->ai_buffer[i],
4123 devpriv->ai_buffer_bus_addr[i]);
4125 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
4126 if (devpriv->ao_buffer[i])
4127 pci_free_consistent(pcidev,
4129 devpriv->ao_buffer[i],
4130 devpriv->ao_buffer_bus_addr[i]);
4132 /* free dma descriptors */
4133 if (devpriv->ai_dma_desc)
4134 pci_free_consistent(pcidev,
4135 sizeof(struct plx_dma_desc) *
4136 ai_dma_ring_count(thisboard),
4137 devpriv->ai_dma_desc,
4138 devpriv->ai_dma_desc_bus_addr);
4139 if (devpriv->ao_dma_desc)
4140 pci_free_consistent(pcidev,
4141 sizeof(struct plx_dma_desc) *
4143 devpriv->ao_dma_desc,
4144 devpriv->ao_dma_desc_bus_addr);
4147 comedi_pci_disable(dev);
4150 static struct comedi_driver cb_pcidas64_driver = {
4151 .driver_name = "cb_pcidas64",
4152 .module = THIS_MODULE,
4153 .auto_attach = auto_attach,
4157 static int cb_pcidas64_pci_probe(struct pci_dev *dev,
4158 const struct pci_device_id *id)
4160 return comedi_pci_auto_config(dev, &cb_pcidas64_driver,
4164 static DEFINE_PCI_DEVICE_TABLE(cb_pcidas64_pci_table) = {
4165 { PCI_VDEVICE(CB, 0x001d), BOARD_PCIDAS6402_16 },
4166 { PCI_VDEVICE(CB, 0x001e), BOARD_PCIDAS6402_12 },
4167 { PCI_VDEVICE(CB, 0x0035), BOARD_PCIDAS64_M1_16 },
4168 { PCI_VDEVICE(CB, 0x0036), BOARD_PCIDAS64_M2_16 },
4169 { PCI_VDEVICE(CB, 0x0037), BOARD_PCIDAS64_M3_16 },
4170 { PCI_VDEVICE(CB, 0x0052), BOARD_PCIDAS4020_12 },
4171 { PCI_VDEVICE(CB, 0x005d), BOARD_PCIDAS6023 },
4172 { PCI_VDEVICE(CB, 0x005e), BOARD_PCIDAS6025 },
4173 { PCI_VDEVICE(CB, 0x005f), BOARD_PCIDAS6030 },
4174 { PCI_VDEVICE(CB, 0x0060), BOARD_PCIDAS6031 },
4175 { PCI_VDEVICE(CB, 0x0061), BOARD_PCIDAS6032 },
4176 { PCI_VDEVICE(CB, 0x0062), BOARD_PCIDAS6033 },
4177 { PCI_VDEVICE(CB, 0x0063), BOARD_PCIDAS6034 },
4178 { PCI_VDEVICE(CB, 0x0064), BOARD_PCIDAS6035 },
4179 { PCI_VDEVICE(CB, 0x0065), BOARD_PCIDAS6040 },
4180 { PCI_VDEVICE(CB, 0x0066), BOARD_PCIDAS6052 },
4181 { PCI_VDEVICE(CB, 0x0067), BOARD_PCIDAS6070 },
4182 { PCI_VDEVICE(CB, 0x0068), BOARD_PCIDAS6071 },
4183 { PCI_VDEVICE(CB, 0x006f), BOARD_PCIDAS6036 },
4184 { PCI_VDEVICE(CB, 0x0078), BOARD_PCIDAS6013 },
4185 { PCI_VDEVICE(CB, 0x0079), BOARD_PCIDAS6014 },
4188 MODULE_DEVICE_TABLE(pci, cb_pcidas64_pci_table);
4190 static struct pci_driver cb_pcidas64_pci_driver = {
4191 .name = "cb_pcidas64",
4192 .id_table = cb_pcidas64_pci_table,
4193 .probe = cb_pcidas64_pci_probe,
4194 .remove = comedi_pci_auto_unconfig,
4196 module_comedi_pci_driver(cb_pcidas64_driver, cb_pcidas64_pci_driver);
4198 MODULE_AUTHOR("Comedi http://www.comedi.org");
4199 MODULE_DESCRIPTION("Comedi low-level driver");
4200 MODULE_LICENSE("GPL");