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