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