linux/drivers/staging/comedi/drivers/cb_pcidas64.c
<<
>>
Prefs
   1/*
   2    comedi/drivers/cb_pcidas64.c
   3    This is a driver for the ComputerBoards/MeasurementComputing PCI-DAS
   4    64xx, 60xx, and 4020 cards.
   5
   6    Author:  Frank Mori Hess <fmhess@users.sourceforge.net>
   7    Copyright (C) 2001, 2002 Frank Mori Hess
   8
   9    Thanks also go to the following people:
  10
  11    Steve Rosenbluth, for providing the source code for
  12    his pci-das6402 driver, and source code for working QNX pci-6402
  13    drivers by Greg Laird and Mariusz Bogacz.  None of the code was
  14    used directly here, but it was useful as an additional source of
  15    documentation on how to program the boards.
  16
  17    John Sims, for much testing and feedback on pcidas-4020 support.
  18
  19    COMEDI - Linux Control and Measurement Device Interface
  20    Copyright (C) 1997-8 David A. Schleef <ds@schleef.org>
  21
  22    This program is free software; you can redistribute it and/or modify
  23    it under the terms of the GNU General Public License as published by
  24    the Free Software Foundation; either version 2 of the License, or
  25    (at your option) any later version.
  26
  27    This program is distributed in the hope that it will be useful,
  28    but WITHOUT ANY WARRANTY; without even the implied warranty of
  29    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  30    GNU General Public License for more details.
  31
  32    You should have received a copy of the GNU General Public License
  33    along with this program; if not, write to the Free Software
  34    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  35
  36************************************************************************/
  37
  38/*
  39
  40Driver: cb_pcidas64
  41Description: MeasurementComputing PCI-DAS64xx, 60XX, and 4020 series with the PLX 9080 PCI controller
  42Author: Frank Mori Hess <fmhess@users.sourceforge.net>
  43Status: works
  44Updated: 2002-10-09
  45Devices: [Measurement Computing] PCI-DAS6402/16 (cb_pcidas64),
  46  PCI-DAS6402/12, PCI-DAS64/M1/16, PCI-DAS64/M2/16,
  47  PCI-DAS64/M3/16, PCI-DAS6402/16/JR, PCI-DAS64/M1/16/JR,
  48  PCI-DAS64/M2/16/JR, PCI-DAS64/M3/16/JR, PCI-DAS64/M1/14,
  49  PCI-DAS64/M2/14, PCI-DAS64/M3/14, PCI-DAS6013, PCI-DAS6014,
  50  PCI-DAS6023, PCI-DAS6025, PCI-DAS6030,
  51  PCI-DAS6031, PCI-DAS6032, PCI-DAS6033, PCI-DAS6034,
  52  PCI-DAS6035, PCI-DAS6036, PCI-DAS6040, PCI-DAS6052,
  53  PCI-DAS6070, PCI-DAS6071, PCI-DAS4020/12
  54
  55Configuration options:
  56   [0] - PCI bus of device (optional)
  57   [1] - PCI slot of device (optional)
  58
  59These boards may be autocalibrated with the comedi_calibrate utility.
  60
  61To select the bnc trigger input on the 4020 (instead of the dio input),
  62specify a nonzero channel in the chanspec.  If you wish to use an external
  63master clock on the 4020, you may do so by setting the scan_begin_src
  64to TRIG_OTHER, and using an INSN_CONFIG_TIMER_1 configuration insn
  65to configure the divisor to use for the external clock.
  66
  67Some devices are not identified because the PCI device IDs are not yet
  68known. If you have such a board, please file a bug report at
  69https://bugs.comedi.org.
  70
  71*/
  72
  73/*
  74
  75TODO:
  76        make it return error if user attempts an ai command that uses the
  77                external queue, and an ao command simultaneously
  78        user counter subdevice
  79        there are a number of boards this driver will support when they are
  80                fully released, but does not yet since the pci device id numbers
  81                are not yet available.
  82        support prescaled 100khz clock for slow pacing (not available on 6000 series?)
  83        make ao fifo size adjustable like ai fifo
  84*/
  85
  86#include "../comedidev.h"
  87#include <linux/delay.h>
  88#include <linux/interrupt.h>
  89
  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*/
 111static const int max_counter_value = 0xffffff;
 112
 113/* PCI-DAS64xxx base addresses */
 114
 115/* indices of base address regions */
 116enum base_address_regions {
 117        PLX9080_BADDRINDEX = 0,
 118        MAIN_BADDRINDEX = 2,
 119        DIO_COUNTER_BADDRINDEX = 3,
 120};
 121
 122/* priv(dev)->main_iobase registers */
 123enum write_only_registers {
 124        INTR_ENABLE_REG = 0x0,  /*  interrupt enable register */
 125        HW_CONFIG_REG = 0x2,    /*  hardware config register */
 126        DAQ_SYNC_REG = 0xc,
 127        DAQ_ATRIG_LOW_4020_REG = 0xc,
 128        ADC_CONTROL0_REG = 0x10,        /*  adc control register 0 */
 129        ADC_CONTROL1_REG = 0x12,        /*  adc control register 1 */
 130        CALIBRATION_REG = 0x14,
 131        ADC_SAMPLE_INTERVAL_LOWER_REG = 0x16,   /*  lower 16 bits of adc sample interval counter */
 132        ADC_SAMPLE_INTERVAL_UPPER_REG = 0x18,   /*  upper 8 bits of adc sample interval counter */
 133        ADC_DELAY_INTERVAL_LOWER_REG = 0x1a,    /*  lower 16 bits of delay interval counter */
 134        ADC_DELAY_INTERVAL_UPPER_REG = 0x1c,    /*  upper 8 bits of delay interval counter */
 135        ADC_COUNT_LOWER_REG = 0x1e,     /*  lower 16 bits of hardware conversion/scan counter */
 136        ADC_COUNT_UPPER_REG = 0x20,     /*  upper 8 bits of hardware conversion/scan counter */
 137        ADC_START_REG = 0x22,   /*  software trigger to start 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 */
 141        ADC_BUFFER_CLEAR_REG = 0x2a,
 142        ADC_QUEUE_HIGH_REG = 0x2c,      /*  high channel for internal queue, use adc_chan_bits() inline above */
 143        DAC_CONTROL0_REG = 0x50,        /*  dac control register 0 */
 144        DAC_CONTROL1_REG = 0x52,        /*  dac control register 0 */
 145        DAC_SAMPLE_INTERVAL_LOWER_REG = 0x54,   /*  lower 16 bits of dac sample interval counter */
 146        DAC_SAMPLE_INTERVAL_UPPER_REG = 0x56,   /*  upper 8 bits of dac sample interval counter */
 147        DAC_SELECT_REG = 0x60,
 148        DAC_START_REG = 0x64,
 149        DAC_BUFFER_CLEAR_REG = 0x66,    /*  clear dac buffer */
 150};
 151static inline unsigned int dac_convert_reg(unsigned int channel)
 152{
 153        return 0x70 + (2 * (channel & 0x1));
 154}
 155
 156static inline unsigned int dac_lsb_4020_reg(unsigned int channel)
 157{
 158        return 0x70 + (4 * (channel & 0x1));
 159}
 160
 161static inline unsigned int dac_msb_4020_reg(unsigned int channel)
 162{
 163        return 0x72 + (4 * (channel & 0x1));
 164}
 165
 166enum read_only_registers {
 167        HW_STATUS_REG = 0x0,    /*  hardware status register, reading this apparently clears pending interrupts as well */
 168        PIPE1_READ_REG = 0x4,
 169        ADC_READ_PNTR_REG = 0x8,
 170        LOWER_XFER_REG = 0x10,
 171        ADC_WRITE_PNTR_REG = 0xc,
 172        PREPOST_REG = 0x14,
 173};
 174
 175enum read_write_registers {
 176        I8255_4020_REG = 0x48,  /*  8255 offset, for 4020 only */
 177        ADC_QUEUE_FIFO_REG = 0x100,     /*  external channel/gain queue, uses same bits as ADC_QUEUE_LOAD_REG */
 178        ADC_FIFO_REG = 0x200,   /* adc data fifo */
 179        DAC_FIFO_REG = 0x300,   /* dac data fifo, has weird interactions with external channel queue */
 180};
 181
 182/* priv(dev)->dio_counter_iobase registers */
 183enum dio_counter_registers {
 184        DIO_8255_OFFSET = 0x0,
 185        DO_REG = 0x20,
 186        DI_REG = 0x28,
 187        DIO_DIRECTION_60XX_REG = 0x40,
 188        DIO_DATA_60XX_REG = 0x48,
 189};
 190
 191/* bit definitions for write-only registers */
 192
 193enum intr_enable_contents {
 194        ADC_INTR_SRC_MASK = 0x3,        /*  bits that set adc interrupt source */
 195        ADC_INTR_QFULL_BITS = 0x0,      /*  interrupt fifo quater full */
 196        ADC_INTR_EOC_BITS = 0x1,        /*  interrupt end of conversion */
 197        ADC_INTR_EOSCAN_BITS = 0x2,     /*  interrupt end of scan */
 198        ADC_INTR_EOSEQ_BITS = 0x3,      /*  interrupt end of sequence (probably wont use this it's pretty fancy) */
 199        EN_ADC_INTR_SRC_BIT = 0x4,      /*  enable adc interrupt source */
 200        EN_ADC_DONE_INTR_BIT = 0x8,     /*  enable adc acquisition done interrupt */
 201        DAC_INTR_SRC_MASK = 0x30,
 202        DAC_INTR_QEMPTY_BITS = 0x0,
 203        DAC_INTR_HIGH_CHAN_BITS = 0x10,
 204        EN_DAC_INTR_SRC_BIT = 0x40,     /*  enable dac interrupt source */
 205        EN_DAC_DONE_INTR_BIT = 0x80,
 206        EN_ADC_ACTIVE_INTR_BIT = 0x200, /*  enable adc active interrupt */
 207        EN_ADC_STOP_INTR_BIT = 0x400,   /*  enable adc stop trigger interrupt */
 208        EN_DAC_ACTIVE_INTR_BIT = 0x800, /*  enable dac active interrupt */
 209        EN_DAC_UNDERRUN_BIT = 0x4000,   /*  enable dac underrun status bit */
 210        EN_ADC_OVERRUN_BIT = 0x8000,    /*  enable adc overrun status bit */
 211};
 212
 213enum hw_config_contents {
 214        MASTER_CLOCK_4020_MASK = 0x3,   /*  bits that specify master clock source for 4020 */
 215        INTERNAL_CLOCK_4020_BITS = 0x1, /*  use 40 MHz internal master clock for 4020 */
 216        BNC_CLOCK_4020_BITS = 0x2,      /*  use BNC input for master clock */
 217        EXT_CLOCK_4020_BITS = 0x3,      /*  use dio input for master clock */
 218        EXT_QUEUE_BIT = 0x200,  /*  use external channel/gain queue (more versatile than internal queue) */
 219        SLOW_DAC_BIT = 0x400,   /*  use 225 nanosec strobe when loading dac instead of 50 nanosec */
 220        HW_CONFIG_DUMMY_BITS = 0x2000,  /*  bit with unknown function yet given as default value in pci-das64 manual */
 221        DMA_CH_SELECT_BIT = 0x8000,     /*  bit selects channels 1/0 for analog input/output, otherwise 0/1 */
 222        FIFO_SIZE_REG = 0x4,    /*  allows adjustment of fifo sizes */
 223        DAC_FIFO_SIZE_MASK = 0xff00,    /*  bits that set dac fifo size */
 224        DAC_FIFO_BITS = 0xf800, /* 8k sample ao fifo */
 225};
 226#define DAC_FIFO_SIZE 0x2000
 227
 228enum daq_atrig_low_4020_contents {
 229        EXT_AGATE_BNC_BIT = 0x8000,     /*  use trig/ext clk bnc input for analog gate signal */
 230        EXT_STOP_TRIG_BNC_BIT = 0x4000, /*  use trig/ext clk bnc input for external stop trigger signal */
 231        EXT_START_TRIG_BNC_BIT = 0x2000,        /*  use trig/ext clk bnc input for external start trigger signal */
 232};
 233static inline uint16_t analog_trig_low_threshold_bits(uint16_t threshold)
 234{
 235        return threshold & 0xfff;
 236}
 237
 238enum adc_control0_contents {
 239        ADC_GATE_SRC_MASK = 0x3,        /*  bits that select gate */
 240        ADC_SOFT_GATE_BITS = 0x1,       /*  software gate */
 241        ADC_EXT_GATE_BITS = 0x2,        /*  external digital gate */
 242        ADC_ANALOG_GATE_BITS = 0x3,     /*  analog level gate */
 243        ADC_GATE_LEVEL_BIT = 0x4,       /*  level-sensitive gate (for digital) */
 244        ADC_GATE_POLARITY_BIT = 0x8,    /*  gate active low */
 245        ADC_START_TRIG_SOFT_BITS = 0x10,
 246        ADC_START_TRIG_EXT_BITS = 0x20,
 247        ADC_START_TRIG_ANALOG_BITS = 0x30,
 248        ADC_START_TRIG_MASK = 0x30,
 249        ADC_START_TRIG_FALLING_BIT = 0x40,      /*  trig 1 uses falling edge */
 250        ADC_EXT_CONV_FALLING_BIT = 0x800,       /*  external pacing uses falling edge */
 251        ADC_SAMPLE_COUNTER_EN_BIT = 0x1000,     /*  enable hardware scan counter */
 252        ADC_DMA_DISABLE_BIT = 0x4000,   /*  disables dma */
 253        ADC_ENABLE_BIT = 0x8000,        /*  master adc enable */
 254};
 255
 256enum adc_control1_contents {
 257        ADC_QUEUE_CONFIG_BIT = 0x1,     /*  should be set for boards with > 16 channels */
 258        CONVERT_POLARITY_BIT = 0x10,
 259        EOC_POLARITY_BIT = 0x20,
 260        ADC_SW_GATE_BIT = 0x40, /*  software gate of adc */
 261        ADC_DITHER_BIT = 0x200, /*  turn on extra noise for dithering */
 262        RETRIGGER_BIT = 0x800,
 263        ADC_LO_CHANNEL_4020_MASK = 0x300,
 264        ADC_HI_CHANNEL_4020_MASK = 0xc00,
 265        TWO_CHANNEL_4020_BITS = 0x1000, /*  two channel mode for 4020 */
 266        FOUR_CHANNEL_4020_BITS = 0x2000,        /*  four channel mode for 4020 */
 267        CHANNEL_MODE_4020_MASK = 0x3000,
 268        ADC_MODE_MASK = 0xf000,
 269};
 270static inline uint16_t adc_lo_chan_4020_bits(unsigned int channel)
 271{
 272        return (channel & 0x3) << 8;
 273};
 274
 275static inline uint16_t adc_hi_chan_4020_bits(unsigned int channel)
 276{
 277        return (channel & 0x3) << 10;
 278};
 279
 280static inline uint16_t adc_mode_bits(unsigned int mode)
 281{
 282        return (mode & 0xf) << 12;
 283};
 284
 285enum calibration_contents {
 286        SELECT_8800_BIT = 0x1,
 287        SELECT_8402_64XX_BIT = 0x2,
 288        SELECT_1590_60XX_BIT = 0x2,
 289        CAL_EN_64XX_BIT = 0x40, /*  calibration enable for 64xx series */
 290        SERIAL_DATA_IN_BIT = 0x80,
 291        SERIAL_CLOCK_BIT = 0x100,
 292        CAL_EN_60XX_BIT = 0x200,        /*  calibration enable for 60xx series */
 293        CAL_GAIN_BIT = 0x800,
 294};
 295/* calibration sources for 6025 are:
 296 *  0 : ground
 297 *  1 : 10V
 298 *  2 : 5V
 299 *  3 : 0.5V
 300 *  4 : 0.05V
 301 *  5 : ground
 302 *  6 : dac channel 0
 303 *  7 : dac channel 1
 304 */
 305static inline uint16_t adc_src_bits(unsigned int source)
 306{
 307        return (source & 0xf) << 3;
 308};
 309
 310static inline uint16_t adc_convert_chan_4020_bits(unsigned int channel)
 311{
 312        return (channel & 0x3) << 8;
 313};
 314
 315enum adc_queue_load_contents {
 316        UNIP_BIT = 0x800,       /*  unipolar/bipolar bit */
 317        ADC_SE_DIFF_BIT = 0x1000,       /*  single-ended/ differential bit */
 318        ADC_COMMON_BIT = 0x2000,        /*  non-referenced single-ended (common-mode input) */
 319        QUEUE_EOSEQ_BIT = 0x4000,       /*  queue end of sequence */
 320        QUEUE_EOSCAN_BIT = 0x8000,      /*  queue end of scan */
 321};
 322static inline uint16_t adc_chan_bits(unsigned int channel)
 323{
 324        return channel & 0x3f;
 325};
 326
 327enum dac_control0_contents {
 328        DAC_ENABLE_BIT = 0x8000,        /*  dac controller enable bit */
 329        DAC_CYCLIC_STOP_BIT = 0x4000,
 330        DAC_WAVEFORM_MODE_BIT = 0x100,
 331        DAC_EXT_UPDATE_FALLING_BIT = 0x80,
 332        DAC_EXT_UPDATE_ENABLE_BIT = 0x40,
 333        WAVEFORM_TRIG_MASK = 0x30,
 334        WAVEFORM_TRIG_DISABLED_BITS = 0x0,
 335        WAVEFORM_TRIG_SOFT_BITS = 0x10,
 336        WAVEFORM_TRIG_EXT_BITS = 0x20,
 337        WAVEFORM_TRIG_ADC1_BITS = 0x30,
 338        WAVEFORM_TRIG_FALLING_BIT = 0x8,
 339        WAVEFORM_GATE_LEVEL_BIT = 0x4,
 340        WAVEFORM_GATE_ENABLE_BIT = 0x2,
 341        WAVEFORM_GATE_SELECT_BIT = 0x1,
 342};
 343
 344enum dac_control1_contents {
 345        DAC_WRITE_POLARITY_BIT = 0x800, /* board-dependent setting */
 346        DAC1_EXT_REF_BIT = 0x200,
 347        DAC0_EXT_REF_BIT = 0x100,
 348        DAC_OUTPUT_ENABLE_BIT = 0x80,   /*  dac output enable bit */
 349        DAC_UPDATE_POLARITY_BIT = 0x40, /* board-dependent setting */
 350        DAC_SW_GATE_BIT = 0x20,
 351        DAC1_UNIPOLAR_BIT = 0x8,
 352        DAC0_UNIPOLAR_BIT = 0x2,
 353};
 354
 355/* bit definitions for read-only registers */
 356enum hw_status_contents {
 357        DAC_UNDERRUN_BIT = 0x1,
 358        ADC_OVERRUN_BIT = 0x2,
 359        DAC_ACTIVE_BIT = 0x4,
 360        ADC_ACTIVE_BIT = 0x8,
 361        DAC_INTR_PENDING_BIT = 0x10,
 362        ADC_INTR_PENDING_BIT = 0x20,
 363        DAC_DONE_BIT = 0x40,
 364        ADC_DONE_BIT = 0x80,
 365        EXT_INTR_PENDING_BIT = 0x100,
 366        ADC_STOP_BIT = 0x200,
 367};
 368static inline uint16_t pipe_full_bits(uint16_t hw_status_bits)
 369{
 370        return (hw_status_bits >> 10) & 0x3;
 371};
 372
 373static inline unsigned int dma_chain_flag_bits(uint16_t prepost_bits)
 374{
 375        return (prepost_bits >> 6) & 0x3;
 376}
 377
 378static inline unsigned int adc_upper_read_ptr_code(uint16_t prepost_bits)
 379{
 380        return (prepost_bits >> 12) & 0x3;
 381}
 382
 383static inline unsigned int adc_upper_write_ptr_code(uint16_t prepost_bits)
 384{
 385        return (prepost_bits >> 14) & 0x3;
 386}
 387
 388/* I2C addresses for 4020 */
 389enum i2c_addresses {
 390        RANGE_CAL_I2C_ADDR = 0x20,
 391        CALDAC0_I2C_ADDR = 0xc,
 392        CALDAC1_I2C_ADDR = 0xd,
 393};
 394
 395enum range_cal_i2c_contents {
 396        ADC_SRC_4020_MASK = 0x70,       /*  bits that set what source the adc converter measures */
 397        BNC_TRIG_THRESHOLD_0V_BIT = 0x80,       /*  make bnc trig/ext clock threshold 0V instead of 2.5V */
 398};
 399static inline uint8_t adc_src_4020_bits(unsigned int source)
 400{
 401        return (source << 4) & ADC_SRC_4020_MASK;
 402};
 403
 404static inline uint8_t attenuate_bit(unsigned int channel)
 405{
 406        /*  attenuate channel (+-5V input range) */
 407        return 1 << (channel & 0x3);
 408};
 409
 410/* analog input ranges for 64xx boards */
 411static const struct comedi_lrange ai_ranges_64xx = {
 412        8,
 413        {
 414         BIP_RANGE(10),
 415         BIP_RANGE(5),
 416         BIP_RANGE(2.5),
 417         BIP_RANGE(1.25),
 418         UNI_RANGE(10),
 419         UNI_RANGE(5),
 420         UNI_RANGE(2.5),
 421         UNI_RANGE(1.25)
 422         }
 423};
 424
 425/* analog input ranges for 60xx boards */
 426static const struct comedi_lrange ai_ranges_60xx = {
 427        4,
 428        {
 429         BIP_RANGE(10),
 430         BIP_RANGE(5),
 431         BIP_RANGE(0.5),
 432         BIP_RANGE(0.05),
 433         }
 434};
 435
 436/* analog input ranges for 6030, etc boards */
 437static const struct comedi_lrange ai_ranges_6030 = {
 438        14,
 439        {
 440         BIP_RANGE(10),
 441         BIP_RANGE(5),
 442         BIP_RANGE(2),
 443         BIP_RANGE(1),
 444         BIP_RANGE(0.5),
 445         BIP_RANGE(0.2),
 446         BIP_RANGE(0.1),
 447         UNI_RANGE(10),
 448         UNI_RANGE(5),
 449         UNI_RANGE(2),
 450         UNI_RANGE(1),
 451         UNI_RANGE(0.5),
 452         UNI_RANGE(0.2),
 453         UNI_RANGE(0.1),
 454         }
 455};
 456
 457/* analog input ranges for 6052, etc boards */
 458static const struct comedi_lrange ai_ranges_6052 = {
 459        15,
 460        {
 461         BIP_RANGE(10),
 462         BIP_RANGE(5),
 463         BIP_RANGE(2.5),
 464         BIP_RANGE(1),
 465         BIP_RANGE(0.5),
 466         BIP_RANGE(0.25),
 467         BIP_RANGE(0.1),
 468         BIP_RANGE(0.05),
 469         UNI_RANGE(10),
 470         UNI_RANGE(5),
 471         UNI_RANGE(2),
 472         UNI_RANGE(1),
 473         UNI_RANGE(0.5),
 474         UNI_RANGE(0.2),
 475         UNI_RANGE(0.1),
 476         }
 477};
 478
 479/* analog input ranges for 4020 board */
 480static const struct comedi_lrange ai_ranges_4020 = {
 481        2,
 482        {
 483         BIP_RANGE(5),
 484         BIP_RANGE(1),
 485         }
 486};
 487
 488/* analog output ranges */
 489static const struct comedi_lrange ao_ranges_64xx = {
 490        4,
 491        {
 492         BIP_RANGE(5),
 493         BIP_RANGE(10),
 494         UNI_RANGE(5),
 495         UNI_RANGE(10),
 496         }
 497};
 498
 499static const int ao_range_code_64xx[] = {
 500        0x0,
 501        0x1,
 502        0x2,
 503        0x3,
 504};
 505
 506static const struct comedi_lrange ao_ranges_60xx = {
 507        1,
 508        {
 509         BIP_RANGE(10),
 510         }
 511};
 512
 513static const int ao_range_code_60xx[] = {
 514        0x0,
 515};
 516
 517static const struct comedi_lrange ao_ranges_6030 = {
 518        2,
 519        {
 520         BIP_RANGE(10),
 521         UNI_RANGE(10),
 522         }
 523};
 524
 525static const int ao_range_code_6030[] = {
 526        0x0,
 527        0x2,
 528};
 529
 530static const struct comedi_lrange ao_ranges_4020 = {
 531        2,
 532        {
 533         BIP_RANGE(5),
 534         BIP_RANGE(10),
 535         }
 536};
 537
 538static const int ao_range_code_4020[] = {
 539        0x1,
 540        0x0,
 541};
 542
 543enum register_layout {
 544        LAYOUT_60XX,
 545        LAYOUT_64XX,
 546        LAYOUT_4020,
 547};
 548
 549struct hw_fifo_info {
 550        unsigned int num_segments;
 551        unsigned int max_segment_length;
 552        unsigned int sample_packing_ratio;
 553        uint16_t fifo_size_reg_mask;
 554};
 555
 556struct pcidas64_board {
 557        const char *name;
 558        int device_id;          /*  pci device id */
 559        int ai_se_chans;        /*  number of ai inputs in single-ended mode */
 560        int ai_bits;            /*  analog input resolution */
 561        int ai_speed;           /*  fastest conversion period in ns */
 562        const struct comedi_lrange *ai_range_table;
 563        int ao_nchan;           /*  number of analog out channels */
 564        int ao_bits;            /*  analog output resolution */
 565        int ao_scan_speed;      /*  analog output speed (for a scan, not conversion) */
 566        const struct comedi_lrange *ao_range_table;
 567        const int *ao_range_code;
 568        const struct hw_fifo_info *const ai_fifo;
 569        enum register_layout layout;    /*  different board families have slightly different registers */
 570        unsigned has_8255:1;
 571};
 572
 573static const struct hw_fifo_info ai_fifo_4020 = {
 574        .num_segments = 2,
 575        .max_segment_length = 0x8000,
 576        .sample_packing_ratio = 2,
 577        .fifo_size_reg_mask = 0x7f,
 578};
 579
 580static const struct hw_fifo_info ai_fifo_64xx = {
 581        .num_segments = 4,
 582        .max_segment_length = 0x800,
 583        .sample_packing_ratio = 1,
 584        .fifo_size_reg_mask = 0x3f,
 585};
 586
 587static const struct hw_fifo_info ai_fifo_60xx = {
 588        .num_segments = 4,
 589        .max_segment_length = 0x800,
 590        .sample_packing_ratio = 1,
 591        .fifo_size_reg_mask = 0x7f,
 592};
 593
 594/* maximum number of dma transfers we will chain together into a ring
 595 * (and the maximum number of dma buffers we maintain) */
 596#define MAX_AI_DMA_RING_COUNT (0x80000 / DMA_BUFFER_SIZE)
 597#define MIN_AI_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
 598#define AO_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
 599static inline unsigned int ai_dma_ring_count(struct pcidas64_board *board)
 600{
 601        if (board->layout == LAYOUT_4020)
 602                return MAX_AI_DMA_RING_COUNT;
 603        else
 604                return MIN_AI_DMA_RING_COUNT;
 605}
 606
 607static const int bytes_in_sample = 2;
 608
 609static const struct pcidas64_board pcidas64_boards[] = {
 610        {
 611         .name = "pci-das6402/16",
 612         .device_id = 0x1d,
 613         .ai_se_chans = 64,
 614         .ai_bits = 16,
 615         .ai_speed = 5000,
 616         .ao_nchan = 2,
 617         .ao_bits = 16,
 618         .ao_scan_speed = 10000,
 619         .layout = LAYOUT_64XX,
 620         .ai_range_table = &ai_ranges_64xx,
 621         .ao_range_table = &ao_ranges_64xx,
 622         .ao_range_code = ao_range_code_64xx,
 623         .ai_fifo = &ai_fifo_64xx,
 624         .has_8255 = 1,
 625         },
 626        {
 627         .name = "pci-das6402/12",      /*  XXX check */
 628         .device_id = 0x1e,
 629         .ai_se_chans = 64,
 630         .ai_bits = 12,
 631         .ai_speed = 5000,
 632         .ao_nchan = 2,
 633         .ao_bits = 12,
 634         .ao_scan_speed = 10000,
 635         .layout = LAYOUT_64XX,
 636         .ai_range_table = &ai_ranges_64xx,
 637         .ao_range_table = &ao_ranges_64xx,
 638         .ao_range_code = ao_range_code_64xx,
 639         .ai_fifo = &ai_fifo_64xx,
 640         .has_8255 = 1,
 641         },
 642        {
 643         .name = "pci-das64/m1/16",
 644         .device_id = 0x35,
 645         .ai_se_chans = 64,
 646         .ai_bits = 16,
 647         .ai_speed = 1000,
 648         .ao_nchan = 2,
 649         .ao_bits = 16,
 650         .ao_scan_speed = 10000,
 651         .layout = LAYOUT_64XX,
 652         .ai_range_table = &ai_ranges_64xx,
 653         .ao_range_table = &ao_ranges_64xx,
 654         .ao_range_code = ao_range_code_64xx,
 655         .ai_fifo = &ai_fifo_64xx,
 656         .has_8255 = 1,
 657         },
 658        {
 659         .name = "pci-das64/m2/16",
 660         .device_id = 0x36,
 661         .ai_se_chans = 64,
 662         .ai_bits = 16,
 663         .ai_speed = 500,
 664         .ao_nchan = 2,
 665         .ao_bits = 16,
 666         .ao_scan_speed = 10000,
 667         .layout = LAYOUT_64XX,
 668         .ai_range_table = &ai_ranges_64xx,
 669         .ao_range_table = &ao_ranges_64xx,
 670         .ao_range_code = ao_range_code_64xx,
 671         .ai_fifo = &ai_fifo_64xx,
 672         .has_8255 = 1,
 673         },
 674        {
 675         .name = "pci-das64/m3/16",
 676         .device_id = 0x37,
 677         .ai_se_chans = 64,
 678         .ai_bits = 16,
 679         .ai_speed = 333,
 680         .ao_nchan = 2,
 681         .ao_bits = 16,
 682         .ao_scan_speed = 10000,
 683         .layout = LAYOUT_64XX,
 684         .ai_range_table = &ai_ranges_64xx,
 685         .ao_range_table = &ao_ranges_64xx,
 686         .ao_range_code = ao_range_code_64xx,
 687         .ai_fifo = &ai_fifo_64xx,
 688         .has_8255 = 1,
 689         },
 690        {
 691         .name = "pci-das6013",
 692         .device_id = 0x78,
 693         .ai_se_chans = 16,
 694         .ai_bits = 16,
 695         .ai_speed = 5000,
 696         .ao_nchan = 0,
 697         .ao_bits = 16,
 698         .layout = LAYOUT_60XX,
 699         .ai_range_table = &ai_ranges_60xx,
 700         .ao_range_table = &ao_ranges_60xx,
 701         .ao_range_code = ao_range_code_60xx,
 702         .ai_fifo = &ai_fifo_60xx,
 703         .has_8255 = 0,
 704         },
 705        {
 706         .name = "pci-das6014",
 707         .device_id = 0x79,
 708         .ai_se_chans = 16,
 709         .ai_bits = 16,
 710         .ai_speed = 5000,
 711         .ao_nchan = 2,
 712         .ao_bits = 16,
 713         .ao_scan_speed = 100000,
 714         .layout = LAYOUT_60XX,
 715         .ai_range_table = &ai_ranges_60xx,
 716         .ao_range_table = &ao_ranges_60xx,
 717         .ao_range_code = ao_range_code_60xx,
 718         .ai_fifo = &ai_fifo_60xx,
 719         .has_8255 = 0,
 720         },
 721        {
 722         .name = "pci-das6023",
 723         .device_id = 0x5d,
 724         .ai_se_chans = 16,
 725         .ai_bits = 12,
 726         .ai_speed = 5000,
 727         .ao_nchan = 0,
 728         .ao_scan_speed = 100000,
 729         .layout = LAYOUT_60XX,
 730         .ai_range_table = &ai_ranges_60xx,
 731         .ao_range_table = &ao_ranges_60xx,
 732         .ao_range_code = ao_range_code_60xx,
 733         .ai_fifo = &ai_fifo_60xx,
 734         .has_8255 = 1,
 735         },
 736        {
 737         .name = "pci-das6025",
 738         .device_id = 0x5e,
 739         .ai_se_chans = 16,
 740         .ai_bits = 12,
 741         .ai_speed = 5000,
 742         .ao_nchan = 2,
 743         .ao_bits = 12,
 744         .ao_scan_speed = 100000,
 745         .layout = LAYOUT_60XX,
 746         .ai_range_table = &ai_ranges_60xx,
 747         .ao_range_table = &ao_ranges_60xx,
 748         .ao_range_code = ao_range_code_60xx,
 749         .ai_fifo = &ai_fifo_60xx,
 750         .has_8255 = 1,
 751         },
 752        {
 753         .name = "pci-das6030",
 754         .device_id = 0x5f,
 755         .ai_se_chans = 16,
 756         .ai_bits = 16,
 757         .ai_speed = 10000,
 758         .ao_nchan = 2,
 759         .ao_bits = 16,
 760         .ao_scan_speed = 10000,
 761         .layout = LAYOUT_60XX,
 762         .ai_range_table = &ai_ranges_6030,
 763         .ao_range_table = &ao_ranges_6030,
 764         .ao_range_code = ao_range_code_6030,
 765         .ai_fifo = &ai_fifo_60xx,
 766         .has_8255 = 0,
 767         },
 768        {
 769         .name = "pci-das6031",
 770         .device_id = 0x60,
 771         .ai_se_chans = 64,
 772         .ai_bits = 16,
 773         .ai_speed = 10000,
 774         .ao_nchan = 2,
 775         .ao_bits = 16,
 776         .ao_scan_speed = 10000,
 777         .layout = LAYOUT_60XX,
 778         .ai_range_table = &ai_ranges_6030,
 779         .ao_range_table = &ao_ranges_6030,
 780         .ao_range_code = ao_range_code_6030,
 781         .ai_fifo = &ai_fifo_60xx,
 782         .has_8255 = 0,
 783         },
 784        {
 785         .name = "pci-das6032",
 786         .device_id = 0x61,
 787         .ai_se_chans = 16,
 788         .ai_bits = 16,
 789         .ai_speed = 10000,
 790         .ao_nchan = 0,
 791         .layout = LAYOUT_60XX,
 792         .ai_range_table = &ai_ranges_6030,
 793         .ai_fifo = &ai_fifo_60xx,
 794         .has_8255 = 0,
 795         },
 796        {
 797         .name = "pci-das6033",
 798         .device_id = 0x62,
 799         .ai_se_chans = 64,
 800         .ai_bits = 16,
 801         .ai_speed = 10000,
 802         .ao_nchan = 0,
 803         .layout = LAYOUT_60XX,
 804         .ai_range_table = &ai_ranges_6030,
 805         .ai_fifo = &ai_fifo_60xx,
 806         .has_8255 = 0,
 807         },
 808        {
 809         .name = "pci-das6034",
 810         .device_id = 0x63,
 811         .ai_se_chans = 16,
 812         .ai_bits = 16,
 813         .ai_speed = 5000,
 814         .ao_nchan = 0,
 815         .ao_scan_speed = 0,
 816         .layout = LAYOUT_60XX,
 817         .ai_range_table = &ai_ranges_60xx,
 818         .ai_fifo = &ai_fifo_60xx,
 819         .has_8255 = 0,
 820         },
 821        {
 822         .name = "pci-das6035",
 823         .device_id = 0x64,
 824         .ai_se_chans = 16,
 825         .ai_bits = 16,
 826         .ai_speed = 5000,
 827         .ao_nchan = 2,
 828         .ao_bits = 12,
 829         .ao_scan_speed = 100000,
 830         .layout = LAYOUT_60XX,
 831         .ai_range_table = &ai_ranges_60xx,
 832         .ao_range_table = &ao_ranges_60xx,
 833         .ao_range_code = ao_range_code_60xx,
 834         .ai_fifo = &ai_fifo_60xx,
 835         .has_8255 = 0,
 836         },
 837        {
 838         .name = "pci-das6036",
 839         .device_id = 0x6f,
 840         .ai_se_chans = 16,
 841         .ai_bits = 16,
 842         .ai_speed = 5000,
 843         .ao_nchan = 2,
 844         .ao_bits = 16,
 845         .ao_scan_speed = 100000,
 846         .layout = LAYOUT_60XX,
 847         .ai_range_table = &ai_ranges_60xx,
 848         .ao_range_table = &ao_ranges_60xx,
 849         .ao_range_code = ao_range_code_60xx,
 850         .ai_fifo = &ai_fifo_60xx,
 851         .has_8255 = 0,
 852         },
 853        {
 854         .name = "pci-das6040",
 855         .device_id = 0x65,
 856         .ai_se_chans = 16,
 857         .ai_bits = 12,
 858         .ai_speed = 2000,
 859         .ao_nchan = 2,
 860         .ao_bits = 12,
 861         .ao_scan_speed = 1000,
 862         .layout = LAYOUT_60XX,
 863         .ai_range_table = &ai_ranges_6052,
 864         .ao_range_table = &ao_ranges_6030,
 865         .ao_range_code = ao_range_code_6030,
 866         .ai_fifo = &ai_fifo_60xx,
 867         .has_8255 = 0,
 868         },
 869        {
 870         .name = "pci-das6052",
 871         .device_id = 0x66,
 872         .ai_se_chans = 16,
 873         .ai_bits = 16,
 874         .ai_speed = 3333,
 875         .ao_nchan = 2,
 876         .ao_bits = 16,
 877         .ao_scan_speed = 3333,
 878         .layout = LAYOUT_60XX,
 879         .ai_range_table = &ai_ranges_6052,
 880         .ao_range_table = &ao_ranges_6030,
 881         .ao_range_code = ao_range_code_6030,
 882         .ai_fifo = &ai_fifo_60xx,
 883         .has_8255 = 0,
 884         },
 885        {
 886         .name = "pci-das6070",
 887         .device_id = 0x67,
 888         .ai_se_chans = 16,
 889         .ai_bits = 12,
 890         .ai_speed = 800,
 891         .ao_nchan = 2,
 892         .ao_bits = 12,
 893         .ao_scan_speed = 1000,
 894         .layout = LAYOUT_60XX,
 895         .ai_range_table = &ai_ranges_6052,
 896         .ao_range_table = &ao_ranges_6030,
 897         .ao_range_code = ao_range_code_6030,
 898         .ai_fifo = &ai_fifo_60xx,
 899         .has_8255 = 0,
 900         },
 901        {
 902         .name = "pci-das6071",
 903         .device_id = 0x68,
 904         .ai_se_chans = 64,
 905         .ai_bits = 12,
 906         .ai_speed = 800,
 907         .ao_nchan = 2,
 908         .ao_bits = 12,
 909         .ao_scan_speed = 1000,
 910         .layout = LAYOUT_60XX,
 911         .ai_range_table = &ai_ranges_6052,
 912         .ao_range_table = &ao_ranges_6030,
 913         .ao_range_code = ao_range_code_6030,
 914         .ai_fifo = &ai_fifo_60xx,
 915         .has_8255 = 0,
 916         },
 917        {
 918         .name = "pci-das4020/12",
 919         .device_id = 0x52,
 920         .ai_se_chans = 4,
 921         .ai_bits = 12,
 922         .ai_speed = 50,
 923         .ao_bits = 12,
 924         .ao_nchan = 2,
 925         .ao_scan_speed = 0,    /*  no hardware pacing on ao */
 926         .layout = LAYOUT_4020,
 927         .ai_range_table = &ai_ranges_4020,
 928         .ao_range_table = &ao_ranges_4020,
 929         .ao_range_code = ao_range_code_4020,
 930         .ai_fifo = &ai_fifo_4020,
 931         .has_8255 = 1,
 932         },
 933#if 0
 934        {
 935         .name = "pci-das6402/16/jr",
 936         .device_id = 0         /*  XXX, */
 937         .ai_se_chans = 64,
 938         .ai_bits = 16,
 939         .ai_speed = 5000,
 940         .ao_nchan = 0,
 941         .ao_scan_speed = 10000,
 942         .layout = LAYOUT_64XX,
 943         .ai_range_table = &ai_ranges_64xx,
 944         .ai_fifo = ai_fifo_64xx,
 945         .has_8255 = 1,
 946         },
 947        {
 948         .name = "pci-das64/m1/16/jr",
 949         .device_id = 0         /*  XXX, */
 950         .ai_se_chans = 64,
 951         .ai_bits = 16,
 952         .ai_speed = 1000,
 953         .ao_nchan = 0,
 954         .ao_scan_speed = 10000,
 955         .layout = LAYOUT_64XX,
 956         .ai_range_table = &ai_ranges_64xx,
 957         .ai_fifo = ai_fifo_64xx,
 958         .has_8255 = 1,
 959         },
 960        {
 961         .name = "pci-das64/m2/16/jr",
 962         .device_id = 0         /*  XXX, */
 963         .ai_se_chans = 64,
 964         .ai_bits = 16,
 965         .ai_speed = 500,
 966         .ao_nchan = 0,
 967         .ao_scan_speed = 10000,
 968         .layout = LAYOUT_64XX,
 969         .ai_range_table = &ai_ranges_64xx,
 970         .ai_fifo = ai_fifo_64xx,
 971         .has_8255 = 1,
 972         },
 973        {
 974         .name = "pci-das64/m3/16/jr",
 975         .device_id = 0         /*  XXX, */
 976         .ai_se_chans = 64,
 977         .ai_bits = 16,
 978         .ai_speed = 333,
 979         .ao_nchan = 0,
 980         .ao_scan_speed = 10000,
 981         .layout = LAYOUT_64XX,
 982         .ai_range_table = &ai_ranges_64xx,
 983         .ai_fifo = ai_fifo_64xx,
 984         .has_8255 = 1,
 985         },
 986        {
 987         .name = "pci-das64/m1/14",
 988         .device_id = 0,        /*  XXX */
 989         .ai_se_chans = 64,
 990         .ai_bits = 14,
 991         .ai_speed = 1000,
 992         .ao_nchan = 2,
 993         .ao_scan_speed = 10000,
 994         .layout = LAYOUT_64XX,
 995         .ai_range_table = &ai_ranges_64xx,
 996         .ai_fifo = ai_fifo_64xx,
 997         .has_8255 = 1,
 998         },
 999        {
1000         .name = "pci-das64/m2/14",
1001         .device_id = 0,        /*  XXX */
1002         .ai_se_chans = 64,
1003         .ai_bits = 14,
1004         .ai_speed = 500,
1005         .ao_nchan = 2,
1006         .ao_scan_speed = 10000,
1007         .layout = LAYOUT_64XX,
1008         .ai_range_table = &ai_ranges_64xx,
1009         .ai_fifo = ai_fifo_64xx,
1010         .has_8255 = 1,
1011         },
1012        {
1013         .name = "pci-das64/m3/14",
1014         .device_id = 0,        /*  XXX */
1015         .ai_se_chans = 64,
1016         .ai_bits = 14,
1017         .ai_speed = 333,
1018         .ao_nchan = 2,
1019         .ao_scan_speed = 10000,
1020         .layout = LAYOUT_64XX,
1021         .ai_range_table = &ai_ranges_64xx,
1022         .ai_fifo = ai_fifo_64xx,
1023         .has_8255 = 1,
1024         },
1025#endif
1026};
1027
1028static inline struct pcidas64_board *board(const struct comedi_device *dev)
1029{
1030        return (struct pcidas64_board *)dev->board_ptr;
1031}
1032
1033static 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
1043struct ext_clock_info {
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. */
1049struct pcidas64_private {
1050        /*  base addresses (physical) */
1051        resource_size_t plx9080_phys_iobase;
1052        resource_size_t main_phys_iobase;
1053        resource_size_t dio_counter_phys_iobase;
1054        /*  base addresses (ioremapped) */
1055        void __iomem *plx9080_iobase;
1056        void __iomem *main_iobase;
1057        void __iomem *dio_counter_iobase;
1058        /*  local address (used by dma controller) */
1059        uint32_t local0_iobase;
1060        uint32_t local1_iobase;
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 */
1069        struct plx_dma_desc *ao_dma_desc;
1070        dma_addr_t ao_dma_desc_bus_addr;
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 */
1079        volatile uint16_t dac_control1_bits;
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;
1089        unsigned int ai_fifo_segment_length;
1090        struct ext_clock_info ext_clock;
1091        short ao_bounce_buffer[DAC_FIFO_SIZE];
1092};
1093
1094/* inline function that makes it easier to
1095 * access the private structure.
1096 */
1097static inline struct pcidas64_private *priv(struct comedi_device *dev)
1098{
1099        return dev->private;
1100}
1101
1102static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1103                    struct comedi_insn *insn, unsigned int *data);
1104static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
1105                          struct comedi_insn *insn, unsigned int *data);
1106static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
1107                    struct comedi_insn *insn, unsigned int *data);
1108static int ao_readback_insn(struct comedi_device *dev,
1109                            struct comedi_subdevice *s,
1110                            struct comedi_insn *insn, unsigned int *data);
1111static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
1112static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
1113                      struct comedi_cmd *cmd);
1114static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
1115static int ao_inttrig(struct comedi_device *dev,
1116                      struct comedi_subdevice *subdev, unsigned int trig_num);
1117static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
1118                      struct comedi_cmd *cmd);
1119static irqreturn_t handle_interrupt(int irq, void *d);
1120static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
1121static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
1122static int dio_callback(int dir, int port, int data, unsigned long arg);
1123static int dio_callback_4020(int dir, int port, int data, unsigned long arg);
1124static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
1125                    struct comedi_insn *insn, unsigned int *data);
1126static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
1127                    struct comedi_insn *insn, unsigned int *data);
1128static int dio_60xx_config_insn(struct comedi_device *dev,
1129                                struct comedi_subdevice *s,
1130                                struct comedi_insn *insn, unsigned int *data);
1131static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
1132                          struct comedi_insn *insn, unsigned int *data);
1133static int calib_read_insn(struct comedi_device *dev,
1134                           struct comedi_subdevice *s, struct comedi_insn *insn,
1135                           unsigned int *data);
1136static int calib_write_insn(struct comedi_device *dev,
1137                            struct comedi_subdevice *s,
1138                            struct comedi_insn *insn, unsigned int *data);
1139static int ad8402_read_insn(struct comedi_device *dev,
1140                            struct comedi_subdevice *s,
1141                            struct comedi_insn *insn, unsigned int *data);
1142static void ad8402_write(struct comedi_device *dev, unsigned int channel,
1143                         unsigned int value);
1144static int ad8402_write_insn(struct comedi_device *dev,
1145                             struct comedi_subdevice *s,
1146                             struct comedi_insn *insn, unsigned int *data);
1147static int eeprom_read_insn(struct comedi_device *dev,
1148                            struct comedi_subdevice *s,
1149                            struct comedi_insn *insn, unsigned int *data);
1150static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd);
1151static unsigned int get_divisor(unsigned int ns, unsigned int flags);
1152static void i2c_write(struct comedi_device *dev, unsigned int address,
1153                      const uint8_t *data, unsigned int length);
1154static void caldac_write(struct comedi_device *dev, unsigned int channel,
1155                         unsigned int value);
1156static 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); */
1159static int caldac_i2c_write(struct comedi_device *dev,
1160                            unsigned int caldac_channel, unsigned int value);
1161static void abort_dma(struct comedi_device *dev, unsigned int channel);
1162static void disable_plx_interrupts(struct comedi_device *dev);
1163static int set_ai_fifo_size(struct comedi_device *dev,
1164                            unsigned int num_samples);
1165static unsigned int ai_fifo_size(struct comedi_device *dev);
1166static int set_ai_fifo_segment_length(struct comedi_device *dev,
1167                                      unsigned int num_entries);
1168static void disable_ai_pacing(struct comedi_device *dev);
1169static void disable_ai_interrupts(struct comedi_device *dev);
1170static void enable_ai_interrupts(struct comedi_device *dev,
1171                                 const struct comedi_cmd *cmd);
1172static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags);
1173static void load_ao_dma(struct comedi_device *dev,
1174                        const struct comedi_cmd *cmd);
1175
1176static 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
1220static 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
1229static 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
1244static 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 */
1250static 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 */
1319        bits |= PLX_DMA_LOCAL_BURST_EN_BIT;
1320        /*  4020 uses 32 bit dma */
1321        if (board(dev)->layout == LAYOUT_4020) {
1322                bits |= PLX_LOCAL_BUS_32_WIDE_BITS;
1323        } else {                /*  localspace0 bus is 16 bits wide */
1324                bits |= PLX_LOCAL_BUS_16_WIDE_BITS;
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 |=
1332            ICS_AERR | ICS_PERR | ICS_PIE | ICS_PLIE | ICS_PAIE | ICS_LIE |
1333            ICS_DMA0_E | ICS_DMA1_E;
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 */
1340static 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;
1355        s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DITHER | SDF_CMD_READ;
1356        if (board(dev)->layout == LAYOUT_60XX)
1357                s->subdev_flags |= SDF_COMMON | SDF_DIFF;
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 =
1386                    SDF_READABLE | SDF_WRITABLE | SDF_GROUND | SDF_CMD_WRITE;
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;
1407                s->subdev_flags = SDF_READABLE;
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;
1419                s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
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;
1448                s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
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;
1460        s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
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;
1475                s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
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;
1489                s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
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
1503static 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
1510static 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
1526        bits = SLOW_DAC_BIT | DMA_CH_SELECT_BIT;
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 | */
1545            EN_DAC_DONE_INTR_BIT | EN_DAC_UNDERRUN_BIT;
1546        writew(priv(dev)->intr_enable_bits,
1547               priv(dev)->main_iobase + INTR_ENABLE_REG);
1548
1549        disable_ai_pacing(dev);
1550};
1551
1552static 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] =
1560                    pci_alloc_consistent(pcidev, DMA_BUFFER_SIZE,
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,
1570                                                 DMA_BUFFER_SIZE,
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])) |
1621                                PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT |
1622                                PLX_XFER_LOCAL_TO_PCI);
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])) |
1637                                        PLX_DESC_IN_PCI_BIT |
1638                                        PLX_INTR_TERM_COUNT);
1639                }
1640        }
1641        return 0;
1642}
1643
1644static 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
1652static 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 */
1686static 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 =
1716            pci_resource_start(pcidev, PLX9080_BADDRINDEX);
1717        priv(dev)->main_phys_iobase = dev->iobase;
1718        priv(dev)->dio_counter_phys_iobase =
1719            pci_resource_start(pcidev, DIO_COUNTER_BADDRINDEX);
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,
1724                                                             PLX9080_BADDRINDEX));
1725        priv(dev)->main_iobase =
1726            ioremap(priv(dev)->main_phys_iobase,
1727                    pci_resource_len(pcidev, MAIN_BADDRINDEX));
1728        priv(dev)->dio_counter_iobase =
1729            ioremap(priv(dev)->dio_counter_phys_iobase,
1730                    pci_resource_len(pcidev, DIO_COUNTER_BADDRINDEX));
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 */
1775        if (request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED,
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
1792static 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,
1813                                                            DMA_BUFFER_SIZE,
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,
1823                                                            DMA_BUFFER_SIZE,
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)
1843                                                    * AO_DMA_RING_COUNT,
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
1859static 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 +
1969                                          ADC_WRITE_PNTR_REG))
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
1995static 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
2017static 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
2043static 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 */
2070static 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
2085static 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) {
2091        case INSN_CONFIG_ALT_SOURCE:
2092                return ai_config_calibration_source(dev, data);
2093                break;
2094        case INSN_CONFIG_BLOCK_SIZE:
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
2107static 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,
2136                                        TRIG_COUNT | TRIG_EXT | TRIG_NONE);
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
2268static 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
2279static 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
2297static 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
2310static 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 */
2323        writew(ADC_DMA_DISABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT,
2324               priv(dev)->main_iobase + ADC_CONTROL0_REG);
2325}
2326
2327static 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 &=
2333            ~EN_ADC_INTR_SRC_BIT & ~EN_ADC_DONE_INTR_BIT &
2334            ~EN_ADC_ACTIVE_INTR_BIT & ~EN_ADC_STOP_INTR_BIT &
2335            ~EN_ADC_OVERRUN_BIT & ~ADC_INTR_SRC_MASK;
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
2343static void enable_ai_interrupts(struct comedi_device *dev,
2344                                 const struct comedi_cmd *cmd)
2345{
2346        uint32_t bits;
2347        unsigned long flags;
2348
2349        bits = EN_ADC_OVERRUN_BIT | EN_ADC_DONE_INTR_BIT |
2350            EN_ADC_ACTIVE_INTR_BIT | EN_ADC_STOP_INTR_BIT;
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)
2355                        bits |= ADC_INTR_EOSCAN_BITS | EN_ADC_INTR_SRC_BIT;
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
2365static 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
2372static 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
2393static 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
2415static 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
2434static 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
2446static 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)
2454                writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2455                       PLX_CLEAR_DMA_INTR_BIT,
2456                       priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG);
2457        else
2458                writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2459                       PLX_CLEAR_DMA_INTR_BIT,
2460                       priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
2461        spin_unlock_irqrestore(&dev->spinlock, flags);
2462}
2463
2464static 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
2495static 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
2511static 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 |
2576                                            QUEUE_EOSEQ_BIT;
2577                                writew(bits,
2578                                       priv(dev)->main_iobase +
2579                                       ADC_QUEUE_FIFO_REG);
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
2619static 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
2647static 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 |
2718                                          PLX_DESC_IN_PCI_BIT |
2719                                          PLX_INTR_TERM_COUNT |
2720                                          PLX_XFER_LOCAL_TO_PCI);
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 */
2738        bits = ADC_ENABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT;
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)
2745                        bits |= ADC_START_TRIG_FALLING_BIT;
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 */
2767static 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 */
2835static 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 */
2868static 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
2876static 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                }
2905                cfc_write_array_to_buffer(dev->read_subdev,
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
2922static 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
2977static 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
2988static 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
3007static 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
3021static 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
3033static 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
3046static 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
3070                        writeb(PLX_CLEAR_DMA_INTR_BIT,
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 +
3090                                  PLX_DMA0_DESCRIPTOR_REG));
3091                DEBUG_PRINT("plx dma0 address reg 0x%x\n",
3092                            readl(priv(dev)->plx9080_iobase +
3093                                  PLX_DMA0_PCI_ADDRESS_REG));
3094        }
3095        cfc_handle_events(dev, s);
3096}
3097
3098static 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
3134static 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
3146static 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
3166static 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
3196static 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
3205static 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 |
3209            WAVEFORM_GATE_ENABLE_BIT | WAVEFORM_GATE_SELECT_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)
3221                        bits |= DAC_EXT_UPDATE_FALLING_BIT;
3222        }
3223        writew(bits, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3224}
3225
3226static 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
3244static 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
3260static 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
3279static 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
3325static 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] +
3341                    DMA_BUFFER_SIZE)
3342                        return;
3343                num_bytes = load_ao_dma_buffer(dev, cmd);
3344        } while (num_bytes >= DMA_BUFFER_SIZE);
3345}
3346
3347static 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
3382static 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
3393static 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 |
3410                                  PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT);
3411
3412        set_dac_control1_reg(dev, cmd);
3413        s->async->inttrig = ao_inttrig;
3414
3415        return 0;
3416}
3417
3418static 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
3441static 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
3534static 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
3541static 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
3553static 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
3564static 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
3577static 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
3593static 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;
3605        case INSN_CONFIG_DIO_OUTPUT:
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
3621static 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
3636static 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
3654static 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
3670static 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
3681static 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 */
3712static 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
3730static 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
3741static 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
3803static 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 */
3816static 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. */
3865static 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
3884static 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) */
3890static 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 */
3912static 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
3919static 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
3970static 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 */
4002static 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 */
4063static const int i2c_high_udelay = 1000;
4064static const int i2c_low_udelay = 10;
4065
4066/* set i2c data line high or low */
4067static 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 +
4071                                         PLX_CONTROL_REG;
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 */
4087static 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 +
4091                                         PLX_CONTROL_REG;
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
4106static 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 */
4124static 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 */
4134static 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 */
4142static 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
4150static 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
4187static struct comedi_driver cb_pcidas64_driver = {
4188        .driver_name    = "cb_pcidas64",
4189        .module         = THIS_MODULE,
4190        .attach         = attach,
4191        .detach         = detach,
4192};
4193
4194static 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
4200static void __devexit cb_pcidas64_pci_remove(struct pci_dev *dev)
4201{
4202        comedi_pci_auto_unconfig(dev);
4203}
4204
4205static DEFINE_PCI_DEVICE_TABLE(cb_pcidas64_pci_table) = {
4206        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x001d) },
4207        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x001e) },
4208        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0035) },
4209        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0036) },
4210        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0037) },
4211        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0052) },
4212        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x005d) },
4213        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x005e) },
4214        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x005f) },
4215        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0061) },
4216        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0062) },
4217        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0063) },
4218        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0064) },
4219        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0066) },
4220        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0067) },
4221        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0068) },
4222        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x006f) },
4223        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0078) },
4224        { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0079) },
4225        { 0 }
4226};
4227MODULE_DEVICE_TABLE(pci, cb_pcidas64_pci_table);
4228
4229static 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};
4235module_comedi_pci_driver(cb_pcidas64_driver, cb_pcidas64_pci_driver);
4236
4237MODULE_AUTHOR("Comedi http://www.comedi.org");
4238MODULE_DESCRIPTION("Comedi low-level driver");
4239MODULE_LICENSE("GPL");
4240