linux/drivers/staging/comedi/drivers/ni_pcimio.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Comedi driver for NI PCI-MIO E series cards
   4 *
   5 * COMEDI - Linux Control and Measurement Device Interface
   6 * Copyright (C) 1997-8 David A. Schleef <ds@schleef.org>
   7 */
   8
   9/*
  10 * Driver: ni_pcimio
  11 * Description: National Instruments PCI-MIO-E series and M series (all boards)
  12 * Author: ds, John Hallen, Frank Mori Hess, Rolf Mueller, Herbert Peremans,
  13 *   Herman Bruyninckx, Terry Barnaby
  14 * Status: works
  15 * Devices: [National Instruments] PCI-MIO-16XE-50 (ni_pcimio),
  16 *   PCI-MIO-16XE-10, PXI-6030E, PCI-MIO-16E-1, PCI-MIO-16E-4, PCI-6014,
  17 *   PCI-6040E, PXI-6040E, PCI-6030E, PCI-6031E, PCI-6032E, PCI-6033E,
  18 *   PCI-6071E, PCI-6023E, PCI-6024E, PCI-6025E, PXI-6025E, PCI-6034E,
  19 *   PCI-6035E, PCI-6052E, PCI-6110, PCI-6111, PCI-6220, PXI-6220,
  20 *   PCI-6221, PXI-6221, PCI-6224, PXI-6224, PCI-6225, PXI-6225,
  21 *   PCI-6229, PXI-6229, PCI-6250, PXI-6250, PCI-6251, PXI-6251,
  22 *   PCIe-6251, PXIe-6251, PCI-6254, PXI-6254, PCI-6259, PXI-6259,
  23 *   PCIe-6259, PXIe-6259, PCI-6280, PXI-6280, PCI-6281, PXI-6281,
  24 *   PCI-6284, PXI-6284, PCI-6289, PXI-6289, PCI-6711, PXI-6711,
  25 *   PCI-6713, PXI-6713, PXI-6071E, PCI-6070E, PXI-6070E,
  26 *   PXI-6052E, PCI-6036E, PCI-6731, PCI-6733, PXI-6733,
  27 *   PCI-6143, PXI-6143
  28 * Updated: Mon, 16 Jan 2017 12:56:04 +0000
  29 *
  30 * These boards are almost identical to the AT-MIO E series, except that
  31 * they use the PCI bus instead of ISA (i.e., AT). See the notes for the
  32 * ni_atmio.o driver for additional information about these boards.
  33 *
  34 * Autocalibration is supported on many of the devices, using the
  35 * comedi_calibrate (or comedi_soft_calibrate for m-series) utility.
  36 * M-Series boards do analog input and analog output calibration entirely
  37 * in software. The software calibration corrects the analog input for
  38 * offset, gain and nonlinearity. The analog outputs are corrected for
  39 * offset and gain. See the comedilib documentation on
  40 * comedi_get_softcal_converter() for more information.
  41 *
  42 * By default, the driver uses DMA to transfer analog input data to
  43 * memory.  When DMA is enabled, not all triggering features are
  44 * supported.
  45 *
  46 * Digital I/O may not work on 673x.
  47 *
  48 * Note that the PCI-6143 is a simultaineous sampling device with 8
  49 * convertors. With this board all of the convertors perform one
  50 * simultaineous sample during a scan interval. The period for a scan
  51 * is used for the convert time in a Comedi cmd. The convert trigger
  52 * source is normally set to TRIG_NOW by default.
  53 *
  54 * The RTSI trigger bus is supported on these cards on subdevice 10.
  55 * See the comedilib documentation for details.
  56 *
  57 * Information (number of channels, bits, etc.) for some devices may be
  58 * incorrect. Please check this and submit a bug if there are problems
  59 * for your device.
  60 *
  61 * SCXI is probably broken for m-series boards.
  62 *
  63 * Bugs:
  64 * - When DMA is enabled, COMEDI_EV_CONVERT does not work correctly.
  65 */
  66
  67/*
  68 * The PCI-MIO E series driver was originally written by
  69 * Tomasz Motylewski <...>, and ported to comedi by ds.
  70 *
  71 * References:
  72 *      341079b.pdf  PCI E Series Register-Level Programmer Manual
  73 *      340934b.pdf  DAQ-STC reference manual
  74 *
  75 *      322080b.pdf  6711/6713/6715 User Manual
  76 *
  77 *      320945c.pdf  PCI E Series User Manual
  78 *      322138a.pdf  PCI-6052E and DAQPad-6052E User Manual
  79 *
  80 * ISSUES:
  81 * - need to deal with external reference for DAC, and other DAC
  82 *   properties in board properties
  83 * - deal with at-mio-16de-10 revision D to N changes, etc.
  84 * - need to add other CALDAC type
  85 * - need to slow down DAC loading. I don't trust NI's claim that
  86 *   two writes to the PCI bus slows IO enough. I would prefer to
  87 *   use udelay().
  88 *   Timing specs: (clock)
  89 *      AD8522          30ns
  90 *      DAC8043         120ns
  91 *      DAC8800         60ns
  92 *      MB88341         ?
  93 */
  94
  95#include <linux/module.h>
  96#include <linux/delay.h>
  97
  98#include "../comedi_pci.h"
  99
 100#include <asm/byteorder.h>
 101
 102#include "ni_stc.h"
 103#include "mite.h"
 104
 105#define PCIDMA
 106
 107/*
 108 * These are not all the possible ao ranges for 628x boards.
 109 * They can do OFFSET +- REFERENCE where OFFSET can be
 110 * 0V, 5V, APFI<0,1>, or AO<0...3> and RANGE can
 111 * be 10V, 5V, 2V, 1V, APFI<0,1>, AO<0...3>.  That's
 112 * 63 different possibilities.  An AO channel
 113 * can not act as it's own OFFSET or REFERENCE.
 114 */
 115static const struct comedi_lrange range_ni_M_628x_ao = {
 116        8, {
 117                BIP_RANGE(10),
 118                BIP_RANGE(5),
 119                BIP_RANGE(2),
 120                BIP_RANGE(1),
 121                RANGE(-5, 15),
 122                UNI_RANGE(10),
 123                RANGE(3, 7),
 124                RANGE(4, 6),
 125                RANGE_ext(-1, 1)
 126        }
 127};
 128
 129static const struct comedi_lrange range_ni_M_625x_ao = {
 130        3, {
 131                BIP_RANGE(10),
 132                BIP_RANGE(5),
 133                RANGE_ext(-1, 1)
 134        }
 135};
 136
 137enum ni_pcimio_boardid {
 138        BOARD_PCIMIO_16XE_50,
 139        BOARD_PCIMIO_16XE_10,
 140        BOARD_PCI6014,
 141        BOARD_PXI6030E,
 142        BOARD_PCIMIO_16E_1,
 143        BOARD_PCIMIO_16E_4,
 144        BOARD_PXI6040E,
 145        BOARD_PCI6031E,
 146        BOARD_PCI6032E,
 147        BOARD_PCI6033E,
 148        BOARD_PCI6071E,
 149        BOARD_PCI6023E,
 150        BOARD_PCI6024E,
 151        BOARD_PCI6025E,
 152        BOARD_PXI6025E,
 153        BOARD_PCI6034E,
 154        BOARD_PCI6035E,
 155        BOARD_PCI6052E,
 156        BOARD_PCI6110,
 157        BOARD_PCI6111,
 158        /* BOARD_PCI6115, */
 159        /* BOARD_PXI6115, */
 160        BOARD_PCI6711,
 161        BOARD_PXI6711,
 162        BOARD_PCI6713,
 163        BOARD_PXI6713,
 164        BOARD_PCI6731,
 165        /* BOARD_PXI6731, */
 166        BOARD_PCI6733,
 167        BOARD_PXI6733,
 168        BOARD_PXI6071E,
 169        BOARD_PXI6070E,
 170        BOARD_PXI6052E,
 171        BOARD_PXI6031E,
 172        BOARD_PCI6036E,
 173        BOARD_PCI6220,
 174        BOARD_PXI6220,
 175        BOARD_PCI6221,
 176        BOARD_PCI6221_37PIN,
 177        BOARD_PXI6221,
 178        BOARD_PCI6224,
 179        BOARD_PXI6224,
 180        BOARD_PCI6225,
 181        BOARD_PXI6225,
 182        BOARD_PCI6229,
 183        BOARD_PXI6229,
 184        BOARD_PCI6250,
 185        BOARD_PXI6250,
 186        BOARD_PCI6251,
 187        BOARD_PXI6251,
 188        BOARD_PCIE6251,
 189        BOARD_PXIE6251,
 190        BOARD_PCI6254,
 191        BOARD_PXI6254,
 192        BOARD_PCI6259,
 193        BOARD_PXI6259,
 194        BOARD_PCIE6259,
 195        BOARD_PXIE6259,
 196        BOARD_PCI6280,
 197        BOARD_PXI6280,
 198        BOARD_PCI6281,
 199        BOARD_PXI6281,
 200        BOARD_PCI6284,
 201        BOARD_PXI6284,
 202        BOARD_PCI6289,
 203        BOARD_PXI6289,
 204        BOARD_PCI6143,
 205        BOARD_PXI6143,
 206};
 207
 208static const struct ni_board_struct ni_boards[] = {
 209        [BOARD_PCIMIO_16XE_50] = {
 210                .name           = "pci-mio-16xe-50",
 211                .n_adchan       = 16,
 212                .ai_maxdata     = 0xffff,
 213                .ai_fifo_depth  = 2048,
 214                .alwaysdither   = 1,
 215                .gainlkup       = ai_gain_8,
 216                .ai_speed       = 50000,
 217                .n_aochan       = 2,
 218                .ao_maxdata     = 0x0fff,
 219                .ao_range_table = &range_bipolar10,
 220                .ao_speed       = 50000,
 221                .caldac         = { dac8800, dac8043 },
 222        },
 223        [BOARD_PCIMIO_16XE_10] = {
 224                .name           = "pci-mio-16xe-10",    /*  aka pci-6030E */
 225                .n_adchan       = 16,
 226                .ai_maxdata     = 0xffff,
 227                .ai_fifo_depth  = 512,
 228                .alwaysdither   = 1,
 229                .gainlkup       = ai_gain_14,
 230                .ai_speed       = 10000,
 231                .n_aochan       = 2,
 232                .ao_maxdata     = 0xffff,
 233                .ao_fifo_depth  = 2048,
 234                .ao_range_table = &range_ni_E_ao_ext,
 235                .ao_speed       = 10000,
 236                .caldac         = { dac8800, dac8043, ad8522 },
 237        },
 238        [BOARD_PCI6014] = {
 239                .name           = "pci-6014",
 240                .n_adchan       = 16,
 241                .ai_maxdata     = 0xffff,
 242                .ai_fifo_depth  = 512,
 243                .alwaysdither   = 1,
 244                .gainlkup       = ai_gain_4,
 245                .ai_speed       = 5000,
 246                .n_aochan       = 2,
 247                .ao_maxdata     = 0xffff,
 248                .ao_range_table = &range_bipolar10,
 249                .ao_speed       = 100000,
 250                .caldac         = { ad8804_debug },
 251        },
 252        [BOARD_PXI6030E] = {
 253                .name           = "pxi-6030e",
 254                .n_adchan       = 16,
 255                .ai_maxdata     = 0xffff,
 256                .ai_fifo_depth  = 512,
 257                .alwaysdither   = 1,
 258                .gainlkup       = ai_gain_14,
 259                .ai_speed       = 10000,
 260                .n_aochan       = 2,
 261                .ao_maxdata     = 0xffff,
 262                .ao_fifo_depth  = 2048,
 263                .ao_range_table = &range_ni_E_ao_ext,
 264                .ao_speed       = 10000,
 265                .caldac         = { dac8800, dac8043, ad8522 },
 266        },
 267        [BOARD_PCIMIO_16E_1] = {
 268                .name           = "pci-mio-16e-1",      /* aka pci-6070e */
 269                .n_adchan       = 16,
 270                .ai_maxdata     = 0x0fff,
 271                .ai_fifo_depth  = 512,
 272                .gainlkup       = ai_gain_16,
 273                .ai_speed       = 800,
 274                .n_aochan       = 2,
 275                .ao_maxdata     = 0x0fff,
 276                .ao_fifo_depth  = 2048,
 277                .ao_range_table = &range_ni_E_ao_ext,
 278                .ao_speed       = 1000,
 279                .caldac         = { mb88341 },
 280        },
 281        [BOARD_PCIMIO_16E_4] = {
 282                .name           = "pci-mio-16e-4",      /* aka pci-6040e */
 283                .n_adchan       = 16,
 284                .ai_maxdata     = 0x0fff,
 285                .ai_fifo_depth  = 512,
 286                .gainlkup       = ai_gain_16,
 287                /*
 288                 * there have been reported problems with
 289                 * full speed on this board
 290                 */
 291                .ai_speed       = 2000,
 292                .n_aochan       = 2,
 293                .ao_maxdata     = 0x0fff,
 294                .ao_fifo_depth  = 512,
 295                .ao_range_table = &range_ni_E_ao_ext,
 296                .ao_speed       = 1000,
 297                .caldac         = { ad8804_debug },     /* doc says mb88341 */
 298        },
 299        [BOARD_PXI6040E] = {
 300                .name           = "pxi-6040e",
 301                .n_adchan       = 16,
 302                .ai_maxdata     = 0x0fff,
 303                .ai_fifo_depth  = 512,
 304                .gainlkup       = ai_gain_16,
 305                .ai_speed       = 2000,
 306                .n_aochan       = 2,
 307                .ao_maxdata     = 0x0fff,
 308                .ao_fifo_depth  = 512,
 309                .ao_range_table = &range_ni_E_ao_ext,
 310                .ao_speed       = 1000,
 311                .caldac         = { mb88341 },
 312        },
 313        [BOARD_PCI6031E] = {
 314                .name           = "pci-6031e",
 315                .n_adchan       = 64,
 316                .ai_maxdata     = 0xffff,
 317                .ai_fifo_depth  = 512,
 318                .alwaysdither   = 1,
 319                .gainlkup       = ai_gain_14,
 320                .ai_speed       = 10000,
 321                .n_aochan       = 2,
 322                .ao_maxdata     = 0xffff,
 323                .ao_fifo_depth  = 2048,
 324                .ao_range_table = &range_ni_E_ao_ext,
 325                .ao_speed       = 10000,
 326                .caldac         = { dac8800, dac8043, ad8522 },
 327        },
 328        [BOARD_PCI6032E] = {
 329                .name           = "pci-6032e",
 330                .n_adchan       = 16,
 331                .ai_maxdata     = 0xffff,
 332                .ai_fifo_depth  = 512,
 333                .alwaysdither   = 1,
 334                .gainlkup       = ai_gain_14,
 335                .ai_speed       = 10000,
 336                .caldac         = { dac8800, dac8043, ad8522 },
 337        },
 338        [BOARD_PCI6033E] = {
 339                .name           = "pci-6033e",
 340                .n_adchan       = 64,
 341                .ai_maxdata     = 0xffff,
 342                .ai_fifo_depth  = 512,
 343                .alwaysdither   = 1,
 344                .gainlkup       = ai_gain_14,
 345                .ai_speed       = 10000,
 346                .caldac         = { dac8800, dac8043, ad8522 },
 347        },
 348        [BOARD_PCI6071E] = {
 349                .name           = "pci-6071e",
 350                .n_adchan       = 64,
 351                .ai_maxdata     = 0x0fff,
 352                .ai_fifo_depth  = 512,
 353                .alwaysdither   = 1,
 354                .gainlkup       = ai_gain_16,
 355                .ai_speed       = 800,
 356                .n_aochan       = 2,
 357                .ao_maxdata     = 0x0fff,
 358                .ao_fifo_depth  = 2048,
 359                .ao_range_table = &range_ni_E_ao_ext,
 360                .ao_speed       = 1000,
 361                .caldac         = { ad8804_debug },
 362        },
 363        [BOARD_PCI6023E] = {
 364                .name           = "pci-6023e",
 365                .n_adchan       = 16,
 366                .ai_maxdata     = 0x0fff,
 367                .ai_fifo_depth  = 512,
 368                .gainlkup       = ai_gain_4,
 369                .ai_speed       = 5000,
 370                .caldac         = { ad8804_debug },     /* manual is wrong */
 371        },
 372        [BOARD_PCI6024E] = {
 373                .name           = "pci-6024e",
 374                .n_adchan       = 16,
 375                .ai_maxdata     = 0x0fff,
 376                .ai_fifo_depth  = 512,
 377                .gainlkup       = ai_gain_4,
 378                .ai_speed       = 5000,
 379                .n_aochan       = 2,
 380                .ao_maxdata     = 0x0fff,
 381                .ao_range_table = &range_bipolar10,
 382                .ao_speed       = 100000,
 383                .caldac         = { ad8804_debug },     /* manual is wrong */
 384        },
 385        [BOARD_PCI6025E] = {
 386                .name           = "pci-6025e",
 387                .n_adchan       = 16,
 388                .ai_maxdata     = 0x0fff,
 389                .ai_fifo_depth  = 512,
 390                .gainlkup       = ai_gain_4,
 391                .ai_speed       = 5000,
 392                .n_aochan       = 2,
 393                .ao_maxdata     = 0x0fff,
 394                .ao_range_table = &range_bipolar10,
 395                .ao_speed       = 100000,
 396                .caldac         = { ad8804_debug },     /* manual is wrong */
 397                .has_8255       = 1,
 398        },
 399        [BOARD_PXI6025E] = {
 400                .name           = "pxi-6025e",
 401                .n_adchan       = 16,
 402                .ai_maxdata     = 0x0fff,
 403                .ai_fifo_depth  = 512,
 404                .gainlkup       = ai_gain_4,
 405                .ai_speed       = 5000,
 406                .n_aochan       = 2,
 407                .ao_maxdata     = 0x0fff,
 408                .ao_range_table = &range_ni_E_ao_ext,
 409                .ao_speed       = 100000,
 410                .caldac         = { ad8804_debug },     /* manual is wrong */
 411                .has_8255       = 1,
 412        },
 413        [BOARD_PCI6034E] = {
 414                .name           = "pci-6034e",
 415                .n_adchan       = 16,
 416                .ai_maxdata     = 0xffff,
 417                .ai_fifo_depth  = 512,
 418                .alwaysdither   = 1,
 419                .gainlkup       = ai_gain_4,
 420                .ai_speed       = 5000,
 421                .caldac         = { ad8804_debug },
 422        },
 423        [BOARD_PCI6035E] = {
 424                .name           = "pci-6035e",
 425                .n_adchan       = 16,
 426                .ai_maxdata     = 0xffff,
 427                .ai_fifo_depth  = 512,
 428                .alwaysdither   = 1,
 429                .gainlkup       = ai_gain_4,
 430                .ai_speed       = 5000,
 431                .n_aochan       = 2,
 432                .ao_maxdata     = 0x0fff,
 433                .ao_range_table = &range_bipolar10,
 434                .ao_speed       = 100000,
 435                .caldac         = { ad8804_debug },
 436        },
 437        [BOARD_PCI6052E] = {
 438                .name           = "pci-6052e",
 439                .n_adchan       = 16,
 440                .ai_maxdata     = 0xffff,
 441                .ai_fifo_depth  = 512,
 442                .alwaysdither   = 1,
 443                .gainlkup       = ai_gain_16,
 444                .ai_speed       = 3000,
 445                .n_aochan       = 2,
 446                .ao_maxdata     = 0xffff,
 447                .ao_fifo_depth  = 2048,
 448                .ao_range_table = &range_ni_E_ao_ext,
 449                .ao_speed       = 3000,
 450                /* manual is wrong */
 451                .caldac         = { ad8804_debug, ad8804_debug, ad8522 },
 452        },
 453        [BOARD_PCI6110] = {
 454                .name           = "pci-6110",
 455                .n_adchan       = 4,
 456                .ai_maxdata     = 0x0fff,
 457                .ai_fifo_depth  = 8192,
 458                .alwaysdither   = 0,
 459                .gainlkup       = ai_gain_611x,
 460                .ai_speed       = 200,
 461                .n_aochan       = 2,
 462                .ao_maxdata     = 0xffff,
 463                .reg_type       = ni_reg_611x,
 464                .ao_range_table = &range_bipolar10,
 465                .ao_fifo_depth  = 2048,
 466                .ao_speed       = 250,
 467                .caldac         = { ad8804, ad8804 },
 468        },
 469        [BOARD_PCI6111] = {
 470                .name           = "pci-6111",
 471                .n_adchan       = 2,
 472                .ai_maxdata     = 0x0fff,
 473                .ai_fifo_depth  = 8192,
 474                .gainlkup       = ai_gain_611x,
 475                .ai_speed       = 200,
 476                .n_aochan       = 2,
 477                .ao_maxdata     = 0xffff,
 478                .reg_type       = ni_reg_611x,
 479                .ao_range_table = &range_bipolar10,
 480                .ao_fifo_depth  = 2048,
 481                .ao_speed       = 250,
 482                .caldac         = { ad8804, ad8804 },
 483        },
 484#if 0
 485        /* The 6115 boards probably need their own driver */
 486        [BOARD_PCI6115] = {     /* .device_id = 0x2ed0, */
 487                .name           = "pci-6115",
 488                .n_adchan       = 4,
 489                .ai_maxdata     = 0x0fff,
 490                .ai_fifo_depth  = 8192,
 491                .gainlkup       = ai_gain_611x,
 492                .ai_speed       = 100,
 493                .n_aochan       = 2,
 494                .ao_maxdata     = 0xffff,
 495                .ao_671x        = 1,
 496                .ao_fifo_depth  = 2048,
 497                .ao_speed       = 250,
 498                .reg_611x       = 1,
 499                /* XXX */
 500                .caldac         = { ad8804_debug, ad8804_debug, ad8804_debug },
 501        },
 502#endif
 503#if 0
 504        [BOARD_PXI6115] = {     /* .device_id = ????, */
 505                .name           = "pxi-6115",
 506                .n_adchan       = 4,
 507                .ai_maxdata     = 0x0fff,
 508                .ai_fifo_depth  = 8192,
 509                .gainlkup       = ai_gain_611x,
 510                .ai_speed       = 100,
 511                .n_aochan       = 2,
 512                .ao_maxdata     = 0xffff,
 513                .ao_671x        = 1,
 514                .ao_fifo_depth  = 2048,
 515                .ao_speed       = 250,
 516                .reg_611x       = 1,
 517                /* XXX */
 518                .caldac         = { ad8804_debug, ad8804_debug, ad8804_debug },
 519        },
 520#endif
 521        [BOARD_PCI6711] = {
 522                .name = "pci-6711",
 523                .n_aochan       = 4,
 524                .ao_maxdata     = 0x0fff,
 525                /* data sheet says 8192, but fifo really holds 16384 samples */
 526                .ao_fifo_depth  = 16384,
 527                .ao_range_table = &range_bipolar10,
 528                .ao_speed       = 1000,
 529                .reg_type       = ni_reg_6711,
 530                .caldac         = { ad8804_debug },
 531        },
 532        [BOARD_PXI6711] = {
 533                .name           = "pxi-6711",
 534                .n_aochan       = 4,
 535                .ao_maxdata     = 0x0fff,
 536                .ao_fifo_depth  = 16384,
 537                .ao_range_table = &range_bipolar10,
 538                .ao_speed       = 1000,
 539                .reg_type       = ni_reg_6711,
 540                .caldac         = { ad8804_debug },
 541        },
 542        [BOARD_PCI6713] = {
 543                .name           = "pci-6713",
 544                .n_aochan       = 8,
 545                .ao_maxdata     = 0x0fff,
 546                .ao_fifo_depth  = 16384,
 547                .ao_range_table = &range_bipolar10,
 548                .ao_speed       = 1000,
 549                .reg_type       = ni_reg_6713,
 550                .caldac         = { ad8804_debug, ad8804_debug },
 551        },
 552        [BOARD_PXI6713] = {
 553                .name           = "pxi-6713",
 554                .n_aochan       = 8,
 555                .ao_maxdata     = 0x0fff,
 556                .ao_fifo_depth  = 16384,
 557                .ao_range_table = &range_bipolar10,
 558                .ao_speed       = 1000,
 559                .reg_type       = ni_reg_6713,
 560                .caldac         = { ad8804_debug, ad8804_debug },
 561        },
 562        [BOARD_PCI6731] = {
 563                .name           = "pci-6731",
 564                .n_aochan       = 4,
 565                .ao_maxdata     = 0xffff,
 566                .ao_fifo_depth  = 8192,
 567                .ao_range_table = &range_bipolar10,
 568                .ao_speed       = 1000,
 569                .reg_type       = ni_reg_6711,
 570                .caldac         = { ad8804_debug },
 571        },
 572#if 0
 573        [BOARD_PXI6731] = {     /* .device_id = ????, */
 574                .name           = "pxi-6731",
 575                .n_aochan       = 4,
 576                .ao_maxdata     = 0xffff,
 577                .ao_fifo_depth  = 8192,
 578                .ao_range_table = &range_bipolar10,
 579                .reg_type       = ni_reg_6711,
 580                .caldac         = { ad8804_debug },
 581        },
 582#endif
 583        [BOARD_PCI6733] = {
 584                .name           = "pci-6733",
 585                .n_aochan       = 8,
 586                .ao_maxdata     = 0xffff,
 587                .ao_fifo_depth  = 16384,
 588                .ao_range_table = &range_bipolar10,
 589                .ao_speed       = 1000,
 590                .reg_type       = ni_reg_6713,
 591                .caldac         = { ad8804_debug, ad8804_debug },
 592        },
 593        [BOARD_PXI6733] = {
 594                .name           = "pxi-6733",
 595                .n_aochan       = 8,
 596                .ao_maxdata     = 0xffff,
 597                .ao_fifo_depth  = 16384,
 598                .ao_range_table = &range_bipolar10,
 599                .ao_speed       = 1000,
 600                .reg_type       = ni_reg_6713,
 601                .caldac         = { ad8804_debug, ad8804_debug },
 602        },
 603        [BOARD_PXI6071E] = {
 604                .name           = "pxi-6071e",
 605                .n_adchan       = 64,
 606                .ai_maxdata     = 0x0fff,
 607                .ai_fifo_depth  = 512,
 608                .alwaysdither   = 1,
 609                .gainlkup       = ai_gain_16,
 610                .ai_speed       = 800,
 611                .n_aochan       = 2,
 612                .ao_maxdata     = 0x0fff,
 613                .ao_fifo_depth  = 2048,
 614                .ao_range_table = &range_ni_E_ao_ext,
 615                .ao_speed       = 1000,
 616                .caldac         = { ad8804_debug },
 617        },
 618        [BOARD_PXI6070E] = {
 619                .name           = "pxi-6070e",
 620                .n_adchan       = 16,
 621                .ai_maxdata     = 0x0fff,
 622                .ai_fifo_depth  = 512,
 623                .alwaysdither   = 1,
 624                .gainlkup       = ai_gain_16,
 625                .ai_speed       = 800,
 626                .n_aochan       = 2,
 627                .ao_maxdata     = 0x0fff,
 628                .ao_fifo_depth  = 2048,
 629                .ao_range_table = &range_ni_E_ao_ext,
 630                .ao_speed       = 1000,
 631                .caldac         = { ad8804_debug },
 632        },
 633        [BOARD_PXI6052E] = {
 634                .name           = "pxi-6052e",
 635                .n_adchan       = 16,
 636                .ai_maxdata     = 0xffff,
 637                .ai_fifo_depth  = 512,
 638                .alwaysdither   = 1,
 639                .gainlkup       = ai_gain_16,
 640                .ai_speed       = 3000,
 641                .n_aochan       = 2,
 642                .ao_maxdata     = 0xffff,
 643                .ao_fifo_depth  = 2048,
 644                .ao_range_table = &range_ni_E_ao_ext,
 645                .ao_speed       = 3000,
 646                .caldac         = { mb88341, mb88341, ad8522 },
 647        },
 648        [BOARD_PXI6031E] = {
 649                .name           = "pxi-6031e",
 650                .n_adchan       = 64,
 651                .ai_maxdata     = 0xffff,
 652                .ai_fifo_depth  = 512,
 653                .alwaysdither   = 1,
 654                .gainlkup       = ai_gain_14,
 655                .ai_speed       = 10000,
 656                .n_aochan       = 2,
 657                .ao_maxdata     = 0xffff,
 658                .ao_fifo_depth  = 2048,
 659                .ao_range_table = &range_ni_E_ao_ext,
 660                .ao_speed       = 10000,
 661                .caldac         = { dac8800, dac8043, ad8522 },
 662        },
 663        [BOARD_PCI6036E] = {
 664                .name = "pci-6036e",
 665                .n_adchan       = 16,
 666                .ai_maxdata     = 0xffff,
 667                .ai_fifo_depth  = 512,
 668                .alwaysdither   = 1,
 669                .gainlkup       = ai_gain_4,
 670                .ai_speed       = 5000,
 671                .n_aochan       = 2,
 672                .ao_maxdata     = 0xffff,
 673                .ao_range_table = &range_bipolar10,
 674                .ao_speed       = 100000,
 675                .caldac         = { ad8804_debug },
 676        },
 677        [BOARD_PCI6220] = {
 678                .name           = "pci-6220",
 679                .n_adchan       = 16,
 680                .ai_maxdata     = 0xffff,
 681                .ai_fifo_depth  = 512,          /* FIXME: guess */
 682                .gainlkup       = ai_gain_622x,
 683                .ai_speed       = 4000,
 684                .reg_type       = ni_reg_622x,
 685                .caldac         = { caldac_none },
 686        },
 687        [BOARD_PXI6220] = {
 688                .name           = "pxi-6220",
 689                .n_adchan       = 16,
 690                .ai_maxdata     = 0xffff,
 691                .ai_fifo_depth  = 512,          /* FIXME: guess */
 692                .gainlkup       = ai_gain_622x,
 693                .ai_speed       = 4000,
 694                .reg_type       = ni_reg_622x,
 695                .caldac         = { caldac_none },
 696                .dio_speed      = 1000,
 697        },
 698        [BOARD_PCI6221] = {
 699                .name           = "pci-6221",
 700                .n_adchan       = 16,
 701                .ai_maxdata     = 0xffff,
 702                .ai_fifo_depth  = 4095,
 703                .gainlkup       = ai_gain_622x,
 704                .ai_speed       = 4000,
 705                .n_aochan       = 2,
 706                .ao_maxdata     = 0xffff,
 707                .ao_fifo_depth  = 8191,
 708                .ao_range_table = &range_bipolar10,
 709                .reg_type       = ni_reg_622x,
 710                .ao_speed       = 1200,
 711                .caldac         = { caldac_none },
 712                .dio_speed      = 1000,
 713        },
 714        [BOARD_PCI6221_37PIN] = {
 715                .name           = "pci-6221_37pin",
 716                .n_adchan       = 16,
 717                .ai_maxdata     = 0xffff,
 718                .ai_fifo_depth  = 4095,
 719                .gainlkup       = ai_gain_622x,
 720                .ai_speed       = 4000,
 721                .n_aochan       = 2,
 722                .ao_maxdata     = 0xffff,
 723                .ao_fifo_depth  = 8191,
 724                .ao_range_table = &range_bipolar10,
 725                .reg_type       = ni_reg_622x,
 726                .ao_speed       = 1200,
 727                .caldac         = { caldac_none },
 728        },
 729        [BOARD_PXI6221] = {
 730                .name           = "pxi-6221",
 731                .n_adchan       = 16,
 732                .ai_maxdata     = 0xffff,
 733                .ai_fifo_depth  = 4095,
 734                .gainlkup       = ai_gain_622x,
 735                .ai_speed       = 4000,
 736                .n_aochan       = 2,
 737                .ao_maxdata     = 0xffff,
 738                .ao_fifo_depth  = 8191,
 739                .ao_range_table = &range_bipolar10,
 740                .reg_type       = ni_reg_622x,
 741                .ao_speed       = 1200,
 742                .caldac         = { caldac_none },
 743                .dio_speed      = 1000,
 744        },
 745        [BOARD_PCI6224] = {
 746                .name           = "pci-6224",
 747                .n_adchan       = 32,
 748                .ai_maxdata     = 0xffff,
 749                .ai_fifo_depth  = 4095,
 750                .gainlkup       = ai_gain_622x,
 751                .ai_speed       = 4000,
 752                .reg_type       = ni_reg_622x,
 753                .has_32dio_chan = 1,
 754                .caldac         = { caldac_none },
 755                .dio_speed      = 1000,
 756        },
 757        [BOARD_PXI6224] = {
 758                .name           = "pxi-6224",
 759                .n_adchan       = 32,
 760                .ai_maxdata     = 0xffff,
 761                .ai_fifo_depth  = 4095,
 762                .gainlkup       = ai_gain_622x,
 763                .ai_speed       = 4000,
 764                .reg_type       = ni_reg_622x,
 765                .has_32dio_chan = 1,
 766                .caldac         = { caldac_none },
 767                .dio_speed      = 1000,
 768        },
 769        [BOARD_PCI6225] = {
 770                .name           = "pci-6225",
 771                .n_adchan       = 80,
 772                .ai_maxdata     = 0xffff,
 773                .ai_fifo_depth  = 4095,
 774                .gainlkup       = ai_gain_622x,
 775                .ai_speed       = 4000,
 776                .n_aochan       = 2,
 777                .ao_maxdata     = 0xffff,
 778                .ao_fifo_depth  = 8191,
 779                .ao_range_table = &range_bipolar10,
 780                .reg_type       = ni_reg_622x,
 781                .ao_speed       = 1200,
 782                .has_32dio_chan = 1,
 783                .caldac         = { caldac_none },
 784                .dio_speed      = 1000,
 785        },
 786        [BOARD_PXI6225] = {
 787                .name           = "pxi-6225",
 788                .n_adchan       = 80,
 789                .ai_maxdata     = 0xffff,
 790                .ai_fifo_depth  = 4095,
 791                .gainlkup       = ai_gain_622x,
 792                .ai_speed       = 4000,
 793                .n_aochan       = 2,
 794                .ao_maxdata     = 0xffff,
 795                .ao_fifo_depth  = 8191,
 796                .ao_range_table = &range_bipolar10,
 797                .reg_type       = ni_reg_622x,
 798                .ao_speed       = 1200,
 799                .has_32dio_chan = 1,
 800                .caldac         = { caldac_none },
 801                .dio_speed      = 1000,
 802        },
 803        [BOARD_PCI6229] = {
 804                .name           = "pci-6229",
 805                .n_adchan       = 32,
 806                .ai_maxdata     = 0xffff,
 807                .ai_fifo_depth  = 4095,
 808                .gainlkup       = ai_gain_622x,
 809                .ai_speed       = 4000,
 810                .n_aochan       = 4,
 811                .ao_maxdata     = 0xffff,
 812                .ao_fifo_depth  = 8191,
 813                .ao_range_table = &range_bipolar10,
 814                .reg_type       = ni_reg_622x,
 815                .ao_speed       = 1200,
 816                .has_32dio_chan = 1,
 817                .caldac         = { caldac_none },
 818        },
 819        [BOARD_PXI6229] = {
 820                .name           = "pxi-6229",
 821                .n_adchan       = 32,
 822                .ai_maxdata     = 0xffff,
 823                .ai_fifo_depth  = 4095,
 824                .gainlkup       = ai_gain_622x,
 825                .ai_speed       = 4000,
 826                .n_aochan       = 4,
 827                .ao_maxdata     = 0xffff,
 828                .ao_fifo_depth  = 8191,
 829                .ao_range_table = &range_bipolar10,
 830                .reg_type       = ni_reg_622x,
 831                .ao_speed       = 1200,
 832                .has_32dio_chan = 1,
 833                .caldac         = { caldac_none },
 834                .dio_speed      = 1000,
 835        },
 836        [BOARD_PCI6250] = {
 837                .name           = "pci-6250",
 838                .n_adchan       = 16,
 839                .ai_maxdata     = 0xffff,
 840                .ai_fifo_depth  = 4095,
 841                .gainlkup       = ai_gain_628x,
 842                .ai_speed       = 800,
 843                .reg_type       = ni_reg_625x,
 844                .caldac         = { caldac_none },
 845        },
 846        [BOARD_PXI6250] = {
 847                .name           = "pxi-6250",
 848                .n_adchan       = 16,
 849                .ai_maxdata     = 0xffff,
 850                .ai_fifo_depth  = 4095,
 851                .gainlkup       = ai_gain_628x,
 852                .ai_speed       = 800,
 853                .reg_type       = ni_reg_625x,
 854                .caldac         = { caldac_none },
 855                .dio_speed      = 100,
 856        },
 857        [BOARD_PCI6251] = {
 858                .name           = "pci-6251",
 859                .n_adchan       = 16,
 860                .ai_maxdata     = 0xffff,
 861                .ai_fifo_depth  = 4095,
 862                .gainlkup       = ai_gain_628x,
 863                .ai_speed       = 800,
 864                .n_aochan       = 2,
 865                .ao_maxdata     = 0xffff,
 866                .ao_fifo_depth  = 8191,
 867                .ao_range_table = &range_ni_M_625x_ao,
 868                .reg_type       = ni_reg_625x,
 869                .ao_speed       = 350,
 870                .caldac         = { caldac_none },
 871                .dio_speed      = 100,
 872        },
 873        [BOARD_PXI6251] = {
 874                .name           = "pxi-6251",
 875                .n_adchan       = 16,
 876                .ai_maxdata     = 0xffff,
 877                .ai_fifo_depth  = 4095,
 878                .gainlkup       = ai_gain_628x,
 879                .ai_speed       = 800,
 880                .n_aochan       = 2,
 881                .ao_maxdata     = 0xffff,
 882                .ao_fifo_depth  = 8191,
 883                .ao_range_table = &range_ni_M_625x_ao,
 884                .reg_type       = ni_reg_625x,
 885                .ao_speed       = 350,
 886                .caldac         = { caldac_none },
 887                .dio_speed      = 100,
 888        },
 889        [BOARD_PCIE6251] = {
 890                .name           = "pcie-6251",
 891                .n_adchan       = 16,
 892                .ai_maxdata     = 0xffff,
 893                .ai_fifo_depth  = 4095,
 894                .gainlkup       = ai_gain_628x,
 895                .ai_speed       = 800,
 896                .n_aochan       = 2,
 897                .ao_maxdata     = 0xffff,
 898                .ao_fifo_depth  = 8191,
 899                .ao_range_table = &range_ni_M_625x_ao,
 900                .reg_type       = ni_reg_625x,
 901                .ao_speed       = 350,
 902                .caldac         = { caldac_none },
 903                .dio_speed      = 100,
 904        },
 905        [BOARD_PXIE6251] = {
 906                .name           = "pxie-6251",
 907                .n_adchan       = 16,
 908                .ai_maxdata     = 0xffff,
 909                .ai_fifo_depth  = 4095,
 910                .gainlkup       = ai_gain_628x,
 911                .ai_speed       = 800,
 912                .n_aochan       = 2,
 913                .ao_maxdata     = 0xffff,
 914                .ao_fifo_depth  = 8191,
 915                .ao_range_table = &range_ni_M_625x_ao,
 916                .reg_type       = ni_reg_625x,
 917                .ao_speed       = 350,
 918                .caldac         = { caldac_none },
 919                .dio_speed      = 100,
 920        },
 921        [BOARD_PCI6254] = {
 922                .name           = "pci-6254",
 923                .n_adchan       = 32,
 924                .ai_maxdata     = 0xffff,
 925                .ai_fifo_depth  = 4095,
 926                .gainlkup       = ai_gain_628x,
 927                .ai_speed       = 800,
 928                .reg_type       = ni_reg_625x,
 929                .has_32dio_chan = 1,
 930                .caldac         = { caldac_none },
 931        },
 932        [BOARD_PXI6254] = {
 933                .name           = "pxi-6254",
 934                .n_adchan       = 32,
 935                .ai_maxdata     = 0xffff,
 936                .ai_fifo_depth  = 4095,
 937                .gainlkup       = ai_gain_628x,
 938                .ai_speed       = 800,
 939                .reg_type       = ni_reg_625x,
 940                .has_32dio_chan = 1,
 941                .caldac         = { caldac_none },
 942                .dio_speed      = 100,
 943        },
 944        [BOARD_PCI6259] = {
 945                .name           = "pci-6259",
 946                .n_adchan       = 32,
 947                .ai_maxdata     = 0xffff,
 948                .ai_fifo_depth  = 4095,
 949                .gainlkup       = ai_gain_628x,
 950                .ai_speed       = 800,
 951                .n_aochan       = 4,
 952                .ao_maxdata     = 0xffff,
 953                .ao_fifo_depth  = 8191,
 954                .ao_range_table = &range_ni_M_625x_ao,
 955                .reg_type       = ni_reg_625x,
 956                .ao_speed       = 350,
 957                .has_32dio_chan = 1,
 958                .caldac         = { caldac_none },
 959        },
 960        [BOARD_PXI6259] = {
 961                .name           = "pxi-6259",
 962                .n_adchan       = 32,
 963                .ai_maxdata     = 0xffff,
 964                .ai_fifo_depth  = 4095,
 965                .gainlkup       = ai_gain_628x,
 966                .ai_speed       = 800,
 967                .n_aochan       = 4,
 968                .ao_maxdata     = 0xffff,
 969                .ao_fifo_depth  = 8191,
 970                .ao_range_table = &range_ni_M_625x_ao,
 971                .reg_type       = ni_reg_625x,
 972                .ao_speed       = 350,
 973                .has_32dio_chan = 1,
 974                .caldac         = { caldac_none },
 975                .dio_speed      = 100,
 976        },
 977        [BOARD_PCIE6259] = {
 978                .name           = "pcie-6259",
 979                .n_adchan       = 32,
 980                .ai_maxdata     = 0xffff,
 981                .ai_fifo_depth  = 4095,
 982                .gainlkup       = ai_gain_628x,
 983                .ai_speed       = 800,
 984                .n_aochan       = 4,
 985                .ao_maxdata     = 0xffff,
 986                .ao_fifo_depth  = 8191,
 987                .ao_range_table = &range_ni_M_625x_ao,
 988                .reg_type       = ni_reg_625x,
 989                .ao_speed       = 350,
 990                .has_32dio_chan = 1,
 991                .caldac         = { caldac_none },
 992        },
 993        [BOARD_PXIE6259] = {
 994                .name           = "pxie-6259",
 995                .n_adchan       = 32,
 996                .ai_maxdata     = 0xffff,
 997                .ai_fifo_depth  = 4095,
 998                .gainlkup       = ai_gain_628x,
 999                .ai_speed       = 800,
1000                .n_aochan       = 4,
1001                .ao_maxdata     = 0xffff,
1002                .ao_fifo_depth  = 8191,
1003                .ao_range_table = &range_ni_M_625x_ao,
1004                .reg_type       = ni_reg_625x,
1005                .ao_speed       = 350,
1006                .has_32dio_chan = 1,
1007                .caldac         = { caldac_none },
1008                .dio_speed      = 100,
1009        },
1010        [BOARD_PCI6280] = {
1011                .name           = "pci-6280",
1012                .n_adchan       = 16,
1013                .ai_maxdata     = 0x3ffff,
1014                .ai_fifo_depth  = 2047,
1015                .gainlkup       = ai_gain_628x,
1016                .ai_speed       = 1600,
1017                .ao_fifo_depth  = 8191,
1018                .reg_type       = ni_reg_628x,
1019                .caldac         = { caldac_none },
1020        },
1021        [BOARD_PXI6280] = {
1022                .name           = "pxi-6280",
1023                .n_adchan       = 16,
1024                .ai_maxdata     = 0x3ffff,
1025                .ai_fifo_depth  = 2047,
1026                .gainlkup       = ai_gain_628x,
1027                .ai_speed       = 1600,
1028                .ao_fifo_depth  = 8191,
1029                .reg_type       = ni_reg_628x,
1030                .caldac         = { caldac_none },
1031                .dio_speed      = 100,
1032        },
1033        [BOARD_PCI6281] = {
1034                .name           = "pci-6281",
1035                .n_adchan       = 16,
1036                .ai_maxdata     = 0x3ffff,
1037                .ai_fifo_depth  = 2047,
1038                .gainlkup       = ai_gain_628x,
1039                .ai_speed       = 1600,
1040                .n_aochan       = 2,
1041                .ao_maxdata     = 0xffff,
1042                .ao_fifo_depth  = 8191,
1043                .ao_range_table = &range_ni_M_628x_ao,
1044                .reg_type       = ni_reg_628x,
1045                .ao_speed       = 350,
1046                .caldac         = { caldac_none },
1047                .dio_speed      = 100,
1048        },
1049        [BOARD_PXI6281] = {
1050                .name           = "pxi-6281",
1051                .n_adchan       = 16,
1052                .ai_maxdata     = 0x3ffff,
1053                .ai_fifo_depth  = 2047,
1054                .gainlkup       = ai_gain_628x,
1055                .ai_speed       = 1600,
1056                .n_aochan       = 2,
1057                .ao_maxdata     = 0xffff,
1058                .ao_fifo_depth  = 8191,
1059                .ao_range_table = &range_ni_M_628x_ao,
1060                .reg_type       = ni_reg_628x,
1061                .ao_speed       = 350,
1062                .caldac         = { caldac_none },
1063                .dio_speed      = 100,
1064        },
1065        [BOARD_PCI6284] = {
1066                .name           = "pci-6284",
1067                .n_adchan       = 32,
1068                .ai_maxdata     = 0x3ffff,
1069                .ai_fifo_depth  = 2047,
1070                .gainlkup       = ai_gain_628x,
1071                .ai_speed       = 1600,
1072                .reg_type       = ni_reg_628x,
1073                .has_32dio_chan = 1,
1074                .caldac         = { caldac_none },
1075        },
1076        [BOARD_PXI6284] = {
1077                .name           = "pxi-6284",
1078                .n_adchan       = 32,
1079                .ai_maxdata     = 0x3ffff,
1080                .ai_fifo_depth  = 2047,
1081                .gainlkup       = ai_gain_628x,
1082                .ai_speed       = 1600,
1083                .reg_type       = ni_reg_628x,
1084                .has_32dio_chan = 1,
1085                .caldac         = { caldac_none },
1086                .dio_speed      = 100,
1087        },
1088        [BOARD_PCI6289] = {
1089                .name           = "pci-6289",
1090                .n_adchan       = 32,
1091                .ai_maxdata     = 0x3ffff,
1092                .ai_fifo_depth  = 2047,
1093                .gainlkup       = ai_gain_628x,
1094                .ai_speed       = 1600,
1095                .n_aochan       = 4,
1096                .ao_maxdata     = 0xffff,
1097                .ao_fifo_depth  = 8191,
1098                .ao_range_table = &range_ni_M_628x_ao,
1099                .reg_type       = ni_reg_628x,
1100                .ao_speed       = 350,
1101                .has_32dio_chan = 1,
1102                .caldac         = { caldac_none },
1103        },
1104        [BOARD_PXI6289] = {
1105                .name           = "pxi-6289",
1106                .n_adchan       = 32,
1107                .ai_maxdata     = 0x3ffff,
1108                .ai_fifo_depth  = 2047,
1109                .gainlkup       = ai_gain_628x,
1110                .ai_speed       = 1600,
1111                .n_aochan       = 4,
1112                .ao_maxdata     = 0xffff,
1113                .ao_fifo_depth  = 8191,
1114                .ao_range_table = &range_ni_M_628x_ao,
1115                .reg_type       = ni_reg_628x,
1116                .ao_speed       = 350,
1117                .has_32dio_chan = 1,
1118                .caldac         = { caldac_none },
1119                .dio_speed      = 100,
1120        },
1121        [BOARD_PCI6143] = {
1122                .name           = "pci-6143",
1123                .n_adchan       = 8,
1124                .ai_maxdata     = 0xffff,
1125                .ai_fifo_depth  = 1024,
1126                .gainlkup       = ai_gain_6143,
1127                .ai_speed       = 4000,
1128                .reg_type       = ni_reg_6143,
1129                .caldac         = { ad8804_debug, ad8804_debug },
1130        },
1131        [BOARD_PXI6143] = {
1132                .name           = "pxi-6143",
1133                .n_adchan       = 8,
1134                .ai_maxdata     = 0xffff,
1135                .ai_fifo_depth  = 1024,
1136                .gainlkup       = ai_gain_6143,
1137                .ai_speed       = 4000,
1138                .reg_type       = ni_reg_6143,
1139                .caldac         = { ad8804_debug, ad8804_debug },
1140        },
1141};
1142
1143#include "ni_mio_common.c"
1144
1145static int pcimio_ai_change(struct comedi_device *dev,
1146                            struct comedi_subdevice *s)
1147{
1148        struct ni_private *devpriv = dev->private;
1149        int ret;
1150
1151        ret = mite_buf_change(devpriv->ai_mite_ring, s);
1152        if (ret < 0)
1153                return ret;
1154
1155        return 0;
1156}
1157
1158static int pcimio_ao_change(struct comedi_device *dev,
1159                            struct comedi_subdevice *s)
1160{
1161        struct ni_private *devpriv = dev->private;
1162        int ret;
1163
1164        ret = mite_buf_change(devpriv->ao_mite_ring, s);
1165        if (ret < 0)
1166                return ret;
1167
1168        return 0;
1169}
1170
1171static int pcimio_gpct0_change(struct comedi_device *dev,
1172                               struct comedi_subdevice *s)
1173{
1174        struct ni_private *devpriv = dev->private;
1175        int ret;
1176
1177        ret = mite_buf_change(devpriv->gpct_mite_ring[0], s);
1178        if (ret < 0)
1179                return ret;
1180
1181        return 0;
1182}
1183
1184static int pcimio_gpct1_change(struct comedi_device *dev,
1185                               struct comedi_subdevice *s)
1186{
1187        struct ni_private *devpriv = dev->private;
1188        int ret;
1189
1190        ret = mite_buf_change(devpriv->gpct_mite_ring[1], s);
1191        if (ret < 0)
1192                return ret;
1193
1194        return 0;
1195}
1196
1197static int pcimio_dio_change(struct comedi_device *dev,
1198                             struct comedi_subdevice *s)
1199{
1200        struct ni_private *devpriv = dev->private;
1201        int ret;
1202
1203        ret = mite_buf_change(devpriv->cdo_mite_ring, s);
1204        if (ret < 0)
1205                return ret;
1206
1207        return 0;
1208}
1209
1210static void m_series_init_eeprom_buffer(struct comedi_device *dev)
1211{
1212        struct ni_private *devpriv = dev->private;
1213        struct mite *mite = devpriv->mite;
1214        resource_size_t daq_phys_addr;
1215        static const int Start_Cal_EEPROM = 0x400;
1216        static const unsigned int window_size = 10;
1217        unsigned int old_iodwbsr_bits;
1218        unsigned int old_iodwbsr1_bits;
1219        unsigned int old_iodwcr1_bits;
1220        int i;
1221
1222        /* IO Window 1 needs to be temporarily mapped to read the eeprom */
1223        daq_phys_addr = pci_resource_start(mite->pcidev, 1);
1224
1225        old_iodwbsr_bits = readl(mite->mmio + MITE_IODWBSR);
1226        old_iodwbsr1_bits = readl(mite->mmio + MITE_IODWBSR_1);
1227        old_iodwcr1_bits = readl(mite->mmio + MITE_IODWCR_1);
1228        writel(0x0, mite->mmio + MITE_IODWBSR);
1229        writel(((0x80 | window_size) | daq_phys_addr),
1230               mite->mmio + MITE_IODWBSR_1);
1231        writel(0x1 | old_iodwcr1_bits, mite->mmio + MITE_IODWCR_1);
1232        writel(0xf, mite->mmio + 0x30);
1233
1234        for (i = 0; i < M_SERIES_EEPROM_SIZE; ++i)
1235                devpriv->eeprom_buffer[i] = ni_readb(dev, Start_Cal_EEPROM + i);
1236
1237        writel(old_iodwbsr1_bits, mite->mmio + MITE_IODWBSR_1);
1238        writel(old_iodwbsr_bits, mite->mmio + MITE_IODWBSR);
1239        writel(old_iodwcr1_bits, mite->mmio + MITE_IODWCR_1);
1240        writel(0x0, mite->mmio + 0x30);
1241}
1242
1243static void init_6143(struct comedi_device *dev)
1244{
1245        const struct ni_board_struct *board = dev->board_ptr;
1246        struct ni_private *devpriv = dev->private;
1247
1248        /*  Disable interrupts */
1249        ni_stc_writew(dev, 0, NISTC_INT_CTRL_REG);
1250
1251        /*  Initialise 6143 AI specific bits */
1252
1253        /* Set G0,G1 DMA mode to E series version */
1254        ni_writeb(dev, 0x00, NI6143_MAGIC_REG);
1255        /* Set EOCMode, ADCMode and pipelinedelay */
1256        ni_writeb(dev, 0x80, NI6143_PIPELINE_DELAY_REG);
1257        /* Set EOC Delay */
1258        ni_writeb(dev, 0x00, NI6143_EOC_SET_REG);
1259
1260        /* Set the FIFO half full level */
1261        ni_writel(dev, board->ai_fifo_depth / 2, NI6143_AI_FIFO_FLAG_REG);
1262
1263        /*  Strobe Relay disable bit */
1264        devpriv->ai_calib_source_enabled = 0;
1265        ni_writew(dev, devpriv->ai_calib_source | NI6143_CALIB_CHAN_RELAY_OFF,
1266                  NI6143_CALIB_CHAN_REG);
1267        ni_writew(dev, devpriv->ai_calib_source, NI6143_CALIB_CHAN_REG);
1268}
1269
1270static void pcimio_detach(struct comedi_device *dev)
1271{
1272        struct ni_private *devpriv = dev->private;
1273
1274        mio_common_detach(dev);
1275        if (dev->irq)
1276                free_irq(dev->irq, dev);
1277        if (devpriv) {
1278                mite_free_ring(devpriv->ai_mite_ring);
1279                mite_free_ring(devpriv->ao_mite_ring);
1280                mite_free_ring(devpriv->cdo_mite_ring);
1281                mite_free_ring(devpriv->gpct_mite_ring[0]);
1282                mite_free_ring(devpriv->gpct_mite_ring[1]);
1283                mite_detach(devpriv->mite);
1284        }
1285        if (dev->mmio)
1286                iounmap(dev->mmio);
1287        comedi_pci_disable(dev);
1288}
1289
1290static int pcimio_auto_attach(struct comedi_device *dev,
1291                              unsigned long context)
1292{
1293        struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1294        const struct ni_board_struct *board = NULL;
1295        struct ni_private *devpriv;
1296        unsigned int irq;
1297        int ret;
1298
1299        if (context < ARRAY_SIZE(ni_boards))
1300                board = &ni_boards[context];
1301        if (!board)
1302                return -ENODEV;
1303        dev->board_ptr = board;
1304        dev->board_name = board->name;
1305
1306        ret = comedi_pci_enable(dev);
1307        if (ret)
1308                return ret;
1309
1310        ret = ni_alloc_private(dev);
1311        if (ret)
1312                return ret;
1313        devpriv = dev->private;
1314
1315        devpriv->mite = mite_attach(dev, false);        /* use win0 */
1316        if (!devpriv->mite)
1317                return -ENOMEM;
1318
1319        if (board->reg_type & ni_reg_m_series_mask)
1320                devpriv->is_m_series = 1;
1321        if (board->reg_type & ni_reg_6xxx_mask)
1322                devpriv->is_6xxx = 1;
1323        if (board->reg_type == ni_reg_611x)
1324                devpriv->is_611x = 1;
1325        if (board->reg_type == ni_reg_6143)
1326                devpriv->is_6143 = 1;
1327        if (board->reg_type == ni_reg_622x)
1328                devpriv->is_622x = 1;
1329        if (board->reg_type == ni_reg_625x)
1330                devpriv->is_625x = 1;
1331        if (board->reg_type == ni_reg_628x)
1332                devpriv->is_628x = 1;
1333        if (board->reg_type & ni_reg_67xx_mask)
1334                devpriv->is_67xx = 1;
1335        if (board->reg_type == ni_reg_6711)
1336                devpriv->is_6711 = 1;
1337        if (board->reg_type == ni_reg_6713)
1338                devpriv->is_6713 = 1;
1339
1340        devpriv->ai_mite_ring = mite_alloc_ring(devpriv->mite);
1341        if (!devpriv->ai_mite_ring)
1342                return -ENOMEM;
1343        devpriv->ao_mite_ring = mite_alloc_ring(devpriv->mite);
1344        if (!devpriv->ao_mite_ring)
1345                return -ENOMEM;
1346        devpriv->cdo_mite_ring = mite_alloc_ring(devpriv->mite);
1347        if (!devpriv->cdo_mite_ring)
1348                return -ENOMEM;
1349        devpriv->gpct_mite_ring[0] = mite_alloc_ring(devpriv->mite);
1350        if (!devpriv->gpct_mite_ring[0])
1351                return -ENOMEM;
1352        devpriv->gpct_mite_ring[1] = mite_alloc_ring(devpriv->mite);
1353        if (!devpriv->gpct_mite_ring[1])
1354                return -ENOMEM;
1355
1356        if (devpriv->is_m_series)
1357                m_series_init_eeprom_buffer(dev);
1358        if (devpriv->is_6143)
1359                init_6143(dev);
1360
1361        irq = pcidev->irq;
1362        if (irq) {
1363                ret = request_irq(irq, ni_E_interrupt, IRQF_SHARED,
1364                                  dev->board_name, dev);
1365                if (ret == 0)
1366                        dev->irq = irq;
1367        }
1368
1369        ret = ni_E_init(dev, 0, 1);
1370        if (ret < 0)
1371                return ret;
1372
1373        dev->subdevices[NI_AI_SUBDEV].buf_change = &pcimio_ai_change;
1374        dev->subdevices[NI_AO_SUBDEV].buf_change = &pcimio_ao_change;
1375        dev->subdevices[NI_GPCT_SUBDEV(0)].buf_change = &pcimio_gpct0_change;
1376        dev->subdevices[NI_GPCT_SUBDEV(1)].buf_change = &pcimio_gpct1_change;
1377        dev->subdevices[NI_DIO_SUBDEV].buf_change = &pcimio_dio_change;
1378
1379        return 0;
1380}
1381
1382static struct comedi_driver ni_pcimio_driver = {
1383        .driver_name    = "ni_pcimio",
1384        .module         = THIS_MODULE,
1385        .auto_attach    = pcimio_auto_attach,
1386        .detach         = pcimio_detach,
1387};
1388
1389static int ni_pcimio_pci_probe(struct pci_dev *dev,
1390                               const struct pci_device_id *id)
1391{
1392        return comedi_pci_auto_config(dev, &ni_pcimio_driver, id->driver_data);
1393}
1394
1395static const struct pci_device_id ni_pcimio_pci_table[] = {
1396        { PCI_VDEVICE(NI, 0x0162), BOARD_PCIMIO_16XE_50 },      /* 0x1620? */
1397        { PCI_VDEVICE(NI, 0x1170), BOARD_PCIMIO_16XE_10 },
1398        { PCI_VDEVICE(NI, 0x1180), BOARD_PCIMIO_16E_1 },
1399        { PCI_VDEVICE(NI, 0x1190), BOARD_PCIMIO_16E_4 },
1400        { PCI_VDEVICE(NI, 0x11b0), BOARD_PXI6070E },
1401        { PCI_VDEVICE(NI, 0x11c0), BOARD_PXI6040E },
1402        { PCI_VDEVICE(NI, 0x11d0), BOARD_PXI6030E },
1403        { PCI_VDEVICE(NI, 0x1270), BOARD_PCI6032E },
1404        { PCI_VDEVICE(NI, 0x1330), BOARD_PCI6031E },
1405        { PCI_VDEVICE(NI, 0x1340), BOARD_PCI6033E },
1406        { PCI_VDEVICE(NI, 0x1350), BOARD_PCI6071E },
1407        { PCI_VDEVICE(NI, 0x14e0), BOARD_PCI6110 },
1408        { PCI_VDEVICE(NI, 0x14f0), BOARD_PCI6111 },
1409        { PCI_VDEVICE(NI, 0x1580), BOARD_PXI6031E },
1410        { PCI_VDEVICE(NI, 0x15b0), BOARD_PXI6071E },
1411        { PCI_VDEVICE(NI, 0x1880), BOARD_PCI6711 },
1412        { PCI_VDEVICE(NI, 0x1870), BOARD_PCI6713 },
1413        { PCI_VDEVICE(NI, 0x18b0), BOARD_PCI6052E },
1414        { PCI_VDEVICE(NI, 0x18c0), BOARD_PXI6052E },
1415        { PCI_VDEVICE(NI, 0x2410), BOARD_PCI6733 },
1416        { PCI_VDEVICE(NI, 0x2420), BOARD_PXI6733 },
1417        { PCI_VDEVICE(NI, 0x2430), BOARD_PCI6731 },
1418        { PCI_VDEVICE(NI, 0x2890), BOARD_PCI6036E },
1419        { PCI_VDEVICE(NI, 0x28c0), BOARD_PCI6014 },
1420        { PCI_VDEVICE(NI, 0x2a60), BOARD_PCI6023E },
1421        { PCI_VDEVICE(NI, 0x2a70), BOARD_PCI6024E },
1422        { PCI_VDEVICE(NI, 0x2a80), BOARD_PCI6025E },
1423        { PCI_VDEVICE(NI, 0x2ab0), BOARD_PXI6025E },
1424        { PCI_VDEVICE(NI, 0x2b80), BOARD_PXI6713 },
1425        { PCI_VDEVICE(NI, 0x2b90), BOARD_PXI6711 },
1426        { PCI_VDEVICE(NI, 0x2c80), BOARD_PCI6035E },
1427        { PCI_VDEVICE(NI, 0x2ca0), BOARD_PCI6034E },
1428        { PCI_VDEVICE(NI, 0x70aa), BOARD_PCI6229 },
1429        { PCI_VDEVICE(NI, 0x70ab), BOARD_PCI6259 },
1430        { PCI_VDEVICE(NI, 0x70ac), BOARD_PCI6289 },
1431        { PCI_VDEVICE(NI, 0x70ad), BOARD_PXI6251 },
1432        { PCI_VDEVICE(NI, 0x70ae), BOARD_PXI6220 },
1433        { PCI_VDEVICE(NI, 0x70af), BOARD_PCI6221 },
1434        { PCI_VDEVICE(NI, 0x70b0), BOARD_PCI6220 },
1435        { PCI_VDEVICE(NI, 0x70b1), BOARD_PXI6229 },
1436        { PCI_VDEVICE(NI, 0x70b2), BOARD_PXI6259 },
1437        { PCI_VDEVICE(NI, 0x70b3), BOARD_PXI6289 },
1438        { PCI_VDEVICE(NI, 0x70b4), BOARD_PCI6250 },
1439        { PCI_VDEVICE(NI, 0x70b5), BOARD_PXI6221 },
1440        { PCI_VDEVICE(NI, 0x70b6), BOARD_PCI6280 },
1441        { PCI_VDEVICE(NI, 0x70b7), BOARD_PCI6254 },
1442        { PCI_VDEVICE(NI, 0x70b8), BOARD_PCI6251 },
1443        { PCI_VDEVICE(NI, 0x70b9), BOARD_PXI6250 },
1444        { PCI_VDEVICE(NI, 0x70ba), BOARD_PXI6254 },
1445        { PCI_VDEVICE(NI, 0x70bb), BOARD_PXI6280 },
1446        { PCI_VDEVICE(NI, 0x70bc), BOARD_PCI6284 },
1447        { PCI_VDEVICE(NI, 0x70bd), BOARD_PCI6281 },
1448        { PCI_VDEVICE(NI, 0x70be), BOARD_PXI6284 },
1449        { PCI_VDEVICE(NI, 0x70bf), BOARD_PXI6281 },
1450        { PCI_VDEVICE(NI, 0x70c0), BOARD_PCI6143 },
1451        { PCI_VDEVICE(NI, 0x70f2), BOARD_PCI6224 },
1452        { PCI_VDEVICE(NI, 0x70f3), BOARD_PXI6224 },
1453        { PCI_VDEVICE(NI, 0x710d), BOARD_PXI6143 },
1454        { PCI_VDEVICE(NI, 0x716c), BOARD_PCI6225 },
1455        { PCI_VDEVICE(NI, 0x716d), BOARD_PXI6225 },
1456        { PCI_VDEVICE(NI, 0x717d), BOARD_PCIE6251 },
1457        { PCI_VDEVICE(NI, 0x717f), BOARD_PCIE6259 },
1458        { PCI_VDEVICE(NI, 0x71bc), BOARD_PCI6221_37PIN },
1459        { PCI_VDEVICE(NI, 0x72e8), BOARD_PXIE6251 },
1460        { PCI_VDEVICE(NI, 0x72e9), BOARD_PXIE6259 },
1461        { 0 }
1462};
1463MODULE_DEVICE_TABLE(pci, ni_pcimio_pci_table);
1464
1465static struct pci_driver ni_pcimio_pci_driver = {
1466        .name           = "ni_pcimio",
1467        .id_table       = ni_pcimio_pci_table,
1468        .probe          = ni_pcimio_pci_probe,
1469        .remove         = comedi_pci_auto_unconfig,
1470};
1471module_comedi_pci_driver(ni_pcimio_driver, ni_pcimio_pci_driver);
1472
1473MODULE_AUTHOR("Comedi http://www.comedi.org");
1474MODULE_DESCRIPTION("Comedi low-level driver");
1475MODULE_LICENSE("GPL");
1476