linux/drivers/staging/comedi/drivers/ni_mio_common.c
<<
>>
Prefs
   1/*
   2    comedi/drivers/ni_mio_common.c
   3    Hardware driver for DAQ-STC based boards
   4
   5    COMEDI - Linux Control and Measurement Device Interface
   6    Copyright (C) 1997-2001 David A. Schleef <ds@schleef.org>
   7    Copyright (C) 2002-2006 Frank Mori Hess <fmhess@users.sourceforge.net>
   8
   9    This program is free software; you can redistribute it and/or modify
  10    it under the terms of the GNU General Public License as published by
  11    the Free Software Foundation; either version 2 of the License, or
  12    (at your option) any later version.
  13
  14    This program is distributed in the hope that it will be useful,
  15    but WITHOUT ANY WARRANTY; without even the implied warranty of
  16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17    GNU General Public License for more details.
  18
  19    You should have received a copy of the GNU General Public License
  20    along with this program; if not, write to the Free Software
  21    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22
  23*/
  24
  25/*
  26        This file is meant to be included by another file, e.g.,
  27        ni_atmio.c or ni_pcimio.c.
  28
  29        Interrupt support originally added by Truxton Fulton
  30        <trux@truxton.com>
  31
  32        References (from ftp://ftp.natinst.com/support/manuals):
  33
  34           340747b.pdf  AT-MIO E series Register Level Programmer Manual
  35           341079b.pdf  PCI E Series RLPM
  36           340934b.pdf  DAQ-STC reference manual
  37        67xx and 611x registers (from http://www.ni.com/pdf/daq/us)
  38        release_ni611x.pdf
  39        release_ni67xx.pdf
  40        Other possibly relevant info:
  41
  42           320517c.pdf  User manual (obsolete)
  43           320517f.pdf  User manual (new)
  44           320889a.pdf  delete
  45           320906c.pdf  maximum signal ratings
  46           321066a.pdf  about 16x
  47           321791a.pdf  discontinuation of at-mio-16e-10 rev. c
  48           321808a.pdf  about at-mio-16e-10 rev P
  49           321837a.pdf  discontinuation of at-mio-16de-10 rev d
  50           321838a.pdf  about at-mio-16de-10 rev N
  51
  52        ISSUES:
  53
  54         - the interrupt routine needs to be cleaned up
  55
  56        2006-02-07: S-Series PCI-6143: Support has been added but is not
  57                fully tested as yet. Terry Barnaby, BEAM Ltd.
  58*/
  59
  60/* #define DEBUG_INTERRUPT */
  61/* #define DEBUG_STATUS_A */
  62/* #define DEBUG_STATUS_B */
  63
  64#include <linux/interrupt.h>
  65#include <linux/sched.h>
  66#include "8255.h"
  67#include "mite.h"
  68#include "comedi_fc.h"
  69
  70#ifndef MDPRINTK
  71#define MDPRINTK(format, args...)
  72#endif
  73
  74/* A timeout count */
  75#define NI_TIMEOUT 1000
  76static const unsigned old_RTSI_clock_channel = 7;
  77
  78/* Note: this table must match the ai_gain_* definitions */
  79static const short ni_gainlkup[][16] = {
  80        [ai_gain_16] = {0, 1, 2, 3, 4, 5, 6, 7,
  81                        0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107},
  82        [ai_gain_8] = {1, 2, 4, 7, 0x101, 0x102, 0x104, 0x107},
  83        [ai_gain_14] = {1, 2, 3, 4, 5, 6, 7,
  84                        0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107},
  85        [ai_gain_4] = {0, 1, 4, 7},
  86        [ai_gain_611x] = {0x00a, 0x00b, 0x001, 0x002,
  87                          0x003, 0x004, 0x005, 0x006},
  88        [ai_gain_622x] = {0, 1, 4, 5},
  89        [ai_gain_628x] = {1, 2, 3, 4, 5, 6, 7},
  90        [ai_gain_6143] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  91};
  92
  93static const struct comedi_lrange range_ni_E_ai = { 16, {
  94                                                         RANGE(-10, 10),
  95                                                         RANGE(-5, 5),
  96                                                         RANGE(-2.5, 2.5),
  97                                                         RANGE(-1, 1),
  98                                                         RANGE(-0.5, 0.5),
  99                                                         RANGE(-0.25, 0.25),
 100                                                         RANGE(-0.1, 0.1),
 101                                                         RANGE(-0.05, 0.05),
 102                                                         RANGE(0, 20),
 103                                                         RANGE(0, 10),
 104                                                         RANGE(0, 5),
 105                                                         RANGE(0, 2),
 106                                                         RANGE(0, 1),
 107                                                         RANGE(0, 0.5),
 108                                                         RANGE(0, 0.2),
 109                                                         RANGE(0, 0.1),
 110                                                         }
 111};
 112
 113static const struct comedi_lrange range_ni_E_ai_limited = { 8, {
 114                                                                RANGE(-10, 10),
 115                                                                RANGE(-5, 5),
 116                                                                RANGE(-1, 1),
 117                                                                RANGE(-0.1,
 118                                                                      0.1),
 119                                                                RANGE(0, 10),
 120                                                                RANGE(0, 5),
 121                                                                RANGE(0, 1),
 122                                                                RANGE(0, 0.1),
 123                                                                }
 124};
 125
 126static const struct comedi_lrange range_ni_E_ai_limited14 = { 14, {
 127                                                                   RANGE(-10,
 128                                                                         10),
 129                                                                   RANGE(-5, 5),
 130                                                                   RANGE(-2, 2),
 131                                                                   RANGE(-1, 1),
 132                                                                   RANGE(-0.5,
 133                                                                         0.5),
 134                                                                   RANGE(-0.2,
 135                                                                         0.2),
 136                                                                   RANGE(-0.1,
 137                                                                         0.1),
 138                                                                   RANGE(0, 10),
 139                                                                   RANGE(0, 5),
 140                                                                   RANGE(0, 2),
 141                                                                   RANGE(0, 1),
 142                                                                   RANGE(0,
 143                                                                         0.5),
 144                                                                   RANGE(0,
 145                                                                         0.2),
 146                                                                   RANGE(0,
 147                                                                         0.1),
 148                                                                   }
 149};
 150
 151static const struct comedi_lrange range_ni_E_ai_bipolar4 = { 4, {
 152                                                                 RANGE(-10, 10),
 153                                                                 RANGE(-5, 5),
 154                                                                 RANGE(-0.5,
 155                                                                       0.5),
 156                                                                 RANGE(-0.05,
 157                                                                       0.05),
 158                                                                 }
 159};
 160
 161static const struct comedi_lrange range_ni_E_ai_611x = { 8, {
 162                                                             RANGE(-50, 50),
 163                                                             RANGE(-20, 20),
 164                                                             RANGE(-10, 10),
 165                                                             RANGE(-5, 5),
 166                                                             RANGE(-2, 2),
 167                                                             RANGE(-1, 1),
 168                                                             RANGE(-0.5, 0.5),
 169                                                             RANGE(-0.2, 0.2),
 170                                                             }
 171};
 172
 173static const struct comedi_lrange range_ni_M_ai_622x = { 4, {
 174                                                             RANGE(-10, 10),
 175                                                             RANGE(-5, 5),
 176                                                             RANGE(-1, 1),
 177                                                             RANGE(-0.2, 0.2),
 178                                                             }
 179};
 180
 181static const struct comedi_lrange range_ni_M_ai_628x = { 7, {
 182                                                             RANGE(-10, 10),
 183                                                             RANGE(-5, 5),
 184                                                             RANGE(-2, 2),
 185                                                             RANGE(-1, 1),
 186                                                             RANGE(-0.5, 0.5),
 187                                                             RANGE(-0.2, 0.2),
 188                                                             RANGE(-0.1, 0.1),
 189                                                             }
 190};
 191
 192static const struct comedi_lrange range_ni_S_ai_6143 = { 1, {
 193                                                             RANGE(-5, +5),
 194                                                             }
 195};
 196
 197static const struct comedi_lrange range_ni_E_ao_ext = { 4, {
 198                                                            RANGE(-10, 10),
 199                                                            RANGE(0, 10),
 200                                                            RANGE_ext(-1, 1),
 201                                                            RANGE_ext(0, 1),
 202                                                            }
 203};
 204
 205static const struct comedi_lrange *const ni_range_lkup[] = {
 206        [ai_gain_16] = &range_ni_E_ai,
 207        [ai_gain_8] = &range_ni_E_ai_limited,
 208        [ai_gain_14] = &range_ni_E_ai_limited14,
 209        [ai_gain_4] = &range_ni_E_ai_bipolar4,
 210        [ai_gain_611x] = &range_ni_E_ai_611x,
 211        [ai_gain_622x] = &range_ni_M_ai_622x,
 212        [ai_gain_628x] = &range_ni_M_ai_628x,
 213        [ai_gain_6143] = &range_ni_S_ai_6143
 214};
 215
 216static int ni_dio_insn_config(struct comedi_device *dev,
 217                              struct comedi_subdevice *s,
 218                              struct comedi_insn *insn, unsigned int *data);
 219static int ni_dio_insn_bits(struct comedi_device *dev,
 220                            struct comedi_subdevice *s,
 221                            struct comedi_insn *insn, unsigned int *data);
 222static int ni_cdio_cmdtest(struct comedi_device *dev,
 223                           struct comedi_subdevice *s, struct comedi_cmd *cmd);
 224static int ni_cdio_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
 225static int ni_cdio_cancel(struct comedi_device *dev,
 226                          struct comedi_subdevice *s);
 227static void handle_cdio_interrupt(struct comedi_device *dev);
 228static int ni_cdo_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
 229                          unsigned int trignum);
 230
 231static int ni_serial_insn_config(struct comedi_device *dev,
 232                                 struct comedi_subdevice *s,
 233                                 struct comedi_insn *insn, unsigned int *data);
 234static int ni_serial_hw_readwrite8(struct comedi_device *dev,
 235                                   struct comedi_subdevice *s,
 236                                   unsigned char data_out,
 237                                   unsigned char *data_in);
 238static int ni_serial_sw_readwrite8(struct comedi_device *dev,
 239                                   struct comedi_subdevice *s,
 240                                   unsigned char data_out,
 241                                   unsigned char *data_in);
 242
 243static int ni_calib_insn_read(struct comedi_device *dev,
 244                              struct comedi_subdevice *s,
 245                              struct comedi_insn *insn, unsigned int *data);
 246static int ni_calib_insn_write(struct comedi_device *dev,
 247                               struct comedi_subdevice *s,
 248                               struct comedi_insn *insn, unsigned int *data);
 249
 250static int ni_eeprom_insn_read(struct comedi_device *dev,
 251                               struct comedi_subdevice *s,
 252                               struct comedi_insn *insn, unsigned int *data);
 253static int ni_m_series_eeprom_insn_read(struct comedi_device *dev,
 254                                        struct comedi_subdevice *s,
 255                                        struct comedi_insn *insn,
 256                                        unsigned int *data);
 257
 258static int ni_pfi_insn_bits(struct comedi_device *dev,
 259                            struct comedi_subdevice *s,
 260                            struct comedi_insn *insn, unsigned int *data);
 261static int ni_pfi_insn_config(struct comedi_device *dev,
 262                              struct comedi_subdevice *s,
 263                              struct comedi_insn *insn, unsigned int *data);
 264static unsigned ni_old_get_pfi_routing(struct comedi_device *dev,
 265                                       unsigned chan);
 266
 267static void ni_rtsi_init(struct comedi_device *dev);
 268static int ni_rtsi_insn_bits(struct comedi_device *dev,
 269                             struct comedi_subdevice *s,
 270                             struct comedi_insn *insn, unsigned int *data);
 271static int ni_rtsi_insn_config(struct comedi_device *dev,
 272                               struct comedi_subdevice *s,
 273                               struct comedi_insn *insn, unsigned int *data);
 274
 275static void caldac_setup(struct comedi_device *dev, struct comedi_subdevice *s);
 276static int ni_read_eeprom(struct comedi_device *dev, int addr);
 277
 278#ifdef DEBUG_STATUS_A
 279static void ni_mio_print_status_a(int status);
 280#else
 281#define ni_mio_print_status_a(a)
 282#endif
 283#ifdef DEBUG_STATUS_B
 284static void ni_mio_print_status_b(int status);
 285#else
 286#define ni_mio_print_status_b(a)
 287#endif
 288
 289static int ni_ai_reset(struct comedi_device *dev, struct comedi_subdevice *s);
 290#ifndef PCIDMA
 291static void ni_handle_fifo_half_full(struct comedi_device *dev);
 292static int ni_ao_fifo_half_empty(struct comedi_device *dev,
 293                                 struct comedi_subdevice *s);
 294#endif
 295static void ni_handle_fifo_dregs(struct comedi_device *dev);
 296static int ni_ai_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
 297                         unsigned int trignum);
 298static void ni_load_channelgain_list(struct comedi_device *dev,
 299                                     unsigned int n_chan, unsigned int *list);
 300static void shutdown_ai_command(struct comedi_device *dev);
 301
 302static int ni_ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
 303                         unsigned int trignum);
 304
 305static int ni_ao_reset(struct comedi_device *dev, struct comedi_subdevice *s);
 306
 307static int ni_8255_callback(int dir, int port, int data, unsigned long arg);
 308
 309static int ni_gpct_insn_write(struct comedi_device *dev,
 310                              struct comedi_subdevice *s,
 311                              struct comedi_insn *insn, unsigned int *data);
 312static int ni_gpct_insn_read(struct comedi_device *dev,
 313                             struct comedi_subdevice *s,
 314                             struct comedi_insn *insn, unsigned int *data);
 315static int ni_gpct_insn_config(struct comedi_device *dev,
 316                               struct comedi_subdevice *s,
 317                               struct comedi_insn *insn, unsigned int *data);
 318static int ni_gpct_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
 319static int ni_gpct_cmdtest(struct comedi_device *dev,
 320                           struct comedi_subdevice *s, struct comedi_cmd *cmd);
 321static int ni_gpct_cancel(struct comedi_device *dev,
 322                          struct comedi_subdevice *s);
 323static void handle_gpct_interrupt(struct comedi_device *dev,
 324                                  unsigned short counter_index);
 325
 326static int init_cs5529(struct comedi_device *dev);
 327static int cs5529_do_conversion(struct comedi_device *dev,
 328                                unsigned short *data);
 329static int cs5529_ai_insn_read(struct comedi_device *dev,
 330                               struct comedi_subdevice *s,
 331                               struct comedi_insn *insn, unsigned int *data);
 332#ifdef NI_CS5529_DEBUG
 333static unsigned int cs5529_config_read(struct comedi_device *dev,
 334                                       unsigned int reg_select_bits);
 335#endif
 336static void cs5529_config_write(struct comedi_device *dev, unsigned int value,
 337                                unsigned int reg_select_bits);
 338
 339static int ni_m_series_pwm_config(struct comedi_device *dev,
 340                                  struct comedi_subdevice *s,
 341                                  struct comedi_insn *insn, unsigned int *data);
 342static int ni_6143_pwm_config(struct comedi_device *dev,
 343                              struct comedi_subdevice *s,
 344                              struct comedi_insn *insn, unsigned int *data);
 345
 346static int ni_set_master_clock(struct comedi_device *dev, unsigned source,
 347                               unsigned period_ns);
 348static void ack_a_interrupt(struct comedi_device *dev, unsigned short a_status);
 349static void ack_b_interrupt(struct comedi_device *dev, unsigned short b_status);
 350
 351enum aimodes {
 352        AIMODE_NONE = 0,
 353        AIMODE_HALF_FULL = 1,
 354        AIMODE_SCAN = 2,
 355        AIMODE_SAMPLE = 3,
 356};
 357
 358enum ni_common_subdevices {
 359        NI_AI_SUBDEV,
 360        NI_AO_SUBDEV,
 361        NI_DIO_SUBDEV,
 362        NI_8255_DIO_SUBDEV,
 363        NI_UNUSED_SUBDEV,
 364        NI_CALIBRATION_SUBDEV,
 365        NI_EEPROM_SUBDEV,
 366        NI_PFI_DIO_SUBDEV,
 367        NI_CS5529_CALIBRATION_SUBDEV,
 368        NI_SERIAL_SUBDEV,
 369        NI_RTSI_SUBDEV,
 370        NI_GPCT0_SUBDEV,
 371        NI_GPCT1_SUBDEV,
 372        NI_FREQ_OUT_SUBDEV,
 373        NI_NUM_SUBDEVICES
 374};
 375static inline unsigned NI_GPCT_SUBDEV(unsigned counter_index)
 376{
 377        switch (counter_index) {
 378        case 0:
 379                return NI_GPCT0_SUBDEV;
 380                break;
 381        case 1:
 382                return NI_GPCT1_SUBDEV;
 383                break;
 384        default:
 385                break;
 386        }
 387        BUG();
 388        return NI_GPCT0_SUBDEV;
 389}
 390
 391enum timebase_nanoseconds {
 392        TIMEBASE_1_NS = 50,
 393        TIMEBASE_2_NS = 10000
 394};
 395
 396#define SERIAL_DISABLED         0
 397#define SERIAL_600NS            600
 398#define SERIAL_1_2US            1200
 399#define SERIAL_10US                     10000
 400
 401static const int num_adc_stages_611x = 3;
 402
 403static void handle_a_interrupt(struct comedi_device *dev, unsigned short status,
 404                               unsigned ai_mite_status);
 405static void handle_b_interrupt(struct comedi_device *dev, unsigned short status,
 406                               unsigned ao_mite_status);
 407static void get_last_sample_611x(struct comedi_device *dev);
 408static void get_last_sample_6143(struct comedi_device *dev);
 409
 410static inline void ni_set_bitfield(struct comedi_device *dev, int reg,
 411                                   unsigned bit_mask, unsigned bit_values)
 412{
 413        unsigned long flags;
 414
 415        spin_lock_irqsave(&devpriv->soft_reg_copy_lock, flags);
 416        switch (reg) {
 417        case Interrupt_A_Enable_Register:
 418                devpriv->int_a_enable_reg &= ~bit_mask;
 419                devpriv->int_a_enable_reg |= bit_values & bit_mask;
 420                devpriv->stc_writew(dev, devpriv->int_a_enable_reg,
 421                                    Interrupt_A_Enable_Register);
 422                break;
 423        case Interrupt_B_Enable_Register:
 424                devpriv->int_b_enable_reg &= ~bit_mask;
 425                devpriv->int_b_enable_reg |= bit_values & bit_mask;
 426                devpriv->stc_writew(dev, devpriv->int_b_enable_reg,
 427                                    Interrupt_B_Enable_Register);
 428                break;
 429        case IO_Bidirection_Pin_Register:
 430                devpriv->io_bidirection_pin_reg &= ~bit_mask;
 431                devpriv->io_bidirection_pin_reg |= bit_values & bit_mask;
 432                devpriv->stc_writew(dev, devpriv->io_bidirection_pin_reg,
 433                                    IO_Bidirection_Pin_Register);
 434                break;
 435        case AI_AO_Select:
 436                devpriv->ai_ao_select_reg &= ~bit_mask;
 437                devpriv->ai_ao_select_reg |= bit_values & bit_mask;
 438                ni_writeb(devpriv->ai_ao_select_reg, AI_AO_Select);
 439                break;
 440        case G0_G1_Select:
 441                devpriv->g0_g1_select_reg &= ~bit_mask;
 442                devpriv->g0_g1_select_reg |= bit_values & bit_mask;
 443                ni_writeb(devpriv->g0_g1_select_reg, G0_G1_Select);
 444                break;
 445        default:
 446                printk("Warning %s() called with invalid register\n", __func__);
 447                printk("reg is %d\n", reg);
 448                break;
 449        }
 450        mmiowb();
 451        spin_unlock_irqrestore(&devpriv->soft_reg_copy_lock, flags);
 452}
 453
 454#ifdef PCIDMA
 455static int ni_ai_drain_dma(struct comedi_device *dev);
 456
 457/* DMA channel setup */
 458
 459/* negative channel means no channel */
 460static inline void ni_set_ai_dma_channel(struct comedi_device *dev, int channel)
 461{
 462        unsigned bitfield;
 463
 464        if (channel >= 0) {
 465                bitfield =
 466                    (ni_stc_dma_channel_select_bitfield(channel) <<
 467                     AI_DMA_Select_Shift) & AI_DMA_Select_Mask;
 468        } else {
 469                bitfield = 0;
 470        }
 471        ni_set_bitfield(dev, AI_AO_Select, AI_DMA_Select_Mask, bitfield);
 472}
 473
 474/* negative channel means no channel */
 475static inline void ni_set_ao_dma_channel(struct comedi_device *dev, int channel)
 476{
 477        unsigned bitfield;
 478
 479        if (channel >= 0) {
 480                bitfield =
 481                    (ni_stc_dma_channel_select_bitfield(channel) <<
 482                     AO_DMA_Select_Shift) & AO_DMA_Select_Mask;
 483        } else {
 484                bitfield = 0;
 485        }
 486        ni_set_bitfield(dev, AI_AO_Select, AO_DMA_Select_Mask, bitfield);
 487}
 488
 489/* negative mite_channel means no channel */
 490static inline void ni_set_gpct_dma_channel(struct comedi_device *dev,
 491                                           unsigned gpct_index,
 492                                           int mite_channel)
 493{
 494        unsigned bitfield;
 495
 496        if (mite_channel >= 0) {
 497                bitfield = GPCT_DMA_Select_Bits(gpct_index, mite_channel);
 498        } else {
 499                bitfield = 0;
 500        }
 501        ni_set_bitfield(dev, G0_G1_Select, GPCT_DMA_Select_Mask(gpct_index),
 502                        bitfield);
 503}
 504
 505/* negative mite_channel means no channel */
 506static inline void ni_set_cdo_dma_channel(struct comedi_device *dev,
 507                                          int mite_channel)
 508{
 509        unsigned long flags;
 510
 511        spin_lock_irqsave(&devpriv->soft_reg_copy_lock, flags);
 512        devpriv->cdio_dma_select_reg &= ~CDO_DMA_Select_Mask;
 513        if (mite_channel >= 0) {
 514                /*XXX just guessing ni_stc_dma_channel_select_bitfield() returns the right bits,
 515                   under the assumption the cdio dma selection works just like ai/ao/gpct.
 516                   Definitely works for dma channels 0 and 1. */
 517                devpriv->cdio_dma_select_reg |=
 518                    (ni_stc_dma_channel_select_bitfield(mite_channel) <<
 519                     CDO_DMA_Select_Shift) & CDO_DMA_Select_Mask;
 520        }
 521        ni_writeb(devpriv->cdio_dma_select_reg, M_Offset_CDIO_DMA_Select);
 522        mmiowb();
 523        spin_unlock_irqrestore(&devpriv->soft_reg_copy_lock, flags);
 524}
 525
 526static int ni_request_ai_mite_channel(struct comedi_device *dev)
 527{
 528        unsigned long flags;
 529
 530        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 531        BUG_ON(devpriv->ai_mite_chan);
 532        devpriv->ai_mite_chan =
 533            mite_request_channel(devpriv->mite, devpriv->ai_mite_ring);
 534        if (devpriv->ai_mite_chan == NULL) {
 535                spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 536                comedi_error(dev,
 537                             "failed to reserve mite dma channel for analog input.");
 538                return -EBUSY;
 539        }
 540        devpriv->ai_mite_chan->dir = COMEDI_INPUT;
 541        ni_set_ai_dma_channel(dev, devpriv->ai_mite_chan->channel);
 542        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 543        return 0;
 544}
 545
 546static int ni_request_ao_mite_channel(struct comedi_device *dev)
 547{
 548        unsigned long flags;
 549
 550        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 551        BUG_ON(devpriv->ao_mite_chan);
 552        devpriv->ao_mite_chan =
 553            mite_request_channel(devpriv->mite, devpriv->ao_mite_ring);
 554        if (devpriv->ao_mite_chan == NULL) {
 555                spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 556                comedi_error(dev,
 557                             "failed to reserve mite dma channel for analog outut.");
 558                return -EBUSY;
 559        }
 560        devpriv->ao_mite_chan->dir = COMEDI_OUTPUT;
 561        ni_set_ao_dma_channel(dev, devpriv->ao_mite_chan->channel);
 562        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 563        return 0;
 564}
 565
 566static int ni_request_gpct_mite_channel(struct comedi_device *dev,
 567                                        unsigned gpct_index,
 568                                        enum comedi_io_direction direction)
 569{
 570        unsigned long flags;
 571        struct mite_channel *mite_chan;
 572
 573        BUG_ON(gpct_index >= NUM_GPCT);
 574        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 575        BUG_ON(devpriv->counter_dev->counters[gpct_index].mite_chan);
 576        mite_chan =
 577            mite_request_channel(devpriv->mite,
 578                                 devpriv->gpct_mite_ring[gpct_index]);
 579        if (mite_chan == NULL) {
 580                spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 581                comedi_error(dev,
 582                             "failed to reserve mite dma channel for counter.");
 583                return -EBUSY;
 584        }
 585        mite_chan->dir = direction;
 586        ni_tio_set_mite_channel(&devpriv->counter_dev->counters[gpct_index],
 587                                mite_chan);
 588        ni_set_gpct_dma_channel(dev, gpct_index, mite_chan->channel);
 589        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 590        return 0;
 591}
 592
 593#endif /*  PCIDMA */
 594
 595static int ni_request_cdo_mite_channel(struct comedi_device *dev)
 596{
 597#ifdef PCIDMA
 598        unsigned long flags;
 599
 600        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 601        BUG_ON(devpriv->cdo_mite_chan);
 602        devpriv->cdo_mite_chan =
 603            mite_request_channel(devpriv->mite, devpriv->cdo_mite_ring);
 604        if (devpriv->cdo_mite_chan == NULL) {
 605                spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 606                comedi_error(dev,
 607                             "failed to reserve mite dma channel for correlated digital outut.");
 608                return -EBUSY;
 609        }
 610        devpriv->cdo_mite_chan->dir = COMEDI_OUTPUT;
 611        ni_set_cdo_dma_channel(dev, devpriv->cdo_mite_chan->channel);
 612        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 613#endif /*  PCIDMA */
 614        return 0;
 615}
 616
 617static void ni_release_ai_mite_channel(struct comedi_device *dev)
 618{
 619#ifdef PCIDMA
 620        unsigned long flags;
 621
 622        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 623        if (devpriv->ai_mite_chan) {
 624                ni_set_ai_dma_channel(dev, -1);
 625                mite_release_channel(devpriv->ai_mite_chan);
 626                devpriv->ai_mite_chan = NULL;
 627        }
 628        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 629#endif /*  PCIDMA */
 630}
 631
 632static void ni_release_ao_mite_channel(struct comedi_device *dev)
 633{
 634#ifdef PCIDMA
 635        unsigned long flags;
 636
 637        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 638        if (devpriv->ao_mite_chan) {
 639                ni_set_ao_dma_channel(dev, -1);
 640                mite_release_channel(devpriv->ao_mite_chan);
 641                devpriv->ao_mite_chan = NULL;
 642        }
 643        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 644#endif /*  PCIDMA */
 645}
 646
 647void ni_release_gpct_mite_channel(struct comedi_device *dev,
 648                                  unsigned gpct_index)
 649{
 650#ifdef PCIDMA
 651        unsigned long flags;
 652
 653        BUG_ON(gpct_index >= NUM_GPCT);
 654        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 655        if (devpriv->counter_dev->counters[gpct_index].mite_chan) {
 656                struct mite_channel *mite_chan =
 657                    devpriv->counter_dev->counters[gpct_index].mite_chan;
 658
 659                ni_set_gpct_dma_channel(dev, gpct_index, -1);
 660                ni_tio_set_mite_channel(&devpriv->
 661                                        counter_dev->counters[gpct_index],
 662                                        NULL);
 663                mite_release_channel(mite_chan);
 664        }
 665        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 666#endif /*  PCIDMA */
 667}
 668
 669static void ni_release_cdo_mite_channel(struct comedi_device *dev)
 670{
 671#ifdef PCIDMA
 672        unsigned long flags;
 673
 674        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 675        if (devpriv->cdo_mite_chan) {
 676                ni_set_cdo_dma_channel(dev, -1);
 677                mite_release_channel(devpriv->cdo_mite_chan);
 678                devpriv->cdo_mite_chan = NULL;
 679        }
 680        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 681#endif /*  PCIDMA */
 682}
 683
 684/* e-series boards use the second irq signals to generate dma requests for their counters */
 685#ifdef PCIDMA
 686static void ni_e_series_enable_second_irq(struct comedi_device *dev,
 687                                          unsigned gpct_index, short enable)
 688{
 689        if (boardtype.reg_type & ni_reg_m_series_mask)
 690                return;
 691        switch (gpct_index) {
 692        case 0:
 693                if (enable) {
 694                        devpriv->stc_writew(dev, G0_Gate_Second_Irq_Enable,
 695                                            Second_IRQ_A_Enable_Register);
 696                } else {
 697                        devpriv->stc_writew(dev, 0,
 698                                            Second_IRQ_A_Enable_Register);
 699                }
 700                break;
 701        case 1:
 702                if (enable) {
 703                        devpriv->stc_writew(dev, G1_Gate_Second_Irq_Enable,
 704                                            Second_IRQ_B_Enable_Register);
 705                } else {
 706                        devpriv->stc_writew(dev, 0,
 707                                            Second_IRQ_B_Enable_Register);
 708                }
 709                break;
 710        default:
 711                BUG();
 712                break;
 713        }
 714}
 715#endif /*  PCIDMA */
 716
 717static void ni_clear_ai_fifo(struct comedi_device *dev)
 718{
 719        if (boardtype.reg_type == ni_reg_6143) {
 720                /*  Flush the 6143 data FIFO */
 721                ni_writel(0x10, AIFIFO_Control_6143);   /*  Flush fifo */
 722                ni_writel(0x00, AIFIFO_Control_6143);   /*  Flush fifo */
 723                while (ni_readl(AIFIFO_Status_6143) & 0x10) ;   /*  Wait for complete */
 724        } else {
 725                devpriv->stc_writew(dev, 1, ADC_FIFO_Clear);
 726                if (boardtype.reg_type == ni_reg_625x) {
 727                        ni_writeb(0, M_Offset_Static_AI_Control(0));
 728                        ni_writeb(1, M_Offset_Static_AI_Control(0));
 729#if 0
 730                        /* the NI example code does 3 convert pulses for 625x boards,
 731                           but that appears to be wrong in practice. */
 732                        devpriv->stc_writew(dev, AI_CONVERT_Pulse,
 733                                            AI_Command_1_Register);
 734                        devpriv->stc_writew(dev, AI_CONVERT_Pulse,
 735                                            AI_Command_1_Register);
 736                        devpriv->stc_writew(dev, AI_CONVERT_Pulse,
 737                                            AI_Command_1_Register);
 738#endif
 739                }
 740        }
 741}
 742
 743static void win_out2(struct comedi_device *dev, uint32_t data, int reg)
 744{
 745        devpriv->stc_writew(dev, data >> 16, reg);
 746        devpriv->stc_writew(dev, data & 0xffff, reg + 1);
 747}
 748
 749static uint32_t win_in2(struct comedi_device *dev, int reg)
 750{
 751        uint32_t bits;
 752        bits = devpriv->stc_readw(dev, reg) << 16;
 753        bits |= devpriv->stc_readw(dev, reg + 1);
 754        return bits;
 755}
 756
 757#define ao_win_out(data, addr) ni_ao_win_outw(dev, data, addr)
 758static inline void ni_ao_win_outw(struct comedi_device *dev, uint16_t data,
 759                                  int addr)
 760{
 761        unsigned long flags;
 762
 763        spin_lock_irqsave(&devpriv->window_lock, flags);
 764        ni_writew(addr, AO_Window_Address_611x);
 765        ni_writew(data, AO_Window_Data_611x);
 766        spin_unlock_irqrestore(&devpriv->window_lock, flags);
 767}
 768
 769static inline void ni_ao_win_outl(struct comedi_device *dev, uint32_t data,
 770                                  int addr)
 771{
 772        unsigned long flags;
 773
 774        spin_lock_irqsave(&devpriv->window_lock, flags);
 775        ni_writew(addr, AO_Window_Address_611x);
 776        ni_writel(data, AO_Window_Data_611x);
 777        spin_unlock_irqrestore(&devpriv->window_lock, flags);
 778}
 779
 780static inline unsigned short ni_ao_win_inw(struct comedi_device *dev, int addr)
 781{
 782        unsigned long flags;
 783        unsigned short data;
 784
 785        spin_lock_irqsave(&devpriv->window_lock, flags);
 786        ni_writew(addr, AO_Window_Address_611x);
 787        data = ni_readw(AO_Window_Data_611x);
 788        spin_unlock_irqrestore(&devpriv->window_lock, flags);
 789        return data;
 790}
 791
 792/* ni_set_bits( ) allows different parts of the ni_mio_common driver to
 793* share registers (such as Interrupt_A_Register) without interfering with
 794* each other.
 795*
 796* NOTE: the switch/case statements are optimized out for a constant argument
 797* so this is actually quite fast---  If you must wrap another function around this
 798* make it inline to avoid a large speed penalty.
 799*
 800* value should only be 1 or 0.
 801*/
 802static inline void ni_set_bits(struct comedi_device *dev, int reg,
 803                               unsigned bits, unsigned value)
 804{
 805        unsigned bit_values;
 806
 807        if (value)
 808                bit_values = bits;
 809        else
 810                bit_values = 0;
 811        ni_set_bitfield(dev, reg, bits, bit_values);
 812}
 813
 814static irqreturn_t ni_E_interrupt(int irq, void *d)
 815{
 816        struct comedi_device *dev = d;
 817        unsigned short a_status;
 818        unsigned short b_status;
 819        unsigned int ai_mite_status = 0;
 820        unsigned int ao_mite_status = 0;
 821        unsigned long flags;
 822#ifdef PCIDMA
 823        struct mite_struct *mite = devpriv->mite;
 824#endif
 825
 826        if (dev->attached == 0)
 827                return IRQ_NONE;
 828        smp_mb();               /*  make sure dev->attached is checked before handler does anything else. */
 829
 830        /*  lock to avoid race with comedi_poll */
 831        spin_lock_irqsave(&dev->spinlock, flags);
 832        a_status = devpriv->stc_readw(dev, AI_Status_1_Register);
 833        b_status = devpriv->stc_readw(dev, AO_Status_1_Register);
 834#ifdef PCIDMA
 835        if (mite) {
 836                unsigned long flags_too;
 837
 838                spin_lock_irqsave(&devpriv->mite_channel_lock, flags_too);
 839                if (devpriv->ai_mite_chan) {
 840                        ai_mite_status = mite_get_status(devpriv->ai_mite_chan);
 841                        if (ai_mite_status & CHSR_LINKC)
 842                                writel(CHOR_CLRLC,
 843                                       devpriv->mite->mite_io_addr +
 844                                       MITE_CHOR(devpriv->
 845                                                 ai_mite_chan->channel));
 846                }
 847                if (devpriv->ao_mite_chan) {
 848                        ao_mite_status = mite_get_status(devpriv->ao_mite_chan);
 849                        if (ao_mite_status & CHSR_LINKC)
 850                                writel(CHOR_CLRLC,
 851                                       mite->mite_io_addr +
 852                                       MITE_CHOR(devpriv->
 853                                                 ao_mite_chan->channel));
 854                }
 855                spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags_too);
 856        }
 857#endif
 858        ack_a_interrupt(dev, a_status);
 859        ack_b_interrupt(dev, b_status);
 860        if ((a_status & Interrupt_A_St) || (ai_mite_status & CHSR_INT))
 861                handle_a_interrupt(dev, a_status, ai_mite_status);
 862        if ((b_status & Interrupt_B_St) || (ao_mite_status & CHSR_INT))
 863                handle_b_interrupt(dev, b_status, ao_mite_status);
 864        handle_gpct_interrupt(dev, 0);
 865        handle_gpct_interrupt(dev, 1);
 866        handle_cdio_interrupt(dev);
 867
 868        spin_unlock_irqrestore(&dev->spinlock, flags);
 869        return IRQ_HANDLED;
 870}
 871
 872#ifdef PCIDMA
 873static void ni_sync_ai_dma(struct comedi_device *dev)
 874{
 875        struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
 876        unsigned long flags;
 877
 878        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 879        if (devpriv->ai_mite_chan)
 880                mite_sync_input_dma(devpriv->ai_mite_chan, s->async);
 881        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 882}
 883
 884static void mite_handle_b_linkc(struct mite_struct *mite,
 885                                struct comedi_device *dev)
 886{
 887        struct comedi_subdevice *s = dev->subdevices + NI_AO_SUBDEV;
 888        unsigned long flags;
 889
 890        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 891        if (devpriv->ao_mite_chan) {
 892                mite_sync_output_dma(devpriv->ao_mite_chan, s->async);
 893        }
 894        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
 895}
 896
 897static int ni_ao_wait_for_dma_load(struct comedi_device *dev)
 898{
 899        static const int timeout = 10000;
 900        int i;
 901        for (i = 0; i < timeout; i++) {
 902                unsigned short b_status;
 903
 904                b_status = devpriv->stc_readw(dev, AO_Status_1_Register);
 905                if (b_status & AO_FIFO_Half_Full_St)
 906                        break;
 907                /* if we poll too often, the pci bus activity seems
 908                   to slow the dma transfer down */
 909                udelay(10);
 910        }
 911        if (i == timeout) {
 912                comedi_error(dev, "timed out waiting for dma load");
 913                return -EPIPE;
 914        }
 915        return 0;
 916}
 917
 918#endif /* PCIDMA */
 919static void ni_handle_eos(struct comedi_device *dev, struct comedi_subdevice *s)
 920{
 921        if (devpriv->aimode == AIMODE_SCAN) {
 922#ifdef PCIDMA
 923                static const int timeout = 10;
 924                int i;
 925
 926                for (i = 0; i < timeout; i++) {
 927                        ni_sync_ai_dma(dev);
 928                        if ((s->async->events & COMEDI_CB_EOS))
 929                                break;
 930                        udelay(1);
 931                }
 932#else
 933                ni_handle_fifo_dregs(dev);
 934                s->async->events |= COMEDI_CB_EOS;
 935#endif
 936        }
 937        /* handle special case of single scan using AI_End_On_End_Of_Scan */
 938        if ((devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)) {
 939                shutdown_ai_command(dev);
 940        }
 941}
 942
 943static void shutdown_ai_command(struct comedi_device *dev)
 944{
 945        struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
 946
 947#ifdef PCIDMA
 948        ni_ai_drain_dma(dev);
 949#endif
 950        ni_handle_fifo_dregs(dev);
 951        get_last_sample_611x(dev);
 952        get_last_sample_6143(dev);
 953
 954        s->async->events |= COMEDI_CB_EOA;
 955}
 956
 957static void ni_event(struct comedi_device *dev, struct comedi_subdevice *s)
 958{
 959        if (s->
 960            async->events & (COMEDI_CB_ERROR | COMEDI_CB_OVERFLOW |
 961                             COMEDI_CB_EOA)) {
 962                switch (s - dev->subdevices) {
 963                case NI_AI_SUBDEV:
 964                        ni_ai_reset(dev, s);
 965                        break;
 966                case NI_AO_SUBDEV:
 967                        ni_ao_reset(dev, s);
 968                        break;
 969                case NI_GPCT0_SUBDEV:
 970                case NI_GPCT1_SUBDEV:
 971                        ni_gpct_cancel(dev, s);
 972                        break;
 973                case NI_DIO_SUBDEV:
 974                        ni_cdio_cancel(dev, s);
 975                        break;
 976                default:
 977                        break;
 978                }
 979        }
 980        comedi_event(dev, s);
 981}
 982
 983static void handle_gpct_interrupt(struct comedi_device *dev,
 984                                  unsigned short counter_index)
 985{
 986#ifdef PCIDMA
 987        struct comedi_subdevice *s =
 988            dev->subdevices + NI_GPCT_SUBDEV(counter_index);
 989
 990        ni_tio_handle_interrupt(&devpriv->counter_dev->counters[counter_index],
 991                                s);
 992        if (s->async->events)
 993                ni_event(dev, s);
 994#endif
 995}
 996
 997static void ack_a_interrupt(struct comedi_device *dev, unsigned short a_status)
 998{
 999        unsigned short ack = 0;
1000
1001        if (a_status & AI_SC_TC_St) {
1002                ack |= AI_SC_TC_Interrupt_Ack;
1003        }
1004        if (a_status & AI_START1_St) {
1005                ack |= AI_START1_Interrupt_Ack;
1006        }
1007        if (a_status & AI_START_St) {
1008                ack |= AI_START_Interrupt_Ack;
1009        }
1010        if (a_status & AI_STOP_St) {
1011                /* not sure why we used to ack the START here also, instead of doing it independently. Frank Hess 2007-07-06 */
1012                ack |= AI_STOP_Interrupt_Ack /*| AI_START_Interrupt_Ack */ ;
1013        }
1014        if (ack)
1015                devpriv->stc_writew(dev, ack, Interrupt_A_Ack_Register);
1016}
1017
1018static void handle_a_interrupt(struct comedi_device *dev, unsigned short status,
1019                               unsigned ai_mite_status)
1020{
1021        struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
1022
1023        /* 67xx boards don't have ai subdevice, but their gpct0 might generate an a interrupt */
1024        if (s->type == COMEDI_SUBD_UNUSED)
1025                return;
1026
1027#ifdef DEBUG_INTERRUPT
1028        printk
1029            ("ni_mio_common: interrupt: a_status=%04x ai_mite_status=%08x\n",
1030             status, ai_mite_status);
1031        ni_mio_print_status_a(status);
1032#endif
1033#ifdef PCIDMA
1034        if (ai_mite_status & CHSR_LINKC) {
1035                ni_sync_ai_dma(dev);
1036        }
1037
1038        if (ai_mite_status & ~(CHSR_INT | CHSR_LINKC | CHSR_DONE | CHSR_MRDY |
1039                               CHSR_DRDY | CHSR_DRQ1 | CHSR_DRQ0 | CHSR_ERROR |
1040                               CHSR_SABORT | CHSR_XFERR | CHSR_LxERR_mask)) {
1041                printk
1042                    ("unknown mite interrupt, ack! (ai_mite_status=%08x)\n",
1043                     ai_mite_status);
1044                /* mite_print_chsr(ai_mite_status); */
1045                s->async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1046                /* disable_irq(dev->irq); */
1047        }
1048#endif
1049
1050        /* test for all uncommon interrupt events at the same time */
1051        if (status & (AI_Overrun_St | AI_Overflow_St | AI_SC_TC_Error_St |
1052                      AI_SC_TC_St | AI_START1_St)) {
1053                if (status == 0xffff) {
1054                        printk
1055                            ("ni_mio_common: a_status=0xffff.  Card removed?\n");
1056                        /* we probably aren't even running a command now,
1057                         * so it's a good idea to be careful. */
1058                        if (comedi_get_subdevice_runflags(s) & SRF_RUNNING) {
1059                                s->async->events |=
1060                                    COMEDI_CB_ERROR | COMEDI_CB_EOA;
1061                                ni_event(dev, s);
1062                        }
1063                        return;
1064                }
1065                if (status & (AI_Overrun_St | AI_Overflow_St |
1066                              AI_SC_TC_Error_St)) {
1067                        printk("ni_mio_common: ai error a_status=%04x\n",
1068                               status);
1069                        ni_mio_print_status_a(status);
1070
1071                        shutdown_ai_command(dev);
1072
1073                        s->async->events |= COMEDI_CB_ERROR;
1074                        if (status & (AI_Overrun_St | AI_Overflow_St))
1075                                s->async->events |= COMEDI_CB_OVERFLOW;
1076
1077                        ni_event(dev, s);
1078
1079                        return;
1080                }
1081                if (status & AI_SC_TC_St) {
1082#ifdef DEBUG_INTERRUPT
1083                        printk("ni_mio_common: SC_TC interrupt\n");
1084#endif
1085                        if (!devpriv->ai_continuous) {
1086                                shutdown_ai_command(dev);
1087                        }
1088                }
1089        }
1090#ifndef PCIDMA
1091        if (status & AI_FIFO_Half_Full_St) {
1092                int i;
1093                static const int timeout = 10;
1094                /* pcmcia cards (at least 6036) seem to stop producing interrupts if we
1095                 *fail to get the fifo less than half full, so loop to be sure.*/
1096                for (i = 0; i < timeout; ++i) {
1097                        ni_handle_fifo_half_full(dev);
1098                        if ((devpriv->stc_readw(dev,
1099                                                AI_Status_1_Register) &
1100                             AI_FIFO_Half_Full_St) == 0)
1101                                break;
1102                }
1103        }
1104#endif /*  !PCIDMA */
1105
1106        if ((status & AI_STOP_St)) {
1107                ni_handle_eos(dev, s);
1108        }
1109
1110        ni_event(dev, s);
1111
1112#ifdef DEBUG_INTERRUPT
1113        status = devpriv->stc_readw(dev, AI_Status_1_Register);
1114        if (status & Interrupt_A_St) {
1115                printk
1116                    ("handle_a_interrupt: didn't clear interrupt? status=0x%x\n",
1117                     status);
1118        }
1119#endif
1120}
1121
1122static void ack_b_interrupt(struct comedi_device *dev, unsigned short b_status)
1123{
1124        unsigned short ack = 0;
1125        if (b_status & AO_BC_TC_St) {
1126                ack |= AO_BC_TC_Interrupt_Ack;
1127        }
1128        if (b_status & AO_Overrun_St) {
1129                ack |= AO_Error_Interrupt_Ack;
1130        }
1131        if (b_status & AO_START_St) {
1132                ack |= AO_START_Interrupt_Ack;
1133        }
1134        if (b_status & AO_START1_St) {
1135                ack |= AO_START1_Interrupt_Ack;
1136        }
1137        if (b_status & AO_UC_TC_St) {
1138                ack |= AO_UC_TC_Interrupt_Ack;
1139        }
1140        if (b_status & AO_UI2_TC_St) {
1141                ack |= AO_UI2_TC_Interrupt_Ack;
1142        }
1143        if (b_status & AO_UPDATE_St) {
1144                ack |= AO_UPDATE_Interrupt_Ack;
1145        }
1146        if (ack)
1147                devpriv->stc_writew(dev, ack, Interrupt_B_Ack_Register);
1148}
1149
1150static void handle_b_interrupt(struct comedi_device *dev,
1151                               unsigned short b_status, unsigned ao_mite_status)
1152{
1153        struct comedi_subdevice *s = dev->subdevices + NI_AO_SUBDEV;
1154        /* unsigned short ack=0; */
1155#ifdef DEBUG_INTERRUPT
1156        printk("ni_mio_common: interrupt: b_status=%04x m1_status=%08x\n",
1157               b_status, ao_mite_status);
1158        ni_mio_print_status_b(b_status);
1159#endif
1160
1161#ifdef PCIDMA
1162        /* Currently, mite.c requires us to handle LINKC */
1163        if (ao_mite_status & CHSR_LINKC) {
1164                mite_handle_b_linkc(devpriv->mite, dev);
1165        }
1166
1167        if (ao_mite_status & ~(CHSR_INT | CHSR_LINKC | CHSR_DONE | CHSR_MRDY |
1168                               CHSR_DRDY | CHSR_DRQ1 | CHSR_DRQ0 | CHSR_ERROR |
1169                               CHSR_SABORT | CHSR_XFERR | CHSR_LxERR_mask)) {
1170                printk
1171                    ("unknown mite interrupt, ack! (ao_mite_status=%08x)\n",
1172                     ao_mite_status);
1173                /* mite_print_chsr(ao_mite_status); */
1174                s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
1175        }
1176#endif
1177
1178        if (b_status == 0xffff)
1179                return;
1180        if (b_status & AO_Overrun_St) {
1181                printk
1182                    ("ni_mio_common: AO FIFO underrun status=0x%04x status2=0x%04x\n",
1183                     b_status, devpriv->stc_readw(dev, AO_Status_2_Register));
1184                s->async->events |= COMEDI_CB_OVERFLOW;
1185        }
1186
1187        if (b_status & AO_BC_TC_St) {
1188                MDPRINTK
1189                    ("ni_mio_common: AO BC_TC status=0x%04x status2=0x%04x\n",
1190                     b_status, devpriv->stc_readw(dev, AO_Status_2_Register));
1191                s->async->events |= COMEDI_CB_EOA;
1192        }
1193#ifndef PCIDMA
1194        if (b_status & AO_FIFO_Request_St) {
1195                int ret;
1196
1197                ret = ni_ao_fifo_half_empty(dev, s);
1198                if (!ret) {
1199                        printk("ni_mio_common: AO buffer underrun\n");
1200                        ni_set_bits(dev, Interrupt_B_Enable_Register,
1201                                    AO_FIFO_Interrupt_Enable |
1202                                    AO_Error_Interrupt_Enable, 0);
1203                        s->async->events |= COMEDI_CB_OVERFLOW;
1204                }
1205        }
1206#endif
1207
1208        ni_event(dev, s);
1209}
1210
1211#ifdef DEBUG_STATUS_A
1212static const char *const status_a_strings[] = {
1213        "passthru0", "fifo", "G0_gate", "G0_TC",
1214        "stop", "start", "sc_tc", "start1",
1215        "start2", "sc_tc_error", "overflow", "overrun",
1216        "fifo_empty", "fifo_half_full", "fifo_full", "interrupt_a"
1217};
1218
1219static void ni_mio_print_status_a(int status)
1220{
1221        int i;
1222
1223        printk("A status:");
1224        for (i = 15; i >= 0; i--) {
1225                if (status & (1 << i)) {
1226                        printk(" %s", status_a_strings[i]);
1227                }
1228        }
1229        printk("\n");
1230}
1231#endif
1232
1233#ifdef DEBUG_STATUS_B
1234static const char *const status_b_strings[] = {
1235        "passthru1", "fifo", "G1_gate", "G1_TC",
1236        "UI2_TC", "UPDATE", "UC_TC", "BC_TC",
1237        "start1", "overrun", "start", "bc_tc_error",
1238        "fifo_empty", "fifo_half_full", "fifo_full", "interrupt_b"
1239};
1240
1241static void ni_mio_print_status_b(int status)
1242{
1243        int i;
1244
1245        printk("B status:");
1246        for (i = 15; i >= 0; i--) {
1247                if (status & (1 << i)) {
1248                        printk(" %s", status_b_strings[i]);
1249                }
1250        }
1251        printk("\n");
1252}
1253#endif
1254
1255#ifndef PCIDMA
1256
1257static void ni_ao_fifo_load(struct comedi_device *dev,
1258                            struct comedi_subdevice *s, int n)
1259{
1260        struct comedi_async *async = s->async;
1261        struct comedi_cmd *cmd = &async->cmd;
1262        int chan;
1263        int i;
1264        short d;
1265        u32 packed_data;
1266        int range;
1267        int err = 1;
1268
1269        chan = async->cur_chan;
1270        for (i = 0; i < n; i++) {
1271                err &= comedi_buf_get(async, &d);
1272                if (err == 0)
1273                        break;
1274
1275                range = CR_RANGE(cmd->chanlist[chan]);
1276
1277                if (boardtype.reg_type & ni_reg_6xxx_mask) {
1278                        packed_data = d & 0xffff;
1279                        /* 6711 only has 16 bit wide ao fifo */
1280                        if (boardtype.reg_type != ni_reg_6711) {
1281                                err &= comedi_buf_get(async, &d);
1282                                if (err == 0)
1283                                        break;
1284                                chan++;
1285                                i++;
1286                                packed_data |= (d << 16) & 0xffff0000;
1287                        }
1288                        ni_writel(packed_data, DAC_FIFO_Data_611x);
1289                } else {
1290                        ni_writew(d, DAC_FIFO_Data);
1291                }
1292                chan++;
1293                chan %= cmd->chanlist_len;
1294        }
1295        async->cur_chan = chan;
1296        if (err == 0) {
1297                async->events |= COMEDI_CB_OVERFLOW;
1298        }
1299}
1300
1301/*
1302 *  There's a small problem if the FIFO gets really low and we
1303 *  don't have the data to fill it.  Basically, if after we fill
1304 *  the FIFO with all the data available, the FIFO is _still_
1305 *  less than half full, we never clear the interrupt.  If the
1306 *  IRQ is in edge mode, we never get another interrupt, because
1307 *  this one wasn't cleared.  If in level mode, we get flooded
1308 *  with interrupts that we can't fulfill, because nothing ever
1309 *  gets put into the buffer.
1310 *
1311 *  This kind of situation is recoverable, but it is easier to
1312 *  just pretend we had a FIFO underrun, since there is a good
1313 *  chance it will happen anyway.  This is _not_ the case for
1314 *  RT code, as RT code might purposely be running close to the
1315 *  metal.  Needs to be fixed eventually.
1316 */
1317static int ni_ao_fifo_half_empty(struct comedi_device *dev,
1318                                 struct comedi_subdevice *s)
1319{
1320        int n;
1321
1322        n = comedi_buf_read_n_available(s->async);
1323        if (n == 0) {
1324                s->async->events |= COMEDI_CB_OVERFLOW;
1325                return 0;
1326        }
1327
1328        n /= sizeof(short);
1329        if (n > boardtype.ao_fifo_depth / 2)
1330                n = boardtype.ao_fifo_depth / 2;
1331
1332        ni_ao_fifo_load(dev, s, n);
1333
1334        s->async->events |= COMEDI_CB_BLOCK;
1335
1336        return 1;
1337}
1338
1339static int ni_ao_prep_fifo(struct comedi_device *dev,
1340                           struct comedi_subdevice *s)
1341{
1342        int n;
1343
1344        /* reset fifo */
1345        devpriv->stc_writew(dev, 1, DAC_FIFO_Clear);
1346        if (boardtype.reg_type & ni_reg_6xxx_mask)
1347                ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x);
1348
1349        /* load some data */
1350        n = comedi_buf_read_n_available(s->async);
1351        if (n == 0)
1352                return 0;
1353
1354        n /= sizeof(short);
1355        if (n > boardtype.ao_fifo_depth)
1356                n = boardtype.ao_fifo_depth;
1357
1358        ni_ao_fifo_load(dev, s, n);
1359
1360        return n;
1361}
1362
1363static void ni_ai_fifo_read(struct comedi_device *dev,
1364                            struct comedi_subdevice *s, int n)
1365{
1366        struct comedi_async *async = s->async;
1367        int i;
1368
1369        if (boardtype.reg_type == ni_reg_611x) {
1370                short data[2];
1371                u32 dl;
1372
1373                for (i = 0; i < n / 2; i++) {
1374                        dl = ni_readl(ADC_FIFO_Data_611x);
1375                        /* This may get the hi/lo data in the wrong order */
1376                        data[0] = (dl >> 16) & 0xffff;
1377                        data[1] = dl & 0xffff;
1378                        cfc_write_array_to_buffer(s, data, sizeof(data));
1379                }
1380                /* Check if there's a single sample stuck in the FIFO */
1381                if (n % 2) {
1382                        dl = ni_readl(ADC_FIFO_Data_611x);
1383                        data[0] = dl & 0xffff;
1384                        cfc_write_to_buffer(s, data[0]);
1385                }
1386        } else if (boardtype.reg_type == ni_reg_6143) {
1387                short data[2];
1388                u32 dl;
1389
1390                /*  This just reads the FIFO assuming the data is present, no checks on the FIFO status are performed */
1391                for (i = 0; i < n / 2; i++) {
1392                        dl = ni_readl(AIFIFO_Data_6143);
1393
1394                        data[0] = (dl >> 16) & 0xffff;
1395                        data[1] = dl & 0xffff;
1396                        cfc_write_array_to_buffer(s, data, sizeof(data));
1397                }
1398                if (n % 2) {
1399                        /* Assume there is a single sample stuck in the FIFO */
1400                        ni_writel(0x01, AIFIFO_Control_6143);   /*  Get stranded sample into FIFO */
1401                        dl = ni_readl(AIFIFO_Data_6143);
1402                        data[0] = (dl >> 16) & 0xffff;
1403                        cfc_write_to_buffer(s, data[0]);
1404                }
1405        } else {
1406                if (n > sizeof(devpriv->ai_fifo_buffer) /
1407                    sizeof(devpriv->ai_fifo_buffer[0])) {
1408                        comedi_error(dev, "bug! ai_fifo_buffer too small");
1409                        async->events |= COMEDI_CB_ERROR;
1410                        return;
1411                }
1412                for (i = 0; i < n; i++) {
1413                        devpriv->ai_fifo_buffer[i] =
1414                            ni_readw(ADC_FIFO_Data_Register);
1415                }
1416                cfc_write_array_to_buffer(s, devpriv->ai_fifo_buffer,
1417                                          n *
1418                                          sizeof(devpriv->ai_fifo_buffer[0]));
1419        }
1420}
1421
1422static void ni_handle_fifo_half_full(struct comedi_device *dev)
1423{
1424        int n;
1425        struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
1426
1427        n = boardtype.ai_fifo_depth / 2;
1428
1429        ni_ai_fifo_read(dev, s, n);
1430}
1431#endif
1432
1433#ifdef PCIDMA
1434static int ni_ai_drain_dma(struct comedi_device *dev)
1435{
1436        int i;
1437        static const int timeout = 10000;
1438        unsigned long flags;
1439        int retval = 0;
1440
1441        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
1442        if (devpriv->ai_mite_chan) {
1443                for (i = 0; i < timeout; i++) {
1444                        if ((devpriv->stc_readw(dev,
1445                                                AI_Status_1_Register) &
1446                             AI_FIFO_Empty_St)
1447                            && mite_bytes_in_transit(devpriv->ai_mite_chan) ==
1448                            0)
1449                                break;
1450                        udelay(5);
1451                }
1452                if (i == timeout) {
1453                        printk("ni_mio_common: wait for dma drain timed out\n");
1454                        printk
1455                            ("mite_bytes_in_transit=%i, AI_Status1_Register=0x%x\n",
1456                             mite_bytes_in_transit(devpriv->ai_mite_chan),
1457                             devpriv->stc_readw(dev, AI_Status_1_Register));
1458                        retval = -1;
1459                }
1460        }
1461        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
1462
1463        ni_sync_ai_dma(dev);
1464
1465        return retval;
1466}
1467#endif
1468/*
1469   Empties the AI fifo
1470*/
1471static void ni_handle_fifo_dregs(struct comedi_device *dev)
1472{
1473        struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
1474        short data[2];
1475        u32 dl;
1476        short fifo_empty;
1477        int i;
1478
1479        if (boardtype.reg_type == ni_reg_611x) {
1480                while ((devpriv->stc_readw(dev,
1481                                           AI_Status_1_Register) &
1482                        AI_FIFO_Empty_St) == 0) {
1483                        dl = ni_readl(ADC_FIFO_Data_611x);
1484
1485                        /* This may get the hi/lo data in the wrong order */
1486                        data[0] = (dl >> 16);
1487                        data[1] = (dl & 0xffff);
1488                        cfc_write_array_to_buffer(s, data, sizeof(data));
1489                }
1490        } else if (boardtype.reg_type == ni_reg_6143) {
1491                i = 0;
1492                while (ni_readl(AIFIFO_Status_6143) & 0x04) {
1493                        dl = ni_readl(AIFIFO_Data_6143);
1494
1495                        /* This may get the hi/lo data in the wrong order */
1496                        data[0] = (dl >> 16);
1497                        data[1] = (dl & 0xffff);
1498                        cfc_write_array_to_buffer(s, data, sizeof(data));
1499                        i += 2;
1500                }
1501                /*  Check if stranded sample is present */
1502                if (ni_readl(AIFIFO_Status_6143) & 0x01) {
1503                        ni_writel(0x01, AIFIFO_Control_6143);   /*  Get stranded sample into FIFO */
1504                        dl = ni_readl(AIFIFO_Data_6143);
1505                        data[0] = (dl >> 16) & 0xffff;
1506                        cfc_write_to_buffer(s, data[0]);
1507                }
1508
1509        } else {
1510                fifo_empty =
1511                    devpriv->stc_readw(dev,
1512                                       AI_Status_1_Register) & AI_FIFO_Empty_St;
1513                while (fifo_empty == 0) {
1514                        for (i = 0;
1515                             i <
1516                             sizeof(devpriv->ai_fifo_buffer) /
1517                             sizeof(devpriv->ai_fifo_buffer[0]); i++) {
1518                                fifo_empty =
1519                                    devpriv->stc_readw(dev,
1520                                                       AI_Status_1_Register) &
1521                                    AI_FIFO_Empty_St;
1522                                if (fifo_empty)
1523                                        break;
1524                                devpriv->ai_fifo_buffer[i] =
1525                                    ni_readw(ADC_FIFO_Data_Register);
1526                        }
1527                        cfc_write_array_to_buffer(s, devpriv->ai_fifo_buffer,
1528                                                  i *
1529                                                  sizeof(devpriv->
1530                                                         ai_fifo_buffer[0]));
1531                }
1532        }
1533}
1534
1535static void get_last_sample_611x(struct comedi_device *dev)
1536{
1537        struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
1538        short data;
1539        u32 dl;
1540
1541        if (boardtype.reg_type != ni_reg_611x)
1542                return;
1543
1544        /* Check if there's a single sample stuck in the FIFO */
1545        if (ni_readb(XXX_Status) & 0x80) {
1546                dl = ni_readl(ADC_FIFO_Data_611x);
1547                data = (dl & 0xffff);
1548                cfc_write_to_buffer(s, data);
1549        }
1550}
1551
1552static void get_last_sample_6143(struct comedi_device *dev)
1553{
1554        struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
1555        short data;
1556        u32 dl;
1557
1558        if (boardtype.reg_type != ni_reg_6143)
1559                return;
1560
1561        /* Check if there's a single sample stuck in the FIFO */
1562        if (ni_readl(AIFIFO_Status_6143) & 0x01) {
1563                ni_writel(0x01, AIFIFO_Control_6143);   /*  Get stranded sample into FIFO */
1564                dl = ni_readl(AIFIFO_Data_6143);
1565
1566                /* This may get the hi/lo data in the wrong order */
1567                data = (dl >> 16) & 0xffff;
1568                cfc_write_to_buffer(s, data);
1569        }
1570}
1571
1572static void ni_ai_munge(struct comedi_device *dev, struct comedi_subdevice *s,
1573                        void *data, unsigned int num_bytes,
1574                        unsigned int chan_index)
1575{
1576        struct comedi_async *async = s->async;
1577        unsigned int i;
1578        unsigned int length = num_bytes / bytes_per_sample(s);
1579        short *array = data;
1580        unsigned int *larray = data;
1581        for (i = 0; i < length; i++) {
1582#ifdef PCIDMA
1583                if (s->subdev_flags & SDF_LSAMPL)
1584                        larray[i] = le32_to_cpu(larray[i]);
1585                else
1586                        array[i] = le16_to_cpu(array[i]);
1587#endif
1588                if (s->subdev_flags & SDF_LSAMPL)
1589                        larray[i] += devpriv->ai_offset[chan_index];
1590                else
1591                        array[i] += devpriv->ai_offset[chan_index];
1592                chan_index++;
1593                chan_index %= async->cmd.chanlist_len;
1594        }
1595}
1596
1597#ifdef PCIDMA
1598
1599static int ni_ai_setup_MITE_dma(struct comedi_device *dev)
1600{
1601        struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
1602        int retval;
1603        unsigned long flags;
1604
1605        retval = ni_request_ai_mite_channel(dev);
1606        if (retval)
1607                return retval;
1608/* printk("comedi_debug: using mite channel %i for ai.\n", devpriv->ai_mite_chan->channel); */
1609
1610        /* write alloc the entire buffer */
1611        comedi_buf_write_alloc(s->async, s->async->prealloc_bufsz);
1612
1613        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
1614        if (devpriv->ai_mite_chan == NULL) {
1615                spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
1616                return -EIO;
1617        }
1618
1619        switch (boardtype.reg_type) {
1620        case ni_reg_611x:
1621        case ni_reg_6143:
1622                mite_prep_dma(devpriv->ai_mite_chan, 32, 16);
1623                break;
1624        case ni_reg_628x:
1625                mite_prep_dma(devpriv->ai_mite_chan, 32, 32);
1626                break;
1627        default:
1628                mite_prep_dma(devpriv->ai_mite_chan, 16, 16);
1629                break;
1630        };
1631        /*start the MITE */
1632        mite_dma_arm(devpriv->ai_mite_chan);
1633        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
1634
1635        return 0;
1636}
1637
1638static int ni_ao_setup_MITE_dma(struct comedi_device *dev)
1639{
1640        struct comedi_subdevice *s = dev->subdevices + NI_AO_SUBDEV;
1641        int retval;
1642        unsigned long flags;
1643
1644        retval = ni_request_ao_mite_channel(dev);
1645        if (retval)
1646                return retval;
1647
1648        /* read alloc the entire buffer */
1649        comedi_buf_read_alloc(s->async, s->async->prealloc_bufsz);
1650
1651        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
1652        if (devpriv->ao_mite_chan) {
1653                if (boardtype.reg_type & (ni_reg_611x | ni_reg_6713)) {
1654                        mite_prep_dma(devpriv->ao_mite_chan, 32, 32);
1655                } else {
1656                        /* doing 32 instead of 16 bit wide transfers from memory
1657                           makes the mite do 32 bit pci transfers, doubling pci bandwidth. */
1658                        mite_prep_dma(devpriv->ao_mite_chan, 16, 32);
1659                }
1660                mite_dma_arm(devpriv->ao_mite_chan);
1661        } else
1662                retval = -EIO;
1663        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
1664
1665        return retval;
1666}
1667
1668#endif /*  PCIDMA */
1669
1670/*
1671   used for both cancel ioctl and board initialization
1672
1673   this is pretty harsh for a cancel, but it works...
1674 */
1675
1676static int ni_ai_reset(struct comedi_device *dev, struct comedi_subdevice *s)
1677{
1678        ni_release_ai_mite_channel(dev);
1679        /* ai configuration */
1680        devpriv->stc_writew(dev, AI_Configuration_Start | AI_Reset,
1681                            Joint_Reset_Register);
1682
1683        ni_set_bits(dev, Interrupt_A_Enable_Register,
1684                    AI_SC_TC_Interrupt_Enable | AI_START1_Interrupt_Enable |
1685                    AI_START2_Interrupt_Enable | AI_START_Interrupt_Enable |
1686                    AI_STOP_Interrupt_Enable | AI_Error_Interrupt_Enable |
1687                    AI_FIFO_Interrupt_Enable, 0);
1688
1689        ni_clear_ai_fifo(dev);
1690
1691        if (boardtype.reg_type != ni_reg_6143)
1692                ni_writeb(0, Misc_Command);
1693
1694        devpriv->stc_writew(dev, AI_Disarm, AI_Command_1_Register);     /* reset pulses */
1695        devpriv->stc_writew(dev,
1696                            AI_Start_Stop | AI_Mode_1_Reserved
1697                            /*| AI_Trigger_Once */ ,
1698                            AI_Mode_1_Register);
1699        devpriv->stc_writew(dev, 0x0000, AI_Mode_2_Register);
1700        /* generate FIFO interrupts on non-empty */
1701        devpriv->stc_writew(dev, (0 << 6) | 0x0000, AI_Mode_3_Register);
1702        if (boardtype.reg_type == ni_reg_611x) {
1703                devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1704                                    AI_SOC_Polarity |
1705                                    AI_LOCALMUX_CLK_Pulse_Width,
1706                                    AI_Personal_Register);
1707                devpriv->stc_writew(dev,
1708                                    AI_SCAN_IN_PROG_Output_Select(3) |
1709                                    AI_EXTMUX_CLK_Output_Select(0) |
1710                                    AI_LOCALMUX_CLK_Output_Select(2) |
1711                                    AI_SC_TC_Output_Select(3) |
1712                                    AI_CONVERT_Output_Select
1713                                    (AI_CONVERT_Output_Enable_High),
1714                                    AI_Output_Control_Register);
1715        } else if (boardtype.reg_type == ni_reg_6143) {
1716                devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1717                                    AI_SOC_Polarity |
1718                                    AI_LOCALMUX_CLK_Pulse_Width,
1719                                    AI_Personal_Register);
1720                devpriv->stc_writew(dev,
1721                                    AI_SCAN_IN_PROG_Output_Select(3) |
1722                                    AI_EXTMUX_CLK_Output_Select(0) |
1723                                    AI_LOCALMUX_CLK_Output_Select(2) |
1724                                    AI_SC_TC_Output_Select(3) |
1725                                    AI_CONVERT_Output_Select
1726                                    (AI_CONVERT_Output_Enable_Low),
1727                                    AI_Output_Control_Register);
1728        } else {
1729                unsigned ai_output_control_bits;
1730                devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1731                                    AI_SOC_Polarity |
1732                                    AI_CONVERT_Pulse_Width |
1733                                    AI_LOCALMUX_CLK_Pulse_Width,
1734                                    AI_Personal_Register);
1735                ai_output_control_bits =
1736                    AI_SCAN_IN_PROG_Output_Select(3) |
1737                    AI_EXTMUX_CLK_Output_Select(0) |
1738                    AI_LOCALMUX_CLK_Output_Select(2) |
1739                    AI_SC_TC_Output_Select(3);
1740                if (boardtype.reg_type == ni_reg_622x)
1741                        ai_output_control_bits |=
1742                            AI_CONVERT_Output_Select
1743                            (AI_CONVERT_Output_Enable_High);
1744                else
1745                        ai_output_control_bits |=
1746                            AI_CONVERT_Output_Select
1747                            (AI_CONVERT_Output_Enable_Low);
1748                devpriv->stc_writew(dev, ai_output_control_bits,
1749                                    AI_Output_Control_Register);
1750        }
1751        /* the following registers should not be changed, because there
1752         * are no backup registers in devpriv.  If you want to change
1753         * any of these, add a backup register and other appropriate code:
1754         *      AI_Mode_1_Register
1755         *      AI_Mode_3_Register
1756         *      AI_Personal_Register
1757         *      AI_Output_Control_Register
1758         */
1759        devpriv->stc_writew(dev, AI_SC_TC_Error_Confirm | AI_START_Interrupt_Ack | AI_START2_Interrupt_Ack | AI_START1_Interrupt_Ack | AI_SC_TC_Interrupt_Ack | AI_Error_Interrupt_Ack | AI_STOP_Interrupt_Ack, Interrupt_A_Ack_Register);      /* clear interrupts */
1760
1761        devpriv->stc_writew(dev, AI_Configuration_End, Joint_Reset_Register);
1762
1763        return 0;
1764}
1765
1766static int ni_ai_poll(struct comedi_device *dev, struct comedi_subdevice *s)
1767{
1768        unsigned long flags = 0;
1769        int count;
1770
1771        /*  lock to avoid race with interrupt handler */
1772        if (in_interrupt() == 0)
1773                spin_lock_irqsave(&dev->spinlock, flags);
1774#ifndef PCIDMA
1775        ni_handle_fifo_dregs(dev);
1776#else
1777        ni_sync_ai_dma(dev);
1778#endif
1779        count = s->async->buf_write_count - s->async->buf_read_count;
1780        if (in_interrupt() == 0)
1781                spin_unlock_irqrestore(&dev->spinlock, flags);
1782
1783        return count;
1784}
1785
1786static int ni_ai_insn_read(struct comedi_device *dev,
1787                           struct comedi_subdevice *s, struct comedi_insn *insn,
1788                           unsigned int *data)
1789{
1790        int i, n;
1791        const unsigned int mask = (1 << boardtype.adbits) - 1;
1792        unsigned signbits;
1793        unsigned short d;
1794        unsigned long dl;
1795
1796        ni_load_channelgain_list(dev, 1, &insn->chanspec);
1797
1798        ni_clear_ai_fifo(dev);
1799
1800        signbits = devpriv->ai_offset[0];
1801        if (boardtype.reg_type == ni_reg_611x) {
1802                for (n = 0; n < num_adc_stages_611x; n++) {
1803                        devpriv->stc_writew(dev, AI_CONVERT_Pulse,
1804                                            AI_Command_1_Register);
1805                        udelay(1);
1806                }
1807                for (n = 0; n < insn->n; n++) {
1808                        devpriv->stc_writew(dev, AI_CONVERT_Pulse,
1809                                            AI_Command_1_Register);
1810                        /* The 611x has screwy 32-bit FIFOs. */
1811                        d = 0;
1812                        for (i = 0; i < NI_TIMEOUT; i++) {
1813                                if (ni_readb(XXX_Status) & 0x80) {
1814                                        d = (ni_readl(ADC_FIFO_Data_611x) >> 16)
1815                                            & 0xffff;
1816                                        break;
1817                                }
1818                                if (!(devpriv->stc_readw(dev,
1819                                                         AI_Status_1_Register) &
1820                                      AI_FIFO_Empty_St)) {
1821                                        d = ni_readl(ADC_FIFO_Data_611x) &
1822                                            0xffff;
1823                                        break;
1824                                }
1825                        }
1826                        if (i == NI_TIMEOUT) {
1827                                printk
1828                                    ("ni_mio_common: timeout in 611x ni_ai_insn_read\n");
1829                                return -ETIME;
1830                        }
1831                        d += signbits;
1832                        data[n] = d;
1833                }
1834        } else if (boardtype.reg_type == ni_reg_6143) {
1835                for (n = 0; n < insn->n; n++) {
1836                        devpriv->stc_writew(dev, AI_CONVERT_Pulse,
1837                                            AI_Command_1_Register);
1838
1839                        /* The 6143 has 32-bit FIFOs. You need to strobe a bit to move a single 16bit stranded sample into the FIFO */
1840                        dl = 0;
1841                        for (i = 0; i < NI_TIMEOUT; i++) {
1842                                if (ni_readl(AIFIFO_Status_6143) & 0x01) {
1843                                        ni_writel(0x01, AIFIFO_Control_6143);   /*  Get stranded sample into FIFO */
1844                                        dl = ni_readl(AIFIFO_Data_6143);
1845                                        break;
1846                                }
1847                        }
1848                        if (i == NI_TIMEOUT) {
1849                                printk
1850                                    ("ni_mio_common: timeout in 6143 ni_ai_insn_read\n");
1851                                return -ETIME;
1852                        }
1853                        data[n] = (((dl >> 16) & 0xFFFF) + signbits) & 0xFFFF;
1854                }
1855        } else {
1856                for (n = 0; n < insn->n; n++) {
1857                        devpriv->stc_writew(dev, AI_CONVERT_Pulse,
1858                                            AI_Command_1_Register);
1859                        for (i = 0; i < NI_TIMEOUT; i++) {
1860                                if (!(devpriv->stc_readw(dev,
1861                                                         AI_Status_1_Register) &
1862                                      AI_FIFO_Empty_St))
1863                                        break;
1864                        }
1865                        if (i == NI_TIMEOUT) {
1866                                printk
1867                                    ("ni_mio_common: timeout in ni_ai_insn_read\n");
1868                                return -ETIME;
1869                        }
1870                        if (boardtype.reg_type & ni_reg_m_series_mask) {
1871                                data[n] =
1872                                    ni_readl(M_Offset_AI_FIFO_Data) & mask;
1873                        } else {
1874                                d = ni_readw(ADC_FIFO_Data_Register);
1875                                d += signbits;  /* subtle: needs to be short addition */
1876                                data[n] = d;
1877                        }
1878                }
1879        }
1880        return insn->n;
1881}
1882
1883void ni_prime_channelgain_list(struct comedi_device *dev)
1884{
1885        int i;
1886        devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1887        for (i = 0; i < NI_TIMEOUT; ++i) {
1888                if (!(devpriv->stc_readw(dev,
1889                                         AI_Status_1_Register) &
1890                      AI_FIFO_Empty_St)) {
1891                        devpriv->stc_writew(dev, 1, ADC_FIFO_Clear);
1892                        return;
1893                }
1894                udelay(1);
1895        }
1896        printk("ni_mio_common: timeout loading channel/gain list\n");
1897}
1898
1899static void ni_m_series_load_channelgain_list(struct comedi_device *dev,
1900                                              unsigned int n_chan,
1901                                              unsigned int *list)
1902{
1903        unsigned int chan, range, aref;
1904        unsigned int i;
1905        unsigned offset;
1906        unsigned int dither;
1907        unsigned range_code;
1908
1909        devpriv->stc_writew(dev, 1, Configuration_Memory_Clear);
1910
1911/* offset = 1 << (boardtype.adbits - 1); */
1912        if ((list[0] & CR_ALT_SOURCE)) {
1913                unsigned bypass_bits;
1914                chan = CR_CHAN(list[0]);
1915                range = CR_RANGE(list[0]);
1916                range_code = ni_gainlkup[boardtype.gainlkup][range];
1917                dither = ((list[0] & CR_ALT_FILTER) != 0);
1918                bypass_bits = MSeries_AI_Bypass_Config_FIFO_Bit;
1919                bypass_bits |= chan;
1920                bypass_bits |=
1921                    (devpriv->ai_calib_source) &
1922                    (MSeries_AI_Bypass_Cal_Sel_Pos_Mask |
1923                     MSeries_AI_Bypass_Cal_Sel_Neg_Mask |
1924                     MSeries_AI_Bypass_Mode_Mux_Mask |
1925                     MSeries_AO_Bypass_AO_Cal_Sel_Mask);
1926                bypass_bits |= MSeries_AI_Bypass_Gain_Bits(range_code);
1927                if (dither)
1928                        bypass_bits |= MSeries_AI_Bypass_Dither_Bit;
1929                /*  don't use 2's complement encoding */
1930                bypass_bits |= MSeries_AI_Bypass_Polarity_Bit;
1931                ni_writel(bypass_bits, M_Offset_AI_Config_FIFO_Bypass);
1932        } else {
1933                ni_writel(0, M_Offset_AI_Config_FIFO_Bypass);
1934        }
1935        offset = 0;
1936        for (i = 0; i < n_chan; i++) {
1937                unsigned config_bits = 0;
1938                chan = CR_CHAN(list[i]);
1939                aref = CR_AREF(list[i]);
1940                range = CR_RANGE(list[i]);
1941                dither = ((list[i] & CR_ALT_FILTER) != 0);
1942
1943                range_code = ni_gainlkup[boardtype.gainlkup][range];
1944                devpriv->ai_offset[i] = offset;
1945                switch (aref) {
1946                case AREF_DIFF:
1947                        config_bits |=
1948                            MSeries_AI_Config_Channel_Type_Differential_Bits;
1949                        break;
1950                case AREF_COMMON:
1951                        config_bits |=
1952                            MSeries_AI_Config_Channel_Type_Common_Ref_Bits;
1953                        break;
1954                case AREF_GROUND:
1955                        config_bits |=
1956                            MSeries_AI_Config_Channel_Type_Ground_Ref_Bits;
1957                        break;
1958                case AREF_OTHER:
1959                        break;
1960                }
1961                config_bits |= MSeries_AI_Config_Channel_Bits(chan);
1962                config_bits |=
1963                    MSeries_AI_Config_Bank_Bits(boardtype.reg_type, chan);
1964                config_bits |= MSeries_AI_Config_Gain_Bits(range_code);
1965                if (i == n_chan - 1)
1966                        config_bits |= MSeries_AI_Config_Last_Channel_Bit;
1967                if (dither)
1968                        config_bits |= MSeries_AI_Config_Dither_Bit;
1969                /*  don't use 2's complement encoding */
1970                config_bits |= MSeries_AI_Config_Polarity_Bit;
1971                ni_writew(config_bits, M_Offset_AI_Config_FIFO_Data);
1972        }
1973        ni_prime_channelgain_list(dev);
1974}
1975
1976/*
1977 * Notes on the 6110 and 6111:
1978 * These boards a slightly different than the rest of the series, since
1979 * they have multiple A/D converters.
1980 * From the driver side, the configuration memory is a
1981 * little different.
1982 * Configuration Memory Low:
1983 *   bits 15-9: same
1984 *   bit 8: unipolar/bipolar (should be 0 for bipolar)
1985 *   bits 0-3: gain.  This is 4 bits instead of 3 for the other boards
1986 *       1001 gain=0.1 (+/- 50)
1987 *       1010 0.2
1988 *       1011 0.1
1989 *       0001 1
1990 *       0010 2
1991 *       0011 5
1992 *       0100 10
1993 *       0101 20
1994 *       0110 50
1995 * Configuration Memory High:
1996 *   bits 12-14: Channel Type
1997 *       001 for differential
1998 *       000 for calibration
1999 *   bit 11: coupling  (this is not currently handled)
2000 *       1 AC coupling
2001 *       0 DC coupling
2002 *   bits 0-2: channel
2003 *       valid channels are 0-3
2004 */
2005static void ni_load_channelgain_list(struct comedi_device *dev,
2006                                     unsigned int n_chan, unsigned int *list)
2007{
2008        unsigned int chan, range, aref;
2009        unsigned int i;
2010        unsigned int hi, lo;
2011        unsigned offset;
2012        unsigned int dither;
2013
2014        if (boardtype.reg_type & ni_reg_m_series_mask) {
2015                ni_m_series_load_channelgain_list(dev, n_chan, list);
2016                return;
2017        }
2018        if (n_chan == 1 && (boardtype.reg_type != ni_reg_611x)
2019            && (boardtype.reg_type != ni_reg_6143)) {
2020                if (devpriv->changain_state
2021                    && devpriv->changain_spec == list[0]) {
2022                        /*  ready to go. */
2023                        return;
2024                }
2025                devpriv->changain_state = 1;
2026                devpriv->changain_spec = list[0];
2027        } else {
2028                devpriv->changain_state = 0;
2029        }
2030
2031        devpriv->stc_writew(dev, 1, Configuration_Memory_Clear);
2032
2033        /*  Set up Calibration mode if required */
2034        if (boardtype.reg_type == ni_reg_6143) {
2035                if ((list[0] & CR_ALT_SOURCE)
2036                    && !devpriv->ai_calib_source_enabled) {
2037                        /*  Strobe Relay enable bit */
2038                        ni_writew(devpriv->ai_calib_source |
2039                                  Calibration_Channel_6143_RelayOn,
2040                                  Calibration_Channel_6143);
2041                        ni_writew(devpriv->ai_calib_source,
2042                                  Calibration_Channel_6143);
2043                        devpriv->ai_calib_source_enabled = 1;
2044                        msleep_interruptible(100);      /*  Allow relays to change */
2045                } else if (!(list[0] & CR_ALT_SOURCE)
2046                           && devpriv->ai_calib_source_enabled) {
2047                        /*  Strobe Relay disable bit */
2048                        ni_writew(devpriv->ai_calib_source |
2049                                  Calibration_Channel_6143_RelayOff,
2050                                  Calibration_Channel_6143);
2051                        ni_writew(devpriv->ai_calib_source,
2052                                  Calibration_Channel_6143);
2053                        devpriv->ai_calib_source_enabled = 0;
2054                        msleep_interruptible(100);      /*  Allow relays to change */
2055                }
2056        }
2057
2058        offset = 1 << (boardtype.adbits - 1);
2059        for (i = 0; i < n_chan; i++) {
2060                if ((boardtype.reg_type != ni_reg_6143)
2061                    && (list[i] & CR_ALT_SOURCE)) {
2062                        chan = devpriv->ai_calib_source;
2063                } else {
2064                        chan = CR_CHAN(list[i]);
2065                }
2066                aref = CR_AREF(list[i]);
2067                range = CR_RANGE(list[i]);
2068                dither = ((list[i] & CR_ALT_FILTER) != 0);
2069
2070                /* fix the external/internal range differences */
2071                range = ni_gainlkup[boardtype.gainlkup][range];
2072                if (boardtype.reg_type == ni_reg_611x)
2073                        devpriv->ai_offset[i] = offset;
2074                else
2075                        devpriv->ai_offset[i] = (range & 0x100) ? 0 : offset;
2076
2077                hi = 0;
2078                if ((list[i] & CR_ALT_SOURCE)) {
2079                        if (boardtype.reg_type == ni_reg_611x)
2080                                ni_writew(CR_CHAN(list[i]) & 0x0003,
2081                                          Calibration_Channel_Select_611x);
2082                } else {
2083                        if (boardtype.reg_type == ni_reg_611x)
2084                                aref = AREF_DIFF;
2085                        else if (boardtype.reg_type == ni_reg_6143)
2086                                aref = AREF_OTHER;
2087                        switch (aref) {
2088                        case AREF_DIFF:
2089                                hi |= AI_DIFFERENTIAL;
2090                                break;
2091                        case AREF_COMMON:
2092                                hi |= AI_COMMON;
2093                                break;
2094                        case AREF_GROUND:
2095                                hi |= AI_GROUND;
2096                                break;
2097                        case AREF_OTHER:
2098                                break;
2099                        }
2100                }
2101                hi |= AI_CONFIG_CHANNEL(chan);
2102
2103                ni_writew(hi, Configuration_Memory_High);
2104
2105                if (boardtype.reg_type != ni_reg_6143) {
2106                        lo = range;
2107                        if (i == n_chan - 1)
2108                                lo |= AI_LAST_CHANNEL;
2109                        if (dither)
2110                                lo |= AI_DITHER;
2111
2112                        ni_writew(lo, Configuration_Memory_Low);
2113                }
2114        }
2115
2116        /* prime the channel/gain list */
2117        if ((boardtype.reg_type != ni_reg_611x)
2118            && (boardtype.reg_type != ni_reg_6143)) {
2119                ni_prime_channelgain_list(dev);
2120        }
2121}
2122
2123static int ni_ns_to_timer(const struct comedi_device *dev, unsigned nanosec,
2124                          int round_mode)
2125{
2126        int divider;
2127        switch (round_mode) {
2128        case TRIG_ROUND_NEAREST:
2129        default:
2130                divider = (nanosec + devpriv->clock_ns / 2) / devpriv->clock_ns;
2131                break;
2132        case TRIG_ROUND_DOWN:
2133                divider = (nanosec) / devpriv->clock_ns;
2134                break;
2135        case TRIG_ROUND_UP:
2136                divider = (nanosec + devpriv->clock_ns - 1) / devpriv->clock_ns;
2137                break;
2138        }
2139        return divider - 1;
2140}
2141
2142static unsigned ni_timer_to_ns(const struct comedi_device *dev, int timer)
2143{
2144        return devpriv->clock_ns * (timer + 1);
2145}
2146
2147static unsigned ni_min_ai_scan_period_ns(struct comedi_device *dev,
2148                                         unsigned num_channels)
2149{
2150        switch (boardtype.reg_type) {
2151        case ni_reg_611x:
2152        case ni_reg_6143:
2153                /*  simultaneously-sampled inputs */
2154                return boardtype.ai_speed;
2155                break;
2156        default:
2157                /*  multiplexed inputs */
2158                break;
2159        };
2160        return boardtype.ai_speed * num_channels;
2161}
2162
2163static int ni_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
2164                         struct comedi_cmd *cmd)
2165{
2166        int err = 0;
2167        int tmp;
2168        int sources;
2169
2170        /* step 1: make sure trigger sources are trivially valid */
2171
2172        if ((cmd->flags & CMDF_WRITE)) {
2173                cmd->flags &= ~CMDF_WRITE;
2174        }
2175
2176        tmp = cmd->start_src;
2177        cmd->start_src &= TRIG_NOW | TRIG_INT | TRIG_EXT;
2178        if (!cmd->start_src || tmp != cmd->start_src)
2179                err++;
2180
2181        tmp = cmd->scan_begin_src;
2182        cmd->scan_begin_src &= TRIG_TIMER | TRIG_EXT;
2183        if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
2184                err++;
2185
2186        tmp = cmd->convert_src;
2187        sources = TRIG_TIMER | TRIG_EXT;
2188        if ((boardtype.reg_type == ni_reg_611x)
2189            || (boardtype.reg_type == ni_reg_6143))
2190                sources |= TRIG_NOW;
2191        cmd->convert_src &= sources;
2192        if (!cmd->convert_src || tmp != cmd->convert_src)
2193                err++;
2194
2195        tmp = cmd->scan_end_src;
2196        cmd->scan_end_src &= TRIG_COUNT;
2197        if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
2198                err++;
2199
2200        tmp = cmd->stop_src;
2201        cmd->stop_src &= TRIG_COUNT | TRIG_NONE;
2202        if (!cmd->stop_src || tmp != cmd->stop_src)
2203                err++;
2204
2205        if (err)
2206                return 1;
2207
2208        /* step 2: make sure trigger sources are unique and mutually compatible */
2209
2210        /* note that mutual compatiblity is not an issue here */
2211        if (cmd->start_src != TRIG_NOW &&
2212            cmd->start_src != TRIG_INT && cmd->start_src != TRIG_EXT)
2213                err++;
2214        if (cmd->scan_begin_src != TRIG_TIMER &&
2215            cmd->scan_begin_src != TRIG_EXT &&
2216            cmd->scan_begin_src != TRIG_OTHER)
2217                err++;
2218        if (cmd->convert_src != TRIG_TIMER &&
2219            cmd->convert_src != TRIG_EXT && cmd->convert_src != TRIG_NOW)
2220                err++;
2221        if (cmd->stop_src != TRIG_COUNT && cmd->stop_src != TRIG_NONE)
2222                err++;
2223
2224        if (err)
2225                return 2;
2226
2227        /* step 3: make sure arguments are trivially compatible */
2228
2229        if (cmd->start_src == TRIG_EXT) {
2230                /* external trigger */
2231                unsigned int tmp = CR_CHAN(cmd->start_arg);
2232
2233                if (tmp > 16)
2234                        tmp = 16;
2235                tmp |= (cmd->start_arg & (CR_INVERT | CR_EDGE));
2236                if (cmd->start_arg != tmp) {
2237                        cmd->start_arg = tmp;
2238                        err++;
2239                }
2240        } else {
2241                if (cmd->start_arg != 0) {
2242                        /* true for both TRIG_NOW and TRIG_INT */
2243                        cmd->start_arg = 0;
2244                        err++;
2245                }
2246        }
2247        if (cmd->scan_begin_src == TRIG_TIMER) {
2248                if (cmd->scan_begin_arg < ni_min_ai_scan_period_ns(dev,
2249                                                                   cmd->
2250                                                                   chanlist_len))
2251                {
2252                        cmd->scan_begin_arg =
2253                            ni_min_ai_scan_period_ns(dev, cmd->chanlist_len);
2254                        err++;
2255                }
2256                if (cmd->scan_begin_arg > devpriv->clock_ns * 0xffffff) {
2257                        cmd->scan_begin_arg = devpriv->clock_ns * 0xffffff;
2258                        err++;
2259                }
2260        } else if (cmd->scan_begin_src == TRIG_EXT) {
2261                /* external trigger */
2262                unsigned int tmp = CR_CHAN(cmd->scan_begin_arg);
2263
2264                if (tmp > 16)
2265                        tmp = 16;
2266                tmp |= (cmd->scan_begin_arg & (CR_INVERT | CR_EDGE));
2267                if (cmd->scan_begin_arg != tmp) {
2268                        cmd->scan_begin_arg = tmp;
2269                        err++;
2270                }
2271        } else {                /* TRIG_OTHER */
2272                if (cmd->scan_begin_arg) {
2273                        cmd->scan_begin_arg = 0;
2274                        err++;
2275                }
2276        }
2277        if (cmd->convert_src == TRIG_TIMER) {
2278                if ((boardtype.reg_type == ni_reg_611x)
2279                    || (boardtype.reg_type == ni_reg_6143)) {
2280                        if (cmd->convert_arg != 0) {
2281                                cmd->convert_arg = 0;
2282                                err++;
2283                        }
2284                } else {
2285                        if (cmd->convert_arg < boardtype.ai_speed) {
2286                                cmd->convert_arg = boardtype.ai_speed;
2287                                err++;
2288                        }
2289                        if (cmd->convert_arg > devpriv->clock_ns * 0xffff) {
2290                                cmd->convert_arg = devpriv->clock_ns * 0xffff;
2291                                err++;
2292                        }
2293                }
2294        } else if (cmd->convert_src == TRIG_EXT) {
2295                /* external trigger */
2296                unsigned int tmp = CR_CHAN(cmd->convert_arg);
2297
2298                if (tmp > 16)
2299                        tmp = 16;
2300                tmp |= (cmd->convert_arg & (CR_ALT_FILTER | CR_INVERT));
2301                if (cmd->convert_arg != tmp) {
2302                        cmd->convert_arg = tmp;
2303                        err++;
2304                }
2305        } else if (cmd->convert_src == TRIG_NOW) {
2306                if (cmd->convert_arg != 0) {
2307                        cmd->convert_arg = 0;
2308                        err++;
2309                }
2310        }
2311
2312        if (cmd->scan_end_arg != cmd->chanlist_len) {
2313                cmd->scan_end_arg = cmd->chanlist_len;
2314                err++;
2315        }
2316        if (cmd->stop_src == TRIG_COUNT) {
2317                unsigned int max_count = 0x01000000;
2318
2319                if (boardtype.reg_type == ni_reg_611x)
2320                        max_count -= num_adc_stages_611x;
2321                if (cmd->stop_arg > max_count) {
2322                        cmd->stop_arg = max_count;
2323                        err++;
2324                }
2325                if (cmd->stop_arg < 1) {
2326                        cmd->stop_arg = 1;
2327                        err++;
2328                }
2329        } else {
2330                /* TRIG_NONE */
2331                if (cmd->stop_arg != 0) {
2332                        cmd->stop_arg = 0;
2333                        err++;
2334                }
2335        }
2336
2337        if (err)
2338                return 3;
2339
2340        /* step 4: fix up any arguments */
2341
2342        if (cmd->scan_begin_src == TRIG_TIMER) {
2343                tmp = cmd->scan_begin_arg;
2344                cmd->scan_begin_arg =
2345                    ni_timer_to_ns(dev, ni_ns_to_timer(dev,
2346                                                       cmd->scan_begin_arg,
2347                                                       cmd->
2348                                                       flags &
2349                                                       TRIG_ROUND_MASK));
2350                if (tmp != cmd->scan_begin_arg)
2351                        err++;
2352        }
2353        if (cmd->convert_src == TRIG_TIMER) {
2354                if ((boardtype.reg_type != ni_reg_611x)
2355                    && (boardtype.reg_type != ni_reg_6143)) {
2356                        tmp = cmd->convert_arg;
2357                        cmd->convert_arg =
2358                            ni_timer_to_ns(dev, ni_ns_to_timer(dev,
2359                                                               cmd->convert_arg,
2360                                                               cmd->
2361                                                               flags &
2362                                                               TRIG_ROUND_MASK));
2363                        if (tmp != cmd->convert_arg)
2364                                err++;
2365                        if (cmd->scan_begin_src == TRIG_TIMER &&
2366                            cmd->scan_begin_arg <
2367                            cmd->convert_arg * cmd->scan_end_arg) {
2368                                cmd->scan_begin_arg =
2369                                    cmd->convert_arg * cmd->scan_end_arg;
2370                                err++;
2371                        }
2372                }
2373        }
2374
2375        if (err)
2376                return 4;
2377
2378        return 0;
2379}
2380
2381static int ni_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
2382{
2383        const struct comedi_cmd *cmd = &s->async->cmd;
2384        int timer;
2385        int mode1 = 0;          /* mode1 is needed for both stop and convert */
2386        int mode2 = 0;
2387        int start_stop_select = 0;
2388        unsigned int stop_count;
2389        int interrupt_a_enable = 0;
2390
2391        MDPRINTK("ni_ai_cmd\n");
2392        if (dev->irq == 0) {
2393                comedi_error(dev, "cannot run command without an irq");
2394                return -EIO;
2395        }
2396        ni_clear_ai_fifo(dev);
2397
2398        ni_load_channelgain_list(dev, cmd->chanlist_len, cmd->chanlist);
2399
2400        /* start configuration */
2401        devpriv->stc_writew(dev, AI_Configuration_Start, Joint_Reset_Register);
2402
2403        /* disable analog triggering for now, since it
2404         * interferes with the use of pfi0 */
2405        devpriv->an_trig_etc_reg &= ~Analog_Trigger_Enable;
2406        devpriv->stc_writew(dev, devpriv->an_trig_etc_reg,
2407                            Analog_Trigger_Etc_Register);
2408
2409        switch (cmd->start_src) {
2410        case TRIG_INT:
2411        case TRIG_NOW:
2412                devpriv->stc_writew(dev, AI_START2_Select(0) |
2413                                    AI_START1_Sync | AI_START1_Edge |
2414                                    AI_START1_Select(0),
2415                                    AI_Trigger_Select_Register);
2416                break;
2417        case TRIG_EXT:
2418                {
2419                        int chan = CR_CHAN(cmd->start_arg);
2420                        unsigned int bits = AI_START2_Select(0) |
2421                            AI_START1_Sync | AI_START1_Select(chan + 1);
2422
2423                        if (cmd->start_arg & CR_INVERT)
2424                                bits |= AI_START1_Polarity;
2425                        if (cmd->start_arg & CR_EDGE)
2426                                bits |= AI_START1_Edge;
2427                        devpriv->stc_writew(dev, bits,
2428                                            AI_Trigger_Select_Register);
2429                        break;
2430                }
2431        }
2432
2433        mode2 &= ~AI_Pre_Trigger;
2434        mode2 &= ~AI_SC_Initial_Load_Source;
2435        mode2 &= ~AI_SC_Reload_Mode;
2436        devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
2437
2438        if (cmd->chanlist_len == 1 || (boardtype.reg_type == ni_reg_611x)
2439            || (boardtype.reg_type == ni_reg_6143)) {
2440                start_stop_select |= AI_STOP_Polarity;
2441                start_stop_select |= AI_STOP_Select(31);        /*  logic low */
2442                start_stop_select |= AI_STOP_Sync;
2443        } else {
2444                start_stop_select |= AI_STOP_Select(19);        /*  ai configuration memory */
2445        }
2446        devpriv->stc_writew(dev, start_stop_select,
2447                            AI_START_STOP_Select_Register);
2448
2449        devpriv->ai_cmd2 = 0;
2450        switch (cmd->stop_src) {
2451        case TRIG_COUNT:
2452                stop_count = cmd->stop_arg - 1;
2453
2454                if (boardtype.reg_type == ni_reg_611x) {
2455                        /*  have to take 3 stage adc pipeline into account */
2456                        stop_count += num_adc_stages_611x;
2457                }
2458                /* stage number of scans */
2459                devpriv->stc_writel(dev, stop_count, AI_SC_Load_A_Registers);
2460
2461                mode1 |= AI_Start_Stop | AI_Mode_1_Reserved | AI_Trigger_Once;
2462                devpriv->stc_writew(dev, mode1, AI_Mode_1_Register);
2463                /* load SC (Scan Count) */
2464                devpriv->stc_writew(dev, AI_SC_Load, AI_Command_1_Register);
2465
2466                devpriv->ai_continuous = 0;
2467                if (stop_count == 0) {
2468                        devpriv->ai_cmd2 |= AI_End_On_End_Of_Scan;
2469                        interrupt_a_enable |= AI_STOP_Interrupt_Enable;
2470                        /*  this is required to get the last sample for chanlist_len > 1, not sure why */
2471                        if (cmd->chanlist_len > 1)
2472                                start_stop_select |=
2473                                    AI_STOP_Polarity | AI_STOP_Edge;
2474                }
2475                break;
2476        case TRIG_NONE:
2477                /* stage number of scans */
2478                devpriv->stc_writel(dev, 0, AI_SC_Load_A_Registers);
2479
2480                mode1 |= AI_Start_Stop | AI_Mode_1_Reserved | AI_Continuous;
2481                devpriv->stc_writew(dev, mode1, AI_Mode_1_Register);
2482
2483                /* load SC (Scan Count) */
2484                devpriv->stc_writew(dev, AI_SC_Load, AI_Command_1_Register);
2485
2486                devpriv->ai_continuous = 1;
2487
2488                break;
2489        }
2490
2491        switch (cmd->scan_begin_src) {
2492        case TRIG_TIMER:
2493                /*
2494                   stop bits for non 611x boards
2495                   AI_SI_Special_Trigger_Delay=0
2496                   AI_Pre_Trigger=0
2497                   AI_START_STOP_Select_Register:
2498                   AI_START_Polarity=0 (?)      rising edge
2499                   AI_START_Edge=1              edge triggered
2500                   AI_START_Sync=1 (?)
2501                   AI_START_Select=0            SI_TC
2502                   AI_STOP_Polarity=0           rising edge
2503                   AI_STOP_Edge=0               level
2504                   AI_STOP_Sync=1
2505                   AI_STOP_Select=19            external pin (configuration mem)
2506                 */
2507                start_stop_select |= AI_START_Edge | AI_START_Sync;
2508                devpriv->stc_writew(dev, start_stop_select,
2509                                    AI_START_STOP_Select_Register);
2510
2511                mode2 |= AI_SI_Reload_Mode(0);
2512                /* AI_SI_Initial_Load_Source=A */
2513                mode2 &= ~AI_SI_Initial_Load_Source;
2514                /* mode2 |= AI_SC_Reload_Mode; */
2515                devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
2516
2517                /* load SI */
2518                timer = ni_ns_to_timer(dev, cmd->scan_begin_arg,
2519                                       TRIG_ROUND_NEAREST);
2520                devpriv->stc_writel(dev, timer, AI_SI_Load_A_Registers);
2521                devpriv->stc_writew(dev, AI_SI_Load, AI_Command_1_Register);
2522                break;
2523        case TRIG_EXT:
2524                if (cmd->scan_begin_arg & CR_EDGE)
2525                        start_stop_select |= AI_START_Edge;
2526                /* AI_START_Polarity==1 is falling edge */
2527                if (cmd->scan_begin_arg & CR_INVERT)
2528                        start_stop_select |= AI_START_Polarity;
2529                if (cmd->scan_begin_src != cmd->convert_src ||
2530                    (cmd->scan_begin_arg & ~CR_EDGE) !=
2531                    (cmd->convert_arg & ~CR_EDGE))
2532                        start_stop_select |= AI_START_Sync;
2533                start_stop_select |=
2534                    AI_START_Select(1 + CR_CHAN(cmd->scan_begin_arg));
2535                devpriv->stc_writew(dev, start_stop_select,
2536                                    AI_START_STOP_Select_Register);
2537                break;
2538        }
2539
2540        switch (cmd->convert_src) {
2541        case TRIG_TIMER:
2542        case TRIG_NOW:
2543                if (cmd->convert_arg == 0 || cmd->convert_src == TRIG_NOW)
2544                        timer = 1;
2545                else
2546                        timer = ni_ns_to_timer(dev, cmd->convert_arg,
2547                                               TRIG_ROUND_NEAREST);
2548                devpriv->stc_writew(dev, 1, AI_SI2_Load_A_Register);    /* 0,0 does not work. */
2549                devpriv->stc_writew(dev, timer, AI_SI2_Load_B_Register);
2550
2551                /* AI_SI2_Reload_Mode = alternate */
2552                /* AI_SI2_Initial_Load_Source = A */
2553                mode2 &= ~AI_SI2_Initial_Load_Source;
2554                mode2 |= AI_SI2_Reload_Mode;
2555                devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
2556
2557                /* AI_SI2_Load */
2558                devpriv->stc_writew(dev, AI_SI2_Load, AI_Command_1_Register);
2559
2560                mode2 |= AI_SI2_Reload_Mode;    /*  alternate */
2561                mode2 |= AI_SI2_Initial_Load_Source;    /*  B */
2562
2563                devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
2564                break;
2565        case TRIG_EXT:
2566                mode1 |= AI_CONVERT_Source_Select(1 + cmd->convert_arg);
2567                if ((cmd->convert_arg & CR_INVERT) == 0)
2568                        mode1 |= AI_CONVERT_Source_Polarity;
2569                devpriv->stc_writew(dev, mode1, AI_Mode_1_Register);
2570
2571                mode2 |= AI_Start_Stop_Gate_Enable | AI_SC_Gate_Enable;
2572                devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
2573
2574                break;
2575        }
2576
2577        if (dev->irq) {
2578
2579                /* interrupt on FIFO, errors, SC_TC */
2580                interrupt_a_enable |= AI_Error_Interrupt_Enable |
2581                    AI_SC_TC_Interrupt_Enable;
2582
2583#ifndef PCIDMA
2584                interrupt_a_enable |= AI_FIFO_Interrupt_Enable;
2585#endif
2586
2587                if (cmd->flags & TRIG_WAKE_EOS
2588                    || (devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)) {
2589                        /* wake on end-of-scan */
2590                        devpriv->aimode = AIMODE_SCAN;
2591                } else {
2592                        devpriv->aimode = AIMODE_HALF_FULL;
2593                }
2594
2595                switch (devpriv->aimode) {
2596                case AIMODE_HALF_FULL:
2597                        /*generate FIFO interrupts and DMA requests on half-full */
2598#ifdef PCIDMA
2599                        devpriv->stc_writew(dev, AI_FIFO_Mode_HF_to_E,
2600                                            AI_Mode_3_Register);
2601#else
2602                        devpriv->stc_writew(dev, AI_FIFO_Mode_HF,
2603                                            AI_Mode_3_Register);
2604#endif
2605                        break;
2606                case AIMODE_SAMPLE:
2607                        /*generate FIFO interrupts on non-empty */
2608                        devpriv->stc_writew(dev, AI_FIFO_Mode_NE,
2609                                            AI_Mode_3_Register);
2610                        break;
2611                case AIMODE_SCAN:
2612#ifdef PCIDMA
2613                        devpriv->stc_writew(dev, AI_FIFO_Mode_NE,
2614                                            AI_Mode_3_Register);
2615#else
2616                        devpriv->stc_writew(dev, AI_FIFO_Mode_HF,
2617                                            AI_Mode_3_Register);
2618#endif
2619                        interrupt_a_enable |= AI_STOP_Interrupt_Enable;
2620                        break;
2621                default:
2622                        break;
2623                }
2624
2625                devpriv->stc_writew(dev, AI_Error_Interrupt_Ack | AI_STOP_Interrupt_Ack | AI_START_Interrupt_Ack | AI_START2_Interrupt_Ack | AI_START1_Interrupt_Ack | AI_SC_TC_Interrupt_Ack | AI_SC_TC_Error_Confirm, Interrupt_A_Ack_Register);      /* clear interrupts */
2626
2627                ni_set_bits(dev, Interrupt_A_Enable_Register,
2628                            interrupt_a_enable, 1);
2629
2630                MDPRINTK("Interrupt_A_Enable_Register = 0x%04x\n",
2631                         devpriv->int_a_enable_reg);
2632        } else {
2633                /* interrupt on nothing */
2634                ni_set_bits(dev, Interrupt_A_Enable_Register, ~0, 0);
2635
2636                /* XXX start polling if necessary */
2637                MDPRINTK("interrupting on nothing\n");
2638        }
2639
2640        /* end configuration */
2641        devpriv->stc_writew(dev, AI_Configuration_End, Joint_Reset_Register);
2642
2643        switch (cmd->scan_begin_src) {
2644        case TRIG_TIMER:
2645                devpriv->stc_writew(dev,
2646                                    AI_SI2_Arm | AI_SI_Arm | AI_DIV_Arm |
2647                                    AI_SC_Arm, AI_Command_1_Register);
2648                break;
2649        case TRIG_EXT:
2650                /* XXX AI_SI_Arm? */
2651                devpriv->stc_writew(dev,
2652                                    AI_SI2_Arm | AI_SI_Arm | AI_DIV_Arm |
2653                                    AI_SC_Arm, AI_Command_1_Register);
2654                break;
2655        }
2656
2657#ifdef PCIDMA
2658        {
2659                int retval = ni_ai_setup_MITE_dma(dev);
2660                if (retval)
2661                        return retval;
2662        }
2663        /* mite_dump_regs(devpriv->mite); */
2664#endif
2665
2666        switch (cmd->start_src) {
2667        case TRIG_NOW:
2668                /* AI_START1_Pulse */
2669                devpriv->stc_writew(dev, AI_START1_Pulse | devpriv->ai_cmd2,
2670                                    AI_Command_2_Register);
2671                s->async->inttrig = NULL;
2672                break;
2673        case TRIG_EXT:
2674                s->async->inttrig = NULL;
2675                break;
2676        case TRIG_INT:
2677                s->async->inttrig = &ni_ai_inttrig;
2678                break;
2679        }
2680
2681        MDPRINTK("exit ni_ai_cmd\n");
2682
2683        return 0;
2684}
2685
2686static int ni_ai_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
2687                         unsigned int trignum)
2688{
2689        if (trignum != 0)
2690                return -EINVAL;
2691
2692        devpriv->stc_writew(dev, AI_START1_Pulse | devpriv->ai_cmd2,
2693                            AI_Command_2_Register);
2694        s->async->inttrig = NULL;
2695
2696        return 1;
2697}
2698
2699static int ni_ai_config_analog_trig(struct comedi_device *dev,
2700                                    struct comedi_subdevice *s,
2701                                    struct comedi_insn *insn,
2702                                    unsigned int *data);
2703
2704static int ni_ai_insn_config(struct comedi_device *dev,
2705                             struct comedi_subdevice *s,
2706                             struct comedi_insn *insn, unsigned int *data)
2707{
2708        if (insn->n < 1)
2709                return -EINVAL;
2710
2711        switch (data[0]) {
2712        case INSN_CONFIG_ANALOG_TRIG:
2713                return ni_ai_config_analog_trig(dev, s, insn, data);
2714        case INSN_CONFIG_ALT_SOURCE:
2715                if (boardtype.reg_type & ni_reg_m_series_mask) {
2716                        if (data[1] & ~(MSeries_AI_Bypass_Cal_Sel_Pos_Mask |
2717                                        MSeries_AI_Bypass_Cal_Sel_Neg_Mask |
2718                                        MSeries_AI_Bypass_Mode_Mux_Mask |
2719                                        MSeries_AO_Bypass_AO_Cal_Sel_Mask)) {
2720                                return -EINVAL;
2721                        }
2722                        devpriv->ai_calib_source = data[1];
2723                } else if (boardtype.reg_type == ni_reg_6143) {
2724                        unsigned int calib_source;
2725
2726                        calib_source = data[1] & 0xf;
2727
2728                        if (calib_source > 0xF)
2729                                return -EINVAL;
2730
2731                        devpriv->ai_calib_source = calib_source;
2732                        ni_writew(calib_source, Calibration_Channel_6143);
2733                } else {
2734                        unsigned int calib_source;
2735                        unsigned int calib_source_adjust;
2736
2737                        calib_source = data[1] & 0xf;
2738                        calib_source_adjust = (data[1] >> 4) & 0xff;
2739
2740                        if (calib_source >= 8)
2741                                return -EINVAL;
2742                        devpriv->ai_calib_source = calib_source;
2743                        if (boardtype.reg_type == ni_reg_611x) {
2744                                ni_writeb(calib_source_adjust,
2745                                          Cal_Gain_Select_611x);
2746                        }
2747                }
2748                return 2;
2749        default:
2750                break;
2751        }
2752
2753        return -EINVAL;
2754}
2755
2756static int ni_ai_config_analog_trig(struct comedi_device *dev,
2757                                    struct comedi_subdevice *s,
2758                                    struct comedi_insn *insn,
2759                                    unsigned int *data)
2760{
2761        unsigned int a, b, modebits;
2762        int err = 0;
2763
2764        /* data[1] is flags
2765         * data[2] is analog line
2766         * data[3] is set level
2767         * data[4] is reset level */
2768        if (!boardtype.has_analog_trig)
2769                return -EINVAL;
2770        if ((data[1] & 0xffff0000) != COMEDI_EV_SCAN_BEGIN) {
2771                data[1] &= (COMEDI_EV_SCAN_BEGIN | 0xffff);
2772                err++;
2773        }
2774        if (data[2] >= boardtype.n_adchan) {
2775                data[2] = boardtype.n_adchan - 1;
2776                err++;
2777        }
2778        if (data[3] > 255) {    /* a */
2779                data[3] = 255;
2780                err++;
2781        }
2782        if (data[4] > 255) {    /* b */
2783                data[4] = 255;
2784                err++;
2785        }
2786        /*
2787         * 00 ignore
2788         * 01 set
2789         * 10 reset
2790         *
2791         * modes:
2792         *   1 level:                    +b-   +a-
2793         *     high mode                00 00 01 10
2794         *     low mode                 00 00 10 01
2795         *   2 level: (a<b)
2796         *     hysteresis low mode      10 00 00 01
2797         *     hysteresis high mode     01 00 00 10
2798         *     middle mode              10 01 01 10
2799         */
2800
2801        a = data[3];
2802        b = data[4];
2803        modebits = data[1] & 0xff;
2804        if (modebits & 0xf0) {
2805                /* two level mode */
2806                if (b < a) {
2807                        /* swap order */
2808                        a = data[4];
2809                        b = data[3];
2810                        modebits =
2811                            ((data[1] & 0xf) << 4) | ((data[1] & 0xf0) >> 4);
2812                }
2813                devpriv->atrig_low = a;
2814                devpriv->atrig_high = b;
2815                switch (modebits) {
2816                case 0x81:      /* low hysteresis mode */
2817                        devpriv->atrig_mode = 6;
2818                        break;
2819                case 0x42:      /* high hysteresis mode */
2820                        devpriv->atrig_mode = 3;
2821                        break;
2822                case 0x96:      /* middle window mode */
2823                        devpriv->atrig_mode = 2;
2824                        break;
2825                default:
2826                        data[1] &= ~0xff;
2827                        err++;
2828                }
2829        } else {
2830                /* one level mode */
2831                if (b != 0) {
2832                        data[4] = 0;
2833                        err++;
2834                }
2835                switch (modebits) {
2836                case 0x06:      /* high window mode */
2837                        devpriv->atrig_high = a;
2838                        devpriv->atrig_mode = 0;
2839                        break;
2840                case 0x09:      /* low window mode */
2841                        devpriv->atrig_low = a;
2842                        devpriv->atrig_mode = 1;
2843                        break;
2844                default:
2845                        data[1] &= ~0xff;
2846                        err++;
2847                }
2848        }
2849        if (err)
2850                return -EAGAIN;
2851        return 5;
2852}
2853
2854/* munge data from unsigned to 2's complement for analog output bipolar modes */
2855static void ni_ao_munge(struct comedi_device *dev, struct comedi_subdevice *s,
2856                        void *data, unsigned int num_bytes,
2857                        unsigned int chan_index)
2858{
2859        struct comedi_async *async = s->async;
2860        unsigned int range;
2861        unsigned int i;
2862        unsigned int offset;
2863        unsigned int length = num_bytes / sizeof(short);
2864        short *array = data;
2865
2866        offset = 1 << (boardtype.aobits - 1);
2867        for (i = 0; i < length; i++) {
2868                range = CR_RANGE(async->cmd.chanlist[chan_index]);
2869                if (boardtype.ao_unipolar == 0 || (range & 1) == 0)
2870                        array[i] -= offset;
2871#ifdef PCIDMA
2872                array[i] = cpu_to_le16(array[i]);
2873#endif
2874                chan_index++;
2875                chan_index %= async->cmd.chanlist_len;
2876        }
2877}
2878
2879static int ni_m_series_ao_config_chanlist(struct comedi_device *dev,
2880                                          struct comedi_subdevice *s,
2881                                          unsigned int chanspec[],
2882                                          unsigned int n_chans, int timed)
2883{
2884        unsigned int range;
2885        unsigned int chan;
2886        unsigned int conf;
2887        int i;
2888        int invert = 0;
2889
2890        if (timed) {
2891                for (i = 0; i < boardtype.n_aochan; ++i) {
2892                        devpriv->ao_conf[i] &= ~MSeries_AO_Update_Timed_Bit;
2893                        ni_writeb(devpriv->ao_conf[i],
2894                                  M_Offset_AO_Config_Bank(i));
2895                        ni_writeb(0xf, M_Offset_AO_Waveform_Order(i));
2896                }
2897        }
2898        for (i = 0; i < n_chans; i++) {
2899                const struct comedi_krange *krange;
2900                chan = CR_CHAN(chanspec[i]);
2901                range = CR_RANGE(chanspec[i]);
2902                krange = s->range_table->range + range;
2903                invert = 0;
2904                conf = 0;
2905                switch (krange->max - krange->min) {
2906                case 20000000:
2907                        conf |= MSeries_AO_DAC_Reference_10V_Internal_Bits;
2908                        ni_writeb(0, M_Offset_AO_Reference_Attenuation(chan));
2909                        break;
2910                case 10000000:
2911                        conf |= MSeries_AO_DAC_Reference_5V_Internal_Bits;
2912                        ni_writeb(0, M_Offset_AO_Reference_Attenuation(chan));
2913                        break;
2914                case 4000000:
2915                        conf |= MSeries_AO_DAC_Reference_10V_Internal_Bits;
2916                        ni_writeb(MSeries_Attenuate_x5_Bit,
2917                                  M_Offset_AO_Reference_Attenuation(chan));
2918                        break;
2919                case 2000000:
2920                        conf |= MSeries_AO_DAC_Reference_5V_Internal_Bits;
2921                        ni_writeb(MSeries_Attenuate_x5_Bit,
2922                                  M_Offset_AO_Reference_Attenuation(chan));
2923                        break;
2924                default:
2925                        printk("%s: bug! unhandled ao reference voltage\n",
2926                               __func__);
2927                        break;
2928                }
2929                switch (krange->max + krange->min) {
2930                case 0:
2931                        conf |= MSeries_AO_DAC_Offset_0V_Bits;
2932                        break;
2933                case 10000000:
2934                        conf |= MSeries_AO_DAC_Offset_5V_Bits;
2935                        break;
2936                default:
2937                        printk("%s: bug! unhandled ao offset voltage\n",
2938                               __func__);
2939                        break;
2940                }
2941                if (timed)
2942                        conf |= MSeries_AO_Update_Timed_Bit;
2943                ni_writeb(conf, M_Offset_AO_Config_Bank(chan));
2944                devpriv->ao_conf[chan] = conf;
2945                ni_writeb(i, M_Offset_AO_Waveform_Order(chan));
2946        }
2947        return invert;
2948}
2949
2950static int ni_old_ao_config_chanlist(struct comedi_device *dev,
2951                                     struct comedi_subdevice *s,
2952                                     unsigned int chanspec[],
2953                                     unsigned int n_chans)
2954{
2955        unsigned int range;
2956        unsigned int chan;
2957        unsigned int conf;
2958        int i;
2959        int invert = 0;
2960
2961        for (i = 0; i < n_chans; i++) {
2962                chan = CR_CHAN(chanspec[i]);
2963                range = CR_RANGE(chanspec[i]);
2964                conf = AO_Channel(chan);
2965
2966                if (boardtype.ao_unipolar) {
2967                        if ((range & 1) == 0) {
2968                                conf |= AO_Bipolar;
2969                                invert = (1 << (boardtype.aobits - 1));
2970                        } else {
2971                                invert = 0;
2972                        }
2973                        if (range & 2)
2974                                conf |= AO_Ext_Ref;
2975                } else {
2976                        conf |= AO_Bipolar;
2977                        invert = (1 << (boardtype.aobits - 1));
2978                }
2979
2980                /* not all boards can deglitch, but this shouldn't hurt */
2981                if (chanspec[i] & CR_DEGLITCH)
2982                        conf |= AO_Deglitch;
2983
2984                /* analog reference */
2985                /* AREF_OTHER connects AO ground to AI ground, i think */
2986                conf |= (CR_AREF(chanspec[i]) ==
2987                         AREF_OTHER) ? AO_Ground_Ref : 0;
2988
2989                ni_writew(conf, AO_Configuration);
2990                devpriv->ao_conf[chan] = conf;
2991        }
2992        return invert;
2993}
2994
2995static int ni_ao_config_chanlist(struct comedi_device *dev,
2996                                 struct comedi_subdevice *s,
2997                                 unsigned int chanspec[], unsigned int n_chans,
2998                                 int timed)
2999{
3000        if (boardtype.reg_type & ni_reg_m_series_mask)
3001                return ni_m_series_ao_config_chanlist(dev, s, chanspec, n_chans,
3002                                                      timed);
3003        else
3004                return ni_old_ao_config_chanlist(dev, s, chanspec, n_chans);
3005}
3006
3007static int ni_ao_insn_read(struct comedi_device *dev,
3008                           struct comedi_subdevice *s, struct comedi_insn *insn,
3009                           unsigned int *data)
3010{
3011        data[0] = devpriv->ao[CR_CHAN(insn->chanspec)];
3012
3013        return 1;
3014}
3015
3016static int ni_ao_insn_write(struct comedi_device *dev,
3017                            struct comedi_subdevice *s,
3018                            struct comedi_insn *insn, unsigned int *data)
3019{
3020        unsigned int chan = CR_CHAN(insn->chanspec);
3021        unsigned int invert;
3022
3023        invert = ni_ao_config_chanlist(dev, s, &insn->chanspec, 1, 0);
3024
3025        devpriv->ao[chan] = data[0];
3026
3027        if (boardtype.reg_type & ni_reg_m_series_mask) {
3028                ni_writew(data[0], M_Offset_DAC_Direct_Data(chan));
3029        } else
3030                ni_writew(data[0] ^ invert,
3031                          (chan) ? DAC1_Direct_Data : DAC0_Direct_Data);
3032
3033        return 1;
3034}
3035
3036static int ni_ao_insn_write_671x(struct comedi_device *dev,
3037                                 struct comedi_subdevice *s,
3038                                 struct comedi_insn *insn, unsigned int *data)
3039{
3040        unsigned int chan = CR_CHAN(insn->chanspec);
3041        unsigned int invert;
3042
3043        ao_win_out(1 << chan, AO_Immediate_671x);
3044        invert = 1 << (boardtype.aobits - 1);
3045
3046        ni_ao_config_chanlist(dev, s, &insn->chanspec, 1, 0);
3047
3048        devpriv->ao[chan] = data[0];
3049        ao_win_out(data[0] ^ invert, DACx_Direct_Data_671x(chan));
3050
3051        return 1;
3052}
3053
3054static int ni_ao_insn_config(struct comedi_device *dev,
3055                             struct comedi_subdevice *s,
3056                             struct comedi_insn *insn, unsigned int *data)
3057{
3058        switch (data[0]) {
3059        case INSN_CONFIG_GET_HARDWARE_BUFFER_SIZE:
3060                switch (data[1]) {
3061                case COMEDI_OUTPUT:
3062                        data[2] = 1 + boardtype.ao_fifo_depth * sizeof(short);
3063                        if (devpriv->mite)
3064                                data[2] += devpriv->mite->fifo_size;
3065                        break;
3066                case COMEDI_INPUT:
3067                        data[2] = 0;
3068                        break;
3069                default:
3070                        return -EINVAL;
3071                        break;
3072                }
3073                return 0;
3074        default:
3075                break;
3076        }
3077
3078        return -EINVAL;
3079}
3080
3081static int ni_ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
3082                         unsigned int trignum)
3083{
3084        int ret;
3085        int interrupt_b_bits;
3086        int i;
3087        static const int timeout = 1000;
3088
3089        if (trignum != 0)
3090                return -EINVAL;
3091
3092        /* Null trig at beginning prevent ao start trigger from executing more than
3093           once per command (and doing things like trying to allocate the ao dma channel
3094           multiple times) */
3095        s->async->inttrig = NULL;
3096
3097        ni_set_bits(dev, Interrupt_B_Enable_Register,
3098                    AO_FIFO_Interrupt_Enable | AO_Error_Interrupt_Enable, 0);
3099        interrupt_b_bits = AO_Error_Interrupt_Enable;
3100#ifdef PCIDMA
3101        devpriv->stc_writew(dev, 1, DAC_FIFO_Clear);
3102        if (boardtype.reg_type & ni_reg_6xxx_mask)
3103                ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x);
3104        ret = ni_ao_setup_MITE_dma(dev);
3105        if (ret)
3106                return ret;
3107        ret = ni_ao_wait_for_dma_load(dev);
3108        if (ret < 0)
3109                return ret;
3110#else
3111        ret = ni_ao_prep_fifo(dev, s);
3112        if (ret == 0)
3113                return -EPIPE;
3114
3115        interrupt_b_bits |= AO_FIFO_Interrupt_Enable;
3116#endif
3117
3118        devpriv->stc_writew(dev, devpriv->ao_mode3 | AO_Not_An_UPDATE,
3119                            AO_Mode_3_Register);
3120        devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
3121        /* wait for DACs to be loaded */
3122        for (i = 0; i < timeout; i++) {
3123                udelay(1);
3124                if ((devpriv->stc_readw(dev,
3125                                        Joint_Status_2_Register) &
3126                     AO_TMRDACWRs_In_Progress_St) == 0)
3127                        break;
3128        }
3129        if (i == timeout) {
3130                comedi_error(dev,
3131                             "timed out waiting for AO_TMRDACWRs_In_Progress_St to clear");
3132                return -EIO;
3133        }
3134        /*  stc manual says we are need to clear error interrupt after AO_TMRDACWRs_In_Progress_St clears */
3135        devpriv->stc_writew(dev, AO_Error_Interrupt_Ack,
3136                            Interrupt_B_Ack_Register);
3137
3138        ni_set_bits(dev, Interrupt_B_Enable_Register, interrupt_b_bits, 1);
3139
3140        devpriv->stc_writew(dev,
3141                            devpriv->ao_cmd1 | AO_UI_Arm | AO_UC_Arm | AO_BC_Arm
3142                            | AO_DAC1_Update_Mode | AO_DAC0_Update_Mode,
3143                            AO_Command_1_Register);
3144
3145        devpriv->stc_writew(dev, devpriv->ao_cmd2 | AO_START1_Pulse,
3146                            AO_Command_2_Register);
3147
3148        return 0;
3149}
3150
3151static int ni_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
3152{
3153        const struct comedi_cmd *cmd = &s->async->cmd;
3154        int bits;
3155        int i;
3156        unsigned trigvar;
3157
3158        if (dev->irq == 0) {
3159                comedi_error(dev, "cannot run command without an irq");
3160                return -EIO;
3161        }
3162
3163        devpriv->stc_writew(dev, AO_Configuration_Start, Joint_Reset_Register);
3164
3165        devpriv->stc_writew(dev, AO_Disarm, AO_Command_1_Register);
3166
3167        if (boardtype.reg_type & ni_reg_6xxx_mask) {
3168                ao_win_out(CLEAR_WG, AO_Misc_611x);
3169
3170                bits = 0;
3171                for (i = 0; i < cmd->chanlist_len; i++) {
3172                        int chan;
3173
3174                        chan = CR_CHAN(cmd->chanlist[i]);
3175                        bits |= 1 << chan;
3176                        ao_win_out(chan, AO_Waveform_Generation_611x);
3177                }
3178                ao_win_out(bits, AO_Timed_611x);
3179        }
3180
3181        ni_ao_config_chanlist(dev, s, cmd->chanlist, cmd->chanlist_len, 1);
3182
3183        if (cmd->stop_src == TRIG_NONE) {
3184                devpriv->ao_mode1 |= AO_Continuous;
3185                devpriv->ao_mode1 &= ~AO_Trigger_Once;
3186        } else {
3187                devpriv->ao_mode1 &= ~AO_Continuous;
3188                devpriv->ao_mode1 |= AO_Trigger_Once;
3189        }
3190        devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
3191        switch (cmd->start_src) {
3192        case TRIG_INT:
3193        case TRIG_NOW:
3194                devpriv->ao_trigger_select &=
3195                    ~(AO_START1_Polarity | AO_START1_Select(-1));
3196                devpriv->ao_trigger_select |= AO_START1_Edge | AO_START1_Sync;
3197                devpriv->stc_writew(dev, devpriv->ao_trigger_select,
3198                                    AO_Trigger_Select_Register);
3199                break;
3200        case TRIG_EXT:
3201                devpriv->ao_trigger_select =
3202                    AO_START1_Select(CR_CHAN(cmd->start_arg) + 1);
3203                if (cmd->start_arg & CR_INVERT)
3204                        devpriv->ao_trigger_select |= AO_START1_Polarity;       /*  0=active high, 1=active low. see daq-stc 3-24 (p186) */
3205                if (cmd->start_arg & CR_EDGE)
3206                        devpriv->ao_trigger_select |= AO_START1_Edge;   /*  0=edge detection disabled, 1=enabled */
3207                devpriv->stc_writew(dev, devpriv->ao_trigger_select,
3208                                    AO_Trigger_Select_Register);
3209                break;
3210        default:
3211                BUG();
3212                break;
3213        }
3214        devpriv->ao_mode3 &= ~AO_Trigger_Length;
3215        devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
3216
3217        devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
3218        devpriv->ao_mode2 &= ~AO_BC_Initial_Load_Source;
3219        devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
3220        if (cmd->stop_src == TRIG_NONE) {
3221                devpriv->stc_writel(dev, 0xffffff, AO_BC_Load_A_Register);
3222        } else {
3223                devpriv->stc_writel(dev, 0, AO_BC_Load_A_Register);
3224        }
3225        devpriv->stc_writew(dev, AO_BC_Load, AO_Command_1_Register);
3226        devpriv->ao_mode2 &= ~AO_UC_Initial_Load_Source;
3227        devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
3228        switch (cmd->stop_src) {
3229        case TRIG_COUNT:
3230                if (boardtype.reg_type & ni_reg_m_series_mask) {
3231                        /*  this is how the NI example code does it for m-series boards, verified correct with 6259 */
3232                        devpriv->stc_writel(dev, cmd->stop_arg - 1,
3233                                            AO_UC_Load_A_Register);
3234                        devpriv->stc_writew(dev, AO_UC_Load,
3235                                            AO_Command_1_Register);
3236                } else {
3237                        devpriv->stc_writel(dev, cmd->stop_arg,
3238                                            AO_UC_Load_A_Register);
3239                        devpriv->stc_writew(dev, AO_UC_Load,
3240                                            AO_Command_1_Register);
3241                        devpriv->stc_writel(dev, cmd->stop_arg - 1,
3242                                            AO_UC_Load_A_Register);
3243                }
3244                break;
3245        case TRIG_NONE:
3246                devpriv->stc_writel(dev, 0xffffff, AO_UC_Load_A_Register);
3247                devpriv->stc_writew(dev, AO_UC_Load, AO_Command_1_Register);
3248                devpriv->stc_writel(dev, 0xffffff, AO_UC_Load_A_Register);
3249                break;
3250        default:
3251                devpriv->stc_writel(dev, 0, AO_UC_Load_A_Register);
3252                devpriv->stc_writew(dev, AO_UC_Load, AO_Command_1_Register);
3253                devpriv->stc_writel(dev, cmd->stop_arg, AO_UC_Load_A_Register);
3254        }
3255
3256        devpriv->ao_mode1 &=
3257            ~(AO_UI_Source_Select(0x1f) | AO_UI_Source_Polarity |
3258              AO_UPDATE_Source_Select(0x1f) | AO_UPDATE_Source_Polarity);
3259        switch (cmd->scan_begin_src) {
3260        case TRIG_TIMER:
3261                devpriv->ao_cmd2 &= ~AO_BC_Gate_Enable;
3262                trigvar =
3263                    ni_ns_to_timer(dev, cmd->scan_begin_arg,
3264                                   TRIG_ROUND_NEAREST);
3265                devpriv->stc_writel(dev, 1, AO_UI_Load_A_Register);
3266                devpriv->stc_writew(dev, AO_UI_Load, AO_Command_1_Register);
3267                devpriv->stc_writel(dev, trigvar, AO_UI_Load_A_Register);
3268                break;
3269        case TRIG_EXT:
3270                devpriv->ao_mode1 |=
3271                    AO_UPDATE_Source_Select(cmd->scan_begin_arg);
3272                if (cmd->scan_begin_arg & CR_INVERT)
3273                        devpriv->ao_mode1 |= AO_UPDATE_Source_Polarity;
3274                devpriv->ao_cmd2 |= AO_BC_Gate_Enable;
3275                break;
3276        default:
3277                BUG();
3278                break;
3279        }
3280        devpriv->stc_writew(dev, devpriv->ao_cmd2, AO_Command_2_Register);
3281        devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
3282        devpriv->ao_mode2 &=
3283            ~(AO_UI_Reload_Mode(3) | AO_UI_Initial_Load_Source);
3284        devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
3285
3286        if (cmd->scan_end_arg > 1) {
3287                devpriv->ao_mode1 |= AO_Multiple_Channels;
3288                devpriv->stc_writew(dev,
3289                                    AO_Number_Of_Channels(cmd->scan_end_arg -
3290                                                          1) |
3291                                    AO_UPDATE_Output_Select
3292                                    (AO_Update_Output_High_Z),
3293                                    AO_Output_Control_Register);
3294        } else {
3295                unsigned bits;
3296                devpriv->ao_mode1 &= ~AO_Multiple_Channels;
3297                bits = AO_UPDATE_Output_Select(AO_Update_Output_High_Z);
3298                if (boardtype.
3299                    reg_type & (ni_reg_m_series_mask | ni_reg_6xxx_mask)) {
3300                        bits |= AO_Number_Of_Channels(0);
3301                } else {
3302                        bits |=
3303                            AO_Number_Of_Channels(CR_CHAN(cmd->chanlist[0]));
3304                }
3305                devpriv->stc_writew(dev, bits, AO_Output_Control_Register);
3306        }
3307        devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
3308
3309        devpriv->stc_writew(dev, AO_DAC0_Update_Mode | AO_DAC1_Update_Mode,
3310                            AO_Command_1_Register);
3311
3312        devpriv->ao_mode3 |= AO_Stop_On_Overrun_Error;
3313        devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
3314
3315        devpriv->ao_mode2 &= ~AO_FIFO_Mode_Mask;
3316#ifdef PCIDMA
3317        devpriv->ao_mode2 |= AO_FIFO_Mode_HF_to_F;
3318#else
3319        devpriv->ao_mode2 |= AO_FIFO_Mode_HF;
3320#endif
3321        devpriv->ao_mode2 &= ~AO_FIFO_Retransmit_Enable;
3322        devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
3323
3324        bits = AO_BC_Source_Select | AO_UPDATE_Pulse_Width |
3325            AO_TMRDACWR_Pulse_Width;
3326        if (boardtype.ao_fifo_depth)
3327                bits |= AO_FIFO_Enable;
3328        else
3329                bits |= AO_DMA_PIO_Control;
3330#if 0
3331        /* F Hess: windows driver does not set AO_Number_Of_DAC_Packages bit for 6281,
3332           verified with bus analyzer. */
3333        if (boardtype.reg_type & ni_reg_m_series_mask)
3334                bits |= AO_Number_Of_DAC_Packages;
3335#endif
3336        devpriv->stc_writew(dev, bits, AO_Personal_Register);
3337        /*  enable sending of ao dma requests */
3338        devpriv->stc_writew(dev, AO_AOFREQ_Enable, AO_Start_Select_Register);
3339
3340        devpriv->stc_writew(dev, AO_Configuration_End, Joint_Reset_Register);
3341
3342        if (cmd->stop_src == TRIG_COUNT) {
3343                devpriv->stc_writew(dev, AO_BC_TC_Interrupt_Ack,
3344                                    Interrupt_B_Ack_Register);
3345                ni_set_bits(dev, Interrupt_B_Enable_Register,
3346                            AO_BC_TC_Interrupt_Enable, 1);
3347        }
3348
3349        s->async->inttrig = &ni_ao_inttrig;
3350
3351        return 0;
3352}
3353
3354static int ni_ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
3355                         struct comedi_cmd *cmd)
3356{
3357        int err = 0;
3358        int tmp;
3359
3360        /* step 1: make sure trigger sources are trivially valid */
3361
3362        if ((cmd->flags & CMDF_WRITE) == 0) {
3363                cmd->flags |= CMDF_WRITE;
3364        }
3365
3366        tmp = cmd->start_src;
3367        cmd->start_src &= TRIG_INT | TRIG_EXT;
3368        if (!cmd->start_src || tmp != cmd->start_src)
3369                err++;
3370
3371        tmp = cmd->scan_begin_src;
3372        cmd->scan_begin_src &= TRIG_TIMER | TRIG_EXT;
3373        if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
3374                err++;
3375
3376        tmp = cmd->convert_src;
3377        cmd->convert_src &= TRIG_NOW;
3378        if (!cmd->convert_src || tmp != cmd->convert_src)
3379                err++;
3380
3381        tmp = cmd->scan_end_src;
3382        cmd->scan_end_src &= TRIG_COUNT;
3383        if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
3384                err++;
3385
3386        tmp = cmd->stop_src;
3387        cmd->stop_src &= TRIG_COUNT | TRIG_NONE;
3388        if (!cmd->stop_src || tmp != cmd->stop_src)
3389                err++;
3390
3391        if (err)
3392                return 1;
3393
3394        /* step 2: make sure trigger sources are unique and mutually compatible */
3395
3396        if (cmd->stop_src != TRIG_COUNT && cmd->stop_src != TRIG_NONE)
3397                err++;
3398
3399        if (err)
3400                return 2;
3401
3402        /* step 3: make sure arguments are trivially compatible */
3403
3404        if (cmd->start_src == TRIG_EXT) {
3405                /* external trigger */
3406                unsigned int tmp = CR_CHAN(cmd->start_arg);
3407
3408                if (tmp > 18)
3409                        tmp = 18;
3410                tmp |= (cmd->start_arg & (CR_INVERT | CR_EDGE));
3411                if (cmd->start_arg != tmp) {
3412                        cmd->start_arg = tmp;
3413                        err++;
3414                }
3415        } else {
3416                if (cmd->start_arg != 0) {
3417                        /* true for both TRIG_NOW and TRIG_INT */
3418                        cmd->start_arg = 0;
3419                        err++;
3420                }
3421        }
3422        if (cmd->scan_begin_src == TRIG_TIMER) {
3423                if (cmd->scan_begin_arg < boardtype.ao_speed) {
3424                        cmd->scan_begin_arg = boardtype.ao_speed;
3425                        err++;
3426                }
3427                if (cmd->scan_begin_arg > devpriv->clock_ns * 0xffffff) {       /* XXX check */
3428                        cmd->scan_begin_arg = devpriv->clock_ns * 0xffffff;
3429                        err++;
3430                }
3431        }
3432        if (cmd->convert_arg != 0) {
3433                cmd->convert_arg = 0;
3434                err++;
3435        }
3436        if (cmd->scan_end_arg != cmd->chanlist_len) {
3437                cmd->scan_end_arg = cmd->chanlist_len;
3438                err++;
3439        }
3440        if (cmd->stop_src == TRIG_COUNT) {      /* XXX check */
3441                if (cmd->stop_arg > 0x00ffffff) {
3442                        cmd->stop_arg = 0x00ffffff;
3443                        err++;
3444                }
3445        } else {
3446                /* TRIG_NONE */
3447                if (cmd->stop_arg != 0) {
3448                        cmd->stop_arg = 0;
3449                        err++;
3450                }
3451        }
3452
3453        if (err)
3454                return 3;
3455
3456        /* step 4: fix up any arguments */
3457        if (cmd->scan_begin_src == TRIG_TIMER) {
3458                tmp = cmd->scan_begin_arg;
3459                cmd->scan_begin_arg =
3460                    ni_timer_to_ns(dev, ni_ns_to_timer(dev,
3461                                                       cmd->scan_begin_arg,
3462                                                       cmd->
3463                                                       flags &
3464                                                       TRIG_ROUND_MASK));
3465                if (tmp != cmd->scan_begin_arg)
3466                        err++;
3467        }
3468        if (err)
3469                return 4;
3470
3471        /* step 5: fix up chanlist */
3472
3473        if (err)
3474                return 5;
3475
3476        return 0;
3477}
3478
3479static int ni_ao_reset(struct comedi_device *dev, struct comedi_subdevice *s)
3480{
3481        /* devpriv->ao0p=0x0000; */
3482        /* ni_writew(devpriv->ao0p,AO_Configuration); */
3483
3484        /* devpriv->ao1p=AO_Channel(1); */
3485        /* ni_writew(devpriv->ao1p,AO_Configuration); */
3486
3487        ni_release_ao_mite_channel(dev);
3488
3489        devpriv->stc_writew(dev, AO_Configuration_Start, Joint_Reset_Register);
3490        devpriv->stc_writew(dev, AO_Disarm, AO_Command_1_Register);
3491        ni_set_bits(dev, Interrupt_B_Enable_Register, ~0, 0);
3492        devpriv->stc_writew(dev, AO_BC_Source_Select, AO_Personal_Register);
3493        devpriv->stc_writew(dev, 0x3f98, Interrupt_B_Ack_Register);
3494        devpriv->stc_writew(dev, AO_BC_Source_Select | AO_UPDATE_Pulse_Width |
3495                            AO_TMRDACWR_Pulse_Width, AO_Personal_Register);
3496        devpriv->stc_writew(dev, 0, AO_Output_Control_Register);
3497        devpriv->stc_writew(dev, 0, AO_Start_Select_Register);
3498        devpriv->ao_cmd1 = 0;
3499        devpriv->stc_writew(dev, devpriv->ao_cmd1, AO_Command_1_Register);
3500        devpriv->ao_cmd2 = 0;
3501        devpriv->stc_writew(dev, devpriv->ao_cmd2, AO_Command_2_Register);
3502        devpriv->ao_mode1 = 0;
3503        devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
3504        devpriv->ao_mode2 = 0;
3505        devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
3506        if (boardtype.reg_type & ni_reg_m_series_mask)
3507                devpriv->ao_mode3 = AO_Last_Gate_Disable;
3508        else
3509                devpriv->ao_mode3 = 0;
3510        devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
3511        devpriv->ao_trigger_select = 0;
3512        devpriv->stc_writew(dev, devpriv->ao_trigger_select,
3513                            AO_Trigger_Select_Register);
3514        if (boardtype.reg_type & ni_reg_6xxx_mask) {
3515                unsigned immediate_bits = 0;
3516                unsigned i;
3517                for (i = 0; i < s->n_chan; ++i) {
3518                        immediate_bits |= 1 << i;
3519                }
3520                ao_win_out(immediate_bits, AO_Immediate_671x);
3521                ao_win_out(CLEAR_WG, AO_Misc_611x);
3522        }
3523        devpriv->stc_writew(dev, AO_Configuration_End, Joint_Reset_Register);
3524
3525        return 0;
3526}
3527
3528/* digital io */
3529
3530static int ni_dio_insn_config(struct comedi_device *dev,
3531                              struct comedi_subdevice *s,
3532                              struct comedi_insn *insn, unsigned int *data)
3533{
3534#ifdef DEBUG_DIO
3535        printk("ni_dio_insn_config() chan=%d io=%d\n",
3536               CR_CHAN(insn->chanspec), data[0]);
3537#endif
3538        switch (data[0]) {
3539        case INSN_CONFIG_DIO_OUTPUT:
3540                s->io_bits |= 1 << CR_CHAN(insn->chanspec);
3541                break;
3542        case INSN_CONFIG_DIO_INPUT:
3543                s->io_bits &= ~(1 << CR_CHAN(insn->chanspec));
3544                break;
3545        case INSN_CONFIG_DIO_QUERY:
3546                data[1] =
3547                    (s->
3548                     io_bits & (1 << CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT :
3549                    COMEDI_INPUT;
3550                return insn->n;
3551                break;
3552        default:
3553                return -EINVAL;
3554        }
3555
3556        devpriv->dio_control &= ~DIO_Pins_Dir_Mask;
3557        devpriv->dio_control |= DIO_Pins_Dir(s->io_bits);
3558        devpriv->stc_writew(dev, devpriv->dio_control, DIO_Control_Register);
3559
3560        return 1;
3561}
3562
3563static int ni_dio_insn_bits(struct comedi_device *dev,
3564                            struct comedi_subdevice *s,
3565                            struct comedi_insn *insn, unsigned int *data)
3566{
3567#ifdef DEBUG_DIO
3568        printk("ni_dio_insn_bits() mask=0x%x bits=0x%x\n", data[0], data[1]);
3569#endif
3570        if (insn->n != 2)
3571                return -EINVAL;
3572        if (data[0]) {
3573                /* Perform check to make sure we're not using the
3574                   serial part of the dio */
3575                if ((data[0] & (DIO_SDIN | DIO_SDOUT))
3576                    && devpriv->serial_interval_ns)
3577                        return -EBUSY;
3578
3579                s->state &= ~data[0];
3580                s->state |= (data[0] & data[1]);
3581                devpriv->dio_output &= ~DIO_Parallel_Data_Mask;
3582                devpriv->dio_output |= DIO_Parallel_Data_Out(s->state);
3583                devpriv->stc_writew(dev, devpriv->dio_output,
3584                                    DIO_Output_Register);
3585        }
3586        data[1] = devpriv->stc_readw(dev, DIO_Parallel_Input_Register);
3587
3588        return 2;
3589}
3590
3591static int ni_m_series_dio_insn_config(struct comedi_device *dev,
3592                                       struct comedi_subdevice *s,
3593                                       struct comedi_insn *insn,
3594                                       unsigned int *data)
3595{
3596#ifdef DEBUG_DIO
3597        printk("ni_m_series_dio_insn_config() chan=%d io=%d\n",
3598               CR_CHAN(insn->chanspec), data[0]);
3599#endif
3600        switch (data[0]) {
3601        case INSN_CONFIG_DIO_OUTPUT:
3602                s->io_bits |= 1 << CR_CHAN(insn->chanspec);
3603                break;
3604        case INSN_CONFIG_DIO_INPUT:
3605                s->io_bits &= ~(1 << CR_CHAN(insn->chanspec));
3606                break;
3607        case INSN_CONFIG_DIO_QUERY:
3608                data[1] =
3609                    (s->
3610                     io_bits & (1 << CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT :
3611                    COMEDI_INPUT;
3612                return insn->n;
3613                break;
3614        default:
3615                return -EINVAL;
3616        }
3617
3618        ni_writel(s->io_bits, M_Offset_DIO_Direction);
3619
3620        return 1;
3621}
3622
3623static int ni_m_series_dio_insn_bits(struct comedi_device *dev,
3624                                     struct comedi_subdevice *s,
3625                                     struct comedi_insn *insn,
3626                                     unsigned int *data)
3627{
3628#ifdef DEBUG_DIO
3629        printk("ni_m_series_dio_insn_bits() mask=0x%x bits=0x%x\n", data[0],
3630               data[1]);
3631#endif
3632        if (insn->n != 2)
3633                return -EINVAL;
3634        if (data[0]) {
3635                s->state &= ~data[0];
3636                s->state |= (data[0] & data[1]);
3637                ni_writel(s->state, M_Offset_Static_Digital_Output);
3638        }
3639        data[1] = ni_readl(M_Offset_Static_Digital_Input);
3640
3641        return 2;
3642}
3643
3644static int ni_cdio_cmdtest(struct comedi_device *dev,
3645                           struct comedi_subdevice *s, struct comedi_cmd *cmd)
3646{
3647        int err = 0;
3648        int tmp;
3649        int sources;
3650        unsigned i;
3651
3652        /* step 1: make sure trigger sources are trivially valid */
3653
3654        tmp = cmd->start_src;
3655        sources = TRIG_INT;
3656        cmd->start_src &= sources;
3657        if (!cmd->start_src || tmp != cmd->start_src)
3658                err++;
3659
3660        tmp = cmd->scan_begin_src;
3661        cmd->scan_begin_src &= TRIG_EXT;
3662        if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
3663                err++;
3664
3665        tmp = cmd->convert_src;
3666        cmd->convert_src &= TRIG_NOW;
3667        if (!cmd->convert_src || tmp != cmd->convert_src)
3668                err++;
3669
3670        tmp = cmd->scan_end_src;
3671        cmd->scan_end_src &= TRIG_COUNT;
3672        if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
3673                err++;
3674
3675        tmp = cmd->stop_src;
3676        cmd->stop_src &= TRIG_NONE;
3677        if (!cmd->stop_src || tmp != cmd->stop_src)
3678                err++;
3679
3680        if (err)
3681                return 1;
3682
3683        /* step 2: make sure trigger sources are unique... */
3684
3685        if (cmd->start_src != TRIG_INT)
3686                err++;
3687        if (cmd->scan_begin_src != TRIG_EXT)
3688                err++;
3689        if (cmd->convert_src != TRIG_NOW)
3690                err++;
3691        if (cmd->stop_src != TRIG_NONE)
3692                err++;
3693        /* ... and mutually compatible */
3694
3695        if (err)
3696                return 2;
3697
3698        /* step 3: make sure arguments are trivially compatible */
3699        if (cmd->start_src == TRIG_INT) {
3700                if (cmd->start_arg != 0) {
3701                        cmd->start_arg = 0;
3702                        err++;
3703                }
3704        }
3705        if (cmd->scan_begin_src == TRIG_EXT) {
3706                tmp = cmd->scan_begin_arg;
3707                tmp &= CR_PACK_FLAGS(CDO_Sample_Source_Select_Mask, 0, 0,
3708                                     CR_INVERT);
3709                if (tmp != cmd->scan_begin_arg) {
3710                        err++;
3711                }
3712        }
3713        if (cmd->convert_src == TRIG_NOW) {
3714                if (cmd->convert_arg) {
3715                        cmd->convert_arg = 0;
3716                        err++;
3717                }
3718        }
3719
3720        if (cmd->scan_end_arg != cmd->chanlist_len) {
3721                cmd->scan_end_arg = cmd->chanlist_len;
3722                err++;
3723        }
3724
3725        if (cmd->stop_src == TRIG_NONE) {
3726                if (cmd->stop_arg != 0) {
3727                        cmd->stop_arg = 0;
3728                        err++;
3729                }
3730        }
3731
3732        if (err)
3733                return 3;
3734
3735        /* step 4: fix up any arguments */
3736
3737        if (err)
3738                return 4;
3739
3740        /* step 5: check chanlist */
3741
3742        for (i = 0; i < cmd->chanlist_len; ++i) {
3743                if (cmd->chanlist[i] != i)
3744                        err = 1;
3745        }
3746
3747        if (err)
3748                return 5;
3749
3750        return 0;
3751}
3752
3753static int ni_cdio_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
3754{
3755        const struct comedi_cmd *cmd = &s->async->cmd;
3756        unsigned cdo_mode_bits = CDO_FIFO_Mode_Bit | CDO_Halt_On_Error_Bit;
3757        int retval;
3758
3759        ni_writel(CDO_Reset_Bit, M_Offset_CDIO_Command);
3760        switch (cmd->scan_begin_src) {
3761        case TRIG_EXT:
3762                cdo_mode_bits |=
3763                    CR_CHAN(cmd->scan_begin_arg) &
3764                    CDO_Sample_Source_Select_Mask;
3765                break;
3766        default:
3767                BUG();
3768                break;
3769        }
3770        if (cmd->scan_begin_arg & CR_INVERT)
3771                cdo_mode_bits |= CDO_Polarity_Bit;
3772        ni_writel(cdo_mode_bits, M_Offset_CDO_Mode);
3773        if (s->io_bits) {
3774                ni_writel(s->state, M_Offset_CDO_FIFO_Data);
3775                ni_writel(CDO_SW_Update_Bit, M_Offset_CDIO_Command);
3776                ni_writel(s->io_bits, M_Offset_CDO_Mask_Enable);
3777        } else {
3778                comedi_error(dev,
3779                             "attempted to run digital output command with no lines configured as outputs");
3780                return -EIO;
3781        }
3782        retval = ni_request_cdo_mite_channel(dev);
3783        if (retval < 0) {
3784                return retval;
3785        }
3786        s->async->inttrig = &ni_cdo_inttrig;
3787        return 0;
3788}
3789
3790static int ni_cdo_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
3791                          unsigned int trignum)
3792{
3793#ifdef PCIDMA
3794        unsigned long flags;
3795#endif
3796        int retval = 0;
3797        unsigned i;
3798        const unsigned timeout = 100;
3799
3800        s->async->inttrig = NULL;
3801
3802        /* read alloc the entire buffer */
3803        comedi_buf_read_alloc(s->async, s->async->prealloc_bufsz);
3804
3805#ifdef PCIDMA
3806        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
3807        if (devpriv->cdo_mite_chan) {
3808                mite_prep_dma(devpriv->cdo_mite_chan, 32, 32);
3809                mite_dma_arm(devpriv->cdo_mite_chan);
3810        } else {
3811                comedi_error(dev, "BUG: no cdo mite channel?");
3812                retval = -EIO;
3813        }
3814        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
3815        if (retval < 0)
3816                return retval;
3817#endif
3818/*
3819* XXX not sure what interrupt C group does
3820* ni_writeb(Interrupt_Group_C_Enable_Bit,
3821* M_Offset_Interrupt_C_Enable); wait for dma to fill output fifo
3822*/
3823        for (i = 0; i < timeout; ++i) {
3824                if (ni_readl(M_Offset_CDIO_Status) & CDO_FIFO_Full_Bit)
3825                        break;
3826                udelay(10);
3827        }
3828        if (i == timeout) {
3829                comedi_error(dev, "dma failed to fill cdo fifo!");
3830                ni_cdio_cancel(dev, s);
3831                return -EIO;
3832        }
3833        ni_writel(CDO_Arm_Bit | CDO_Error_Interrupt_Enable_Set_Bit |
3834                  CDO_Empty_FIFO_Interrupt_Enable_Set_Bit,
3835                  M_Offset_CDIO_Command);
3836        return retval;
3837}
3838
3839static int ni_cdio_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3840{
3841        ni_writel(CDO_Disarm_Bit | CDO_Error_Interrupt_Enable_Clear_Bit |
3842                  CDO_Empty_FIFO_Interrupt_Enable_Clear_Bit |
3843                  CDO_FIFO_Request_Interrupt_Enable_Clear_Bit,
3844                  M_Offset_CDIO_Command);
3845/*
3846* XXX not sure what interrupt C group does ni_writeb(0,
3847* M_Offset_Interrupt_C_Enable);
3848*/
3849        ni_writel(0, M_Offset_CDO_Mask_Enable);
3850        ni_release_cdo_mite_channel(dev);
3851        return 0;
3852}
3853
3854static void handle_cdio_interrupt(struct comedi_device *dev)
3855{
3856        unsigned cdio_status;
3857        struct comedi_subdevice *s = dev->subdevices + NI_DIO_SUBDEV;
3858#ifdef PCIDMA
3859        unsigned long flags;
3860#endif
3861
3862        if ((boardtype.reg_type & ni_reg_m_series_mask) == 0) {
3863                return;
3864        }
3865#ifdef PCIDMA
3866        spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
3867        if (devpriv->cdo_mite_chan) {
3868                unsigned cdo_mite_status =
3869                    mite_get_status(devpriv->cdo_mite_chan);
3870                if (cdo_mite_status & CHSR_LINKC) {
3871                        writel(CHOR_CLRLC,
3872                               devpriv->mite->mite_io_addr +
3873                               MITE_CHOR(devpriv->cdo_mite_chan->channel));
3874                }
3875                mite_sync_output_dma(devpriv->cdo_mite_chan, s->async);
3876        }
3877        spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
3878#endif
3879
3880        cdio_status = ni_readl(M_Offset_CDIO_Status);
3881        if (cdio_status & (CDO_Overrun_Bit | CDO_Underflow_Bit)) {
3882/* printk("cdio error: statux=0x%x\n", cdio_status); */
3883                ni_writel(CDO_Error_Interrupt_Confirm_Bit, M_Offset_CDIO_Command);      /*  XXX just guessing this is needed and does something useful */
3884                s->async->events |= COMEDI_CB_OVERFLOW;
3885        }
3886        if (cdio_status & CDO_FIFO_Empty_Bit) {
3887/* printk("cdio fifo empty\n"); */
3888                ni_writel(CDO_Empty_FIFO_Interrupt_Enable_Clear_Bit,
3889                          M_Offset_CDIO_Command);
3890/* s->async->events |= COMEDI_CB_EOA; */
3891        }
3892        ni_event(dev, s);
3893}
3894
3895static int ni_serial_insn_config(struct comedi_device *dev,
3896                                 struct comedi_subdevice *s,
3897                                 struct comedi_insn *insn, unsigned int *data)
3898{
3899        int err = insn->n;
3900        unsigned char byte_out, byte_in = 0;
3901
3902        if (insn->n != 2)
3903                return -EINVAL;
3904
3905        switch (data[0]) {
3906        case INSN_CONFIG_SERIAL_CLOCK:
3907
3908#ifdef DEBUG_DIO
3909                printk("SPI serial clock Config cd\n", data[1]);
3910#endif
3911                devpriv->serial_hw_mode = 1;
3912                devpriv->dio_control |= DIO_HW_Serial_Enable;
3913
3914                if (data[1] == SERIAL_DISABLED) {
3915                        devpriv->serial_hw_mode = 0;
3916                        devpriv->dio_control &= ~(DIO_HW_Serial_Enable |
3917                                                  DIO_Software_Serial_Control);
3918                        data[1] = SERIAL_DISABLED;
3919                        devpriv->serial_interval_ns = data[1];
3920                } else if (data[1] <= SERIAL_600NS) {
3921                        /* Warning: this clock speed is too fast to reliably
3922                           control SCXI. */
3923                        devpriv->dio_control &= ~DIO_HW_Serial_Timebase;
3924                        devpriv->clock_and_fout |= Slow_Internal_Timebase;
3925                        devpriv->clock_and_fout &= ~DIO_Serial_Out_Divide_By_2;
3926                        data[1] = SERIAL_600NS;
3927                        devpriv->serial_interval_ns = data[1];
3928                } else if (data[1] <= SERIAL_1_2US) {
3929                        devpriv->dio_control &= ~DIO_HW_Serial_Timebase;
3930                        devpriv->clock_and_fout |= Slow_Internal_Timebase |
3931                            DIO_Serial_Out_Divide_By_2;
3932                        data[1] = SERIAL_1_2US;
3933                        devpriv->serial_interval_ns = data[1];
3934                } else if (data[1] <= SERIAL_10US) {
3935                        devpriv->dio_control |= DIO_HW_Serial_Timebase;
3936                        devpriv->clock_and_fout |= Slow_Internal_Timebase |
3937                            DIO_Serial_Out_Divide_By_2;
3938                        /* Note: DIO_Serial_Out_Divide_By_2 only affects
3939                           600ns/1.2us. If you turn divide_by_2 off with the
3940                           slow clock, you will still get 10us, except then
3941                           all your delays are wrong. */
3942                        data[1] = SERIAL_10US;
3943                        devpriv->serial_interval_ns = data[1];
3944                } else {
3945                        devpriv->dio_control &= ~(DIO_HW_Serial_Enable |
3946                                                  DIO_Software_Serial_Control);
3947                        devpriv->serial_hw_mode = 0;
3948                        data[1] = (data[1] / 1000) * 1000;
3949                        devpriv->serial_interval_ns = data[1];
3950                }
3951
3952                devpriv->stc_writew(dev, devpriv->dio_control,
3953                                    DIO_Control_Register);
3954                devpriv->stc_writew(dev, devpriv->clock_and_fout,
3955                                    Clock_and_FOUT_Register);
3956                return 1;
3957
3958                break;
3959
3960        case INSN_CONFIG_BIDIRECTIONAL_DATA:
3961
3962                if (devpriv->serial_interval_ns == 0) {
3963                        return -EINVAL;
3964                }
3965
3966                byte_out = data[1] & 0xFF;
3967
3968                if (devpriv->serial_hw_mode) {
3969                        err = ni_serial_hw_readwrite8(dev, s, byte_out,
3970                                                      &byte_in);
3971                } else if (devpriv->serial_interval_ns > 0) {
3972                        err = ni_serial_sw_readwrite8(dev, s, byte_out,
3973                                                      &byte_in);
3974                } else {
3975                        printk("ni_serial_insn_config: serial disabled!\n");
3976                        return -EINVAL;
3977                }
3978                if (err < 0)
3979                        return err;
3980                data[1] = byte_in & 0xFF;
3981                return insn->n;
3982
3983                break;
3984        default:
3985                return -EINVAL;
3986        }
3987
3988}
3989
3990static int ni_serial_hw_readwrite8(struct comedi_device *dev,
3991                                   struct comedi_subdevice *s,
3992                                   unsigned char data_out,
3993                                   unsigned char *data_in)
3994{
3995        unsigned int status1;
3996        int err = 0, count = 20;
3997
3998#ifdef DEBUG_DIO
3999        printk("ni_serial_hw_readwrite8: outputting 0x%x\n", data_out);
4000#endif
4001
4002        devpriv->dio_output &= ~DIO_Serial_Data_Mask;
4003        devpriv->dio_output |= DIO_Serial_Data_Out(data_out);
4004        devpriv->stc_writew(dev, devpriv->dio_output, DIO_Output_Register);
4005
4006        status1 = devpriv->stc_readw(dev, Joint_Status_1_Register);
4007        if (status1 & DIO_Serial_IO_In_Progress_St) {
4008                err = -EBUSY;
4009                goto Error;
4010        }
4011
4012        devpriv->dio_control |= DIO_HW_Serial_Start;
4013        devpriv->stc_writew(dev, devpriv->dio_control, DIO_Control_Register);
4014        devpriv->dio_control &= ~DIO_HW_Serial_Start;
4015
4016        /* Wait until STC says we're done, but don't loop infinitely. */
4017        while ((status1 =
4018                devpriv->stc_readw(dev,
4019                                   Joint_Status_1_Register)) &
4020               DIO_Serial_IO_In_Progress_St) {
4021                /* Delay one bit per loop */
4022                udelay((devpriv->serial_interval_ns + 999) / 1000);
4023                if (--count < 0) {
4024                        printk
4025                            ("ni_serial_hw_readwrite8: SPI serial I/O didn't finish in time!\n");
4026                        err = -ETIME;
4027                        goto Error;
4028                }
4029        }
4030
4031        /* Delay for last bit. This delay is absolutely necessary, because
4032           DIO_Serial_IO_In_Progress_St goes high one bit too early. */
4033        udelay((devpriv->serial_interval_ns + 999) / 1000);
4034
4035        if (data_in != NULL) {
4036                *data_in = devpriv->stc_readw(dev, DIO_Serial_Input_Register);
4037#ifdef DEBUG_DIO
4038                printk("ni_serial_hw_readwrite8: inputted 0x%x\n", *data_in);
4039#endif
4040        }
4041
4042Error:
4043        devpriv->stc_writew(dev, devpriv->dio_control, DIO_Control_Register);
4044
4045        return err;
4046}
4047
4048static int ni_serial_sw_readwrite8(struct comedi_device *dev,
4049                                   struct comedi_subdevice *s,
4050                                   unsigned char data_out,
4051                                   unsigned char *data_in)
4052{
4053        unsigned char mask, input = 0;
4054
4055#ifdef DEBUG_DIO
4056        printk("ni_serial_sw_readwrite8: outputting 0x%x\n", data_out);
4057#endif
4058
4059        /* Wait for one bit before transfer */
4060        udelay((devpriv->serial_interval_ns + 999) / 1000);
4061
4062        for (mask = 0x80; mask; mask >>= 1) {
4063                /* Output current bit; note that we cannot touch s->state
4064                   because it is a per-subdevice field, and serial is
4065                   a separate subdevice from DIO. */
4066                devpriv->dio_output &= ~DIO_SDOUT;
4067                if (data_out & mask) {
4068                        devpriv->dio_output |= DIO_SDOUT;
4069                }
4070                devpriv->stc_writew(dev, devpriv->dio_output,
4071                                    DIO_Output_Register);
4072
4073                /* Assert SDCLK (active low, inverted), wait for half of
4074                   the delay, deassert SDCLK, and wait for the other half. */
4075                devpriv->dio_control |= DIO_Software_Serial_Control;
4076                devpriv->stc_writew(dev, devpriv->dio_control,
4077                                    DIO_Control_Register);
4078
4079                udelay((devpriv->serial_interval_ns + 999) / 2000);
4080
4081                devpriv->dio_control &= ~DIO_Software_Serial_Control;
4082                devpriv->stc_writew(dev, devpriv->dio_control,
4083                                    DIO_Control_Register);
4084
4085                udelay((devpriv->serial_interval_ns + 999) / 2000);
4086
4087                /* Input current bit */
4088                if (devpriv->stc_readw(dev,
4089                                       DIO_Parallel_Input_Register) & DIO_SDIN)
4090                {
4091/*                      printk("DIO_P_I_R: 0x%x\n", devpriv->stc_readw(dev, DIO_Parallel_Input_Register)); */
4092                        input |= mask;
4093                }
4094        }
4095#ifdef DEBUG_DIO
4096        printk("ni_serial_sw_readwrite8: inputted 0x%x\n", input);
4097#endif
4098        if (data_in)
4099                *data_in = input;
4100
4101        return 0;
4102}
4103
4104static void mio_common_detach(struct comedi_device *dev)
4105{
4106        if (dev->private) {
4107                if (devpriv->counter_dev) {
4108                        ni_gpct_device_destroy(devpriv->counter_dev);
4109                }
4110        }
4111        if (dev->subdevices && boardtype.has_8255)
4112                subdev_8255_cleanup(dev, dev->subdevices + NI_8255_DIO_SUBDEV);
4113}
4114
4115static void init_ao_67xx(struct comedi_device *dev, struct comedi_subdevice *s)
4116{
4117        int i;
4118
4119        for (i = 0; i < s->n_chan; i++) {
4120                ni_ao_win_outw(dev, AO_Channel(i) | 0x0,
4121                               AO_Configuration_2_67xx);
4122        }
4123        ao_win_out(0x0, AO_Later_Single_Point_Updates);
4124}
4125
4126static unsigned ni_gpct_to_stc_register(enum ni_gpct_register reg)
4127{
4128        unsigned stc_register;
4129        switch (reg) {
4130        case NITIO_G0_Autoincrement_Reg:
4131                stc_register = G_Autoincrement_Register(0);
4132                break;
4133        case NITIO_G1_Autoincrement_Reg:
4134                stc_register = G_Autoincrement_Register(1);
4135                break;
4136        case NITIO_G0_Command_Reg:
4137                stc_register = G_Command_Register(0);
4138                break;
4139        case NITIO_G1_Command_Reg:
4140                stc_register = G_Command_Register(1);
4141                break;
4142        case NITIO_G0_HW_Save_Reg:
4143                stc_register = G_HW_Save_Register(0);
4144                break;
4145        case NITIO_G1_HW_Save_Reg:
4146                stc_register = G_HW_Save_Register(1);
4147                break;
4148        case NITIO_G0_SW_Save_Reg:
4149                stc_register = G_Save_Register(0);
4150                break;
4151        case NITIO_G1_SW_Save_Reg:
4152                stc_register = G_Save_Register(1);
4153                break;
4154        case NITIO_G0_Mode_Reg:
4155                stc_register = G_Mode_Register(0);
4156                break;
4157        case NITIO_G1_Mode_Reg:
4158                stc_register = G_Mode_Register(1);
4159                break;
4160        case NITIO_G0_LoadA_Reg:
4161                stc_register = G_Load_A_Register(0);
4162                break;
4163        case NITIO_G1_LoadA_Reg:
4164                stc_register = G_Load_A_Register(1);
4165                break;
4166        case NITIO_G0_LoadB_Reg:
4167                stc_register = G_Load_B_Register(0);
4168                break;
4169        case NITIO_G1_LoadB_Reg:
4170                stc_register = G_Load_B_Register(1);
4171                break;
4172        case NITIO_G0_Input_Select_Reg:
4173                stc_register = G_Input_Select_Register(0);
4174                break;
4175        case NITIO_G1_Input_Select_Reg:
4176                stc_register = G_Input_Select_Register(1);
4177                break;
4178        case NITIO_G01_Status_Reg:
4179                stc_register = G_Status_Register;
4180                break;
4181        case NITIO_G01_Joint_Reset_Reg:
4182                stc_register = Joint_Reset_Register;
4183                break;
4184        case NITIO_G01_Joint_Status1_Reg:
4185                stc_register = Joint_Status_1_Register;
4186                break;
4187        case NITIO_G01_Joint_Status2_Reg:
4188                stc_register = Joint_Status_2_Register;
4189                break;
4190        case NITIO_G0_Interrupt_Acknowledge_Reg:
4191                stc_register = Interrupt_A_Ack_Register;
4192                break;
4193        case NITIO_G1_Interrupt_Acknowledge_Reg:
4194                stc_register = Interrupt_B_Ack_Register;
4195                break;
4196        case NITIO_G0_Status_Reg:
4197                stc_register = AI_Status_1_Register;
4198                break;
4199        case NITIO_G1_Status_Reg:
4200                stc_register = AO_Status_1_Register;
4201                break;
4202        case NITIO_G0_Interrupt_Enable_Reg:
4203                stc_register = Interrupt_A_Enable_Register;
4204                break;
4205        case NITIO_G1_Interrupt_Enable_Reg:
4206                stc_register = Interrupt_B_Enable_Register;
4207                break;
4208        default:
4209                printk("%s: unhandled register 0x%x in switch.\n",
4210                       __func__, reg);
4211                BUG();
4212                return 0;
4213                break;
4214        }
4215        return stc_register;
4216}
4217
4218static void ni_gpct_write_register(struct ni_gpct *counter, unsigned bits,
4219                                   enum ni_gpct_register reg)
4220{
4221        struct comedi_device *dev = counter->counter_dev->dev;
4222        unsigned stc_register;
4223        /* bits in the join reset register which are relevant to counters */
4224        static const unsigned gpct_joint_reset_mask = G0_Reset | G1_Reset;
4225        static const unsigned gpct_interrupt_a_enable_mask =
4226            G0_Gate_Interrupt_Enable | G0_TC_Interrupt_Enable;
4227        static const unsigned gpct_interrupt_b_enable_mask =
4228            G1_Gate_Interrupt_Enable | G1_TC_Interrupt_Enable;
4229
4230        switch (reg) {
4231                /* m-series-only registers */
4232        case NITIO_G0_Counting_Mode_Reg:
4233                ni_writew(bits, M_Offset_G0_Counting_Mode);
4234                break;
4235        case NITIO_G1_Counting_Mode_Reg:
4236                ni_writew(bits, M_Offset_G1_Counting_Mode);
4237                break;
4238        case NITIO_G0_Second_Gate_Reg:
4239                ni_writew(bits, M_Offset_G0_Second_Gate);
4240                break;
4241        case NITIO_G1_Second_Gate_Reg:
4242                ni_writew(bits, M_Offset_G1_Second_Gate);
4243                break;
4244        case NITIO_G0_DMA_Config_Reg:
4245                ni_writew(bits, M_Offset_G0_DMA_Config);
4246                break;
4247        case NITIO_G1_DMA_Config_Reg:
4248                ni_writew(bits, M_Offset_G1_DMA_Config);
4249                break;
4250        case NITIO_G0_ABZ_Reg:
4251                ni_writew(bits, M_Offset_G0_MSeries_ABZ);
4252                break;
4253        case NITIO_G1_ABZ_Reg:
4254                ni_writew(bits, M_Offset_G1_MSeries_ABZ);
4255                break;
4256
4257                /* 32 bit registers */
4258        case NITIO_G0_LoadA_Reg:
4259        case NITIO_G1_LoadA_Reg:
4260        case NITIO_G0_LoadB_Reg:
4261        case NITIO_G1_LoadB_Reg:
4262                stc_register = ni_gpct_to_stc_register(reg);
4263                devpriv->stc_writel(dev, bits, stc_register);
4264                break;
4265
4266                /* 16 bit registers */
4267        case NITIO_G0_Interrupt_Enable_Reg:
4268                BUG_ON(bits & ~gpct_interrupt_a_enable_mask);
4269                ni_set_bitfield(dev, Interrupt_A_Enable_Register,
4270                                gpct_interrupt_a_enable_mask, bits);
4271                break;
4272        case NITIO_G1_Interrupt_Enable_Reg:
4273                BUG_ON(bits & ~gpct_interrupt_b_enable_mask);
4274                ni_set_bitfield(dev, Interrupt_B_Enable_Register,
4275                                gpct_interrupt_b_enable_mask, bits);
4276                break;
4277        case NITIO_G01_Joint_Reset_Reg:
4278                BUG_ON(bits & ~gpct_joint_reset_mask);
4279                /* fall-through */
4280        default:
4281                stc_register = ni_gpct_to_stc_register(reg);
4282                devpriv->stc_writew(dev, bits, stc_register);
4283        }
4284}
4285
4286static unsigned ni_gpct_read_register(struct ni_gpct *counter,
4287                                      enum ni_gpct_register reg)
4288{
4289        struct comedi_device *dev = counter->counter_dev->dev;
4290        unsigned stc_register;
4291        switch (reg) {
4292                /* m-series only registers */
4293        case NITIO_G0_DMA_Status_Reg:
4294                return ni_readw(M_Offset_G0_DMA_Status);
4295                break;
4296        case NITIO_G1_DMA_Status_Reg:
4297                return ni_readw(M_Offset_G1_DMA_Status);
4298                break;
4299
4300                /* 32 bit registers */
4301        case NITIO_G0_HW_Save_Reg:
4302        case NITIO_G1_HW_Save_Reg:
4303        case NITIO_G0_SW_Save_Reg:
4304        case NITIO_G1_SW_Save_Reg:
4305                stc_register = ni_gpct_to_stc_register(reg);
4306                return devpriv->stc_readl(dev, stc_register);
4307                break;
4308
4309                /* 16 bit registers */
4310        default:
4311                stc_register = ni_gpct_to_stc_register(reg);
4312                return devpriv->stc_readw(dev, stc_register);
4313                break;
4314        }
4315        return 0;
4316}
4317
4318static int ni_freq_out_insn_read(struct comedi_device *dev,
4319                                 struct comedi_subdevice *s,
4320                                 struct comedi_insn *insn, unsigned int *data)
4321{
4322        data[0] = devpriv->clock_and_fout & FOUT_Divider_mask;
4323        return 1;
4324}
4325
4326static int ni_freq_out_insn_write(struct comedi_device *dev,
4327                                  struct comedi_subdevice *s,
4328                                  struct comedi_insn *insn, unsigned int *data)
4329{
4330        devpriv->clock_and_fout &= ~FOUT_Enable;
4331        devpriv->stc_writew(dev, devpriv->clock_and_fout,
4332                            Clock_and_FOUT_Register);
4333        devpriv->clock_and_fout &= ~FOUT_Divider_mask;
4334        devpriv->clock_and_fout |= FOUT_Divider(data[0]);
4335        devpriv->clock_and_fout |= FOUT_Enable;
4336        devpriv->stc_writew(dev, devpriv->clock_and_fout,
4337                            Clock_and_FOUT_Register);
4338        return insn->n;
4339}
4340
4341static int ni_set_freq_out_clock(struct comedi_device *dev,
4342                                 unsigned int clock_source)
4343{
4344        switch (clock_source) {
4345        case NI_FREQ_OUT_TIMEBASE_1_DIV_2_CLOCK_SRC:
4346                devpriv->clock_and_fout &= ~FOUT_Timebase_Select;
4347                break;
4348        case NI_FREQ_OUT_TIMEBASE_2_CLOCK_SRC:
4349                devpriv->clock_and_fout |= FOUT_Timebase_Select;
4350                break;
4351        default:
4352                return -EINVAL;
4353        }
4354        devpriv->stc_writew(dev, devpriv->clock_and_fout,
4355                            Clock_and_FOUT_Register);
4356        return 3;
4357}
4358
4359static void ni_get_freq_out_clock(struct comedi_device *dev,
4360                                  unsigned int *clock_source,
4361                                  unsigned int *clock_period_ns)
4362{
4363        if (devpriv->clock_and_fout & FOUT_Timebase_Select) {
4364                *clock_source = NI_FREQ_OUT_TIMEBASE_2_CLOCK_SRC;
4365                *clock_period_ns = TIMEBASE_2_NS;
4366        } else {
4367                *clock_source = NI_FREQ_OUT_TIMEBASE_1_DIV_2_CLOCK_SRC;
4368                *clock_period_ns = TIMEBASE_1_NS * 2;
4369        }
4370}
4371
4372static int ni_freq_out_insn_config(struct comedi_device *dev,
4373                                   struct comedi_subdevice *s,
4374                                   struct comedi_insn *insn, unsigned int *data)
4375{
4376        switch (data[0]) {
4377        case INSN_CONFIG_SET_CLOCK_SRC:
4378                return ni_set_freq_out_clock(dev, data[1]);
4379                break;
4380        case INSN_CONFIG_GET_CLOCK_SRC:
4381                ni_get_freq_out_clock(dev, &data[1], &data[2]);
4382                return 3;
4383        default:
4384                break;
4385        }
4386        return -EINVAL;
4387}
4388
4389static int ni_alloc_private(struct comedi_device *dev)
4390{
4391        int ret;
4392
4393        ret = alloc_private(dev, sizeof(struct ni_private));
4394        if (ret < 0)
4395                return ret;
4396
4397        spin_lock_init(&devpriv->window_lock);
4398        spin_lock_init(&devpriv->soft_reg_copy_lock);
4399        spin_lock_init(&devpriv->mite_channel_lock);
4400
4401        return 0;
4402};
4403
4404static int ni_E_init(struct comedi_device *dev, struct comedi_devconfig *it)
4405{
4406        struct comedi_subdevice *s;
4407        unsigned j;
4408        enum ni_gpct_variant counter_variant;
4409
4410        if (boardtype.n_aochan > MAX_N_AO_CHAN) {
4411                printk("bug! boardtype.n_aochan > MAX_N_AO_CHAN\n");
4412                return -EINVAL;
4413        }
4414
4415        if (alloc_subdevices(dev, NI_NUM_SUBDEVICES) < 0)
4416                return -ENOMEM;
4417
4418        /* analog input subdevice */
4419
4420        s = dev->subdevices + NI_AI_SUBDEV;
4421        dev->read_subdev = s;
4422        if (boardtype.n_adchan) {
4423                s->type = COMEDI_SUBD_AI;
4424                s->subdev_flags =
4425                    SDF_READABLE | SDF_DIFF | SDF_DITHER | SDF_CMD_READ;
4426                if (boardtype.reg_type != ni_reg_611x)
4427                        s->subdev_flags |= SDF_GROUND | SDF_COMMON | SDF_OTHER;
4428                if (boardtype.adbits > 16)
4429                        s->subdev_flags |= SDF_LSAMPL;
4430                if (boardtype.reg_type & ni_reg_m_series_mask)
4431                        s->subdev_flags |= SDF_SOFT_CALIBRATED;
4432                s->n_chan = boardtype.n_adchan;
4433                s->len_chanlist = 512;
4434                s->maxdata = (1 << boardtype.adbits) - 1;
4435                s->range_table = ni_range_lkup[boardtype.gainlkup];
4436                s->insn_read = &ni_ai_insn_read;
4437                s->insn_config = &ni_ai_insn_config;
4438                s->do_cmdtest = &ni_ai_cmdtest;
4439                s->do_cmd = &ni_ai_cmd;
4440                s->cancel = &ni_ai_reset;
4441                s->poll = &ni_ai_poll;
4442                s->munge = &ni_ai_munge;
4443#ifdef PCIDMA
4444                s->async_dma_dir = DMA_FROM_DEVICE;
4445#endif
4446        } else {
4447                s->type = COMEDI_SUBD_UNUSED;
4448        }
4449
4450        /* analog output subdevice */
4451
4452        s = dev->subdevices + NI_AO_SUBDEV;
4453        if (boardtype.n_aochan) {
4454                s->type = COMEDI_SUBD_AO;
4455                s->subdev_flags = SDF_WRITABLE | SDF_DEGLITCH | SDF_GROUND;
4456                if (boardtype.reg_type & ni_reg_m_series_mask)
4457                        s->subdev_flags |= SDF_SOFT_CALIBRATED;
4458                s->n_chan = boardtype.n_aochan;
4459                s->maxdata = (1 << boardtype.aobits) - 1;
4460                s->range_table = boardtype.ao_range_table;
4461                s->insn_read = &ni_ao_insn_read;
4462                if (boardtype.reg_type & ni_reg_6xxx_mask) {
4463                        s->insn_write = &ni_ao_insn_write_671x;
4464                } else {
4465                        s->insn_write = &ni_ao_insn_write;
4466                }
4467                s->insn_config = &ni_ao_insn_config;
4468#ifdef PCIDMA
4469                if (boardtype.n_aochan) {
4470                        s->async_dma_dir = DMA_TO_DEVICE;
4471#else
4472                if (boardtype.ao_fifo_depth) {
4473#endif
4474                        dev->write_subdev = s;
4475                        s->subdev_flags |= SDF_CMD_WRITE;
4476                        s->do_cmd = &ni_ao_cmd;
4477                        s->do_cmdtest = &ni_ao_cmdtest;
4478                        s->len_chanlist = boardtype.n_aochan;
4479                        if ((boardtype.reg_type & ni_reg_m_series_mask) == 0)
4480                                s->munge = ni_ao_munge;
4481                }
4482                s->cancel = &ni_ao_reset;
4483        } else {
4484                s->type = COMEDI_SUBD_UNUSED;
4485        }
4486        if ((boardtype.reg_type & ni_reg_67xx_mask))
4487                init_ao_67xx(dev, s);
4488
4489        /* digital i/o subdevice */
4490
4491        s = dev->subdevices + NI_DIO_SUBDEV;
4492        s->type = COMEDI_SUBD_DIO;
4493        s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
4494        s->maxdata = 1;
4495        s->io_bits = 0;         /* all bits input */
4496        s->range_table = &range_digital;
4497        s->n_chan = boardtype.num_p0_dio_channels;
4498        if (boardtype.reg_type & ni_reg_m_series_mask) {
4499                s->subdev_flags |=
4500                    SDF_LSAMPL | SDF_CMD_WRITE /* | SDF_CMD_READ */ ;
4501                s->insn_bits = &ni_m_series_dio_insn_bits;
4502                s->insn_config = &ni_m_series_dio_insn_config;
4503                s->do_cmd = &ni_cdio_cmd;
4504                s->do_cmdtest = &ni_cdio_cmdtest;
4505                s->cancel = &ni_cdio_cancel;
4506                s->async_dma_dir = DMA_BIDIRECTIONAL;
4507                s->len_chanlist = s->n_chan;
4508
4509                ni_writel(CDO_Reset_Bit | CDI_Reset_Bit, M_Offset_CDIO_Command);
4510                ni_writel(s->io_bits, M_Offset_DIO_Direction);
4511        } else {
4512                s->insn_bits = &ni_dio_insn_bits;
4513                s->insn_config = &ni_dio_insn_config;
4514                devpriv->dio_control = DIO_Pins_Dir(s->io_bits);
4515                ni_writew(devpriv->dio_control, DIO_Control_Register);
4516        }
4517
4518        /* 8255 device */
4519        s = dev->subdevices + NI_8255_DIO_SUBDEV;
4520        if (boardtype.has_8255) {
4521                subdev_8255_init(dev, s, ni_8255_callback, (unsigned long)dev);
4522        } else {
4523                s->type = COMEDI_SUBD_UNUSED;
4524        }
4525
4526        /* formerly general purpose counter/timer device, but no longer used */
4527        s = dev->subdevices + NI_UNUSED_SUBDEV;
4528        s->type = COMEDI_SUBD_UNUSED;
4529
4530        /* calibration subdevice -- ai and ao */
4531        s = dev->subdevices + NI_CALIBRATION_SUBDEV;
4532        s->type = COMEDI_SUBD_CALIB;
4533        if (boardtype.reg_type & ni_reg_m_series_mask) {
4534                /*  internal PWM analog output used for AI nonlinearity calibration */
4535                s->subdev_flags = SDF_INTERNAL;
4536                s->insn_config = &ni_m_series_pwm_config;
4537                s->n_chan = 1;
4538                s->maxdata = 0;
4539                ni_writel(0x0, M_Offset_Cal_PWM);
4540        } else if (boardtype.reg_type == ni_reg_6143) {
4541                /*  internal PWM analog output used for AI nonlinearity calibration */
4542                s->subdev_flags = SDF_INTERNAL;
4543                s->insn_config = &ni_6143_pwm_config;
4544                s->n_chan = 1;
4545                s->maxdata = 0;
4546        } else {
4547                s->subdev_flags = SDF_WRITABLE | SDF_INTERNAL;
4548                s->insn_read = &ni_calib_insn_read;
4549                s->insn_write = &ni_calib_insn_write;
4550                caldac_setup(dev, s);
4551        }
4552
4553        /* EEPROM */
4554        s = dev->subdevices + NI_EEPROM_SUBDEV;
4555        s->type = COMEDI_SUBD_MEMORY;
4556        s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
4557        s->maxdata = 0xff;
4558        if (boardtype.reg_type & ni_reg_m_series_mask) {
4559                s->n_chan = M_SERIES_EEPROM_SIZE;
4560                s->insn_read = &ni_m_series_eeprom_insn_read;
4561        } else {
4562                s->n_chan = 512;
4563                s->insn_read = &ni_eeprom_insn_read;
4564        }
4565
4566        /* PFI */
4567        s = dev->subdevices + NI_PFI_DIO_SUBDEV;
4568        s->type = COMEDI_SUBD_DIO;
4569        s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
4570        if (boardtype.reg_type & ni_reg_m_series_mask) {
4571                unsigned i;
4572                s->n_chan = 16;
4573                ni_writew(s->state, M_Offset_PFI_DO);
4574                for (i = 0; i < NUM_PFI_OUTPUT_SELECT_REGS; ++i) {
4575                        ni_writew(devpriv->pfi_output_select_reg[i],
4576                                  M_Offset_PFI_Output_Select(i + 1));
4577                }
4578        } else {
4579                s->n_chan = 10;
4580        }
4581        s->maxdata = 1;
4582        if (boardtype.reg_type & ni_reg_m_series_mask) {
4583                s->insn_bits = &ni_pfi_insn_bits;
4584        }
4585        s->insn_config = &ni_pfi_insn_config;
4586        ni_set_bits(dev, IO_Bidirection_Pin_Register, ~0, 0);
4587
4588        /* cs5529 calibration adc */
4589        s = dev->subdevices + NI_CS5529_CALIBRATION_SUBDEV;
4590        if (boardtype.reg_type & ni_reg_67xx_mask) {
4591                s->type = COMEDI_SUBD_AI;
4592                s->subdev_flags = SDF_READABLE | SDF_DIFF | SDF_INTERNAL;
4593                /*  one channel for each analog output channel */
4594                s->n_chan = boardtype.n_aochan;
4595                s->maxdata = (1 << 16) - 1;
4596                s->range_table = &range_unknown;        /* XXX */
4597                s->insn_read = cs5529_ai_insn_read;
4598                s->insn_config = NULL;
4599                init_cs5529(dev);
4600        } else {
4601                s->type = COMEDI_SUBD_UNUSED;
4602        }
4603
4604        /* Serial */
4605        s = dev->subdevices + NI_SERIAL_SUBDEV;
4606        s->type = COMEDI_SUBD_SERIAL;
4607        s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
4608        s->n_chan = 1;
4609        s->maxdata = 0xff;
4610        s->insn_config = ni_serial_insn_config;
4611        devpriv->serial_interval_ns = 0;
4612        devpriv->serial_hw_mode = 0;
4613
4614        /* RTSI */
4615        s = dev->subdevices + NI_RTSI_SUBDEV;
4616        s->type = COMEDI_SUBD_DIO;
4617        s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
4618        s->n_chan = 8;
4619        s->maxdata = 1;
4620        s->insn_bits = ni_rtsi_insn_bits;
4621        s->insn_config = ni_rtsi_insn_config;
4622        ni_rtsi_init(dev);
4623
4624        if (boardtype.reg_type & ni_reg_m_series_mask) {
4625                counter_variant = ni_gpct_variant_m_series;
4626        } else {
4627                counter_variant = ni_gpct_variant_e_series;
4628        }
4629        devpriv->counter_dev = ni_gpct_device_construct(dev,
4630                                                        &ni_gpct_write_register,
4631                                                        &ni_gpct_read_register,
4632                                                        counter_variant,
4633                                                        NUM_GPCT);
4634        /* General purpose counters */
4635        for (j = 0; j < NUM_GPCT; ++j) {
4636                s = dev->subdevices + NI_GPCT_SUBDEV(j);
4637                s->type = COMEDI_SUBD_COUNTER;
4638                s->subdev_flags =
4639                    SDF_READABLE | SDF_WRITABLE | SDF_LSAMPL | SDF_CMD_READ
4640                    /* | SDF_CMD_WRITE */ ;
4641                s->n_chan = 3;
4642                if (boardtype.reg_type & ni_reg_m_series_mask)
4643                        s->maxdata = 0xffffffff;
4644                else
4645                        s->maxdata = 0xffffff;
4646                s->insn_read = &ni_gpct_insn_read;
4647                s->insn_write = &ni_gpct_insn_write;
4648                s->insn_config = &ni_gpct_insn_config;
4649                s->do_cmd = &ni_gpct_cmd;
4650                s->len_chanlist = 1;
4651                s->do_cmdtest = &ni_gpct_cmdtest;
4652                s->cancel = &ni_gpct_cancel;
4653                s->async_dma_dir = DMA_BIDIRECTIONAL;
4654                s->private = &devpriv->counter_dev->counters[j];
4655
4656                devpriv->counter_dev->counters[j].chip_index = 0;
4657                devpriv->counter_dev->counters[j].counter_index = j;
4658                ni_tio_init_counter(&devpriv->counter_dev->counters[j]);
4659        }
4660
4661        /* Frequency output */
4662        s = dev->subdevices + NI_FREQ_OUT_SUBDEV;
4663        s->type = COMEDI_SUBD_COUNTER;
4664        s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
4665        s->n_chan = 1;
4666        s->maxdata = 0xf;
4667        s->insn_read = &ni_freq_out_insn_read;
4668        s->insn_write = &ni_freq_out_insn_write;
4669        s->insn_config = &ni_freq_out_insn_config;
4670
4671        /* ai configuration */
4672        ni_ai_reset(dev, dev->subdevices + NI_AI_SUBDEV);
4673        if ((boardtype.reg_type & ni_reg_6xxx_mask) == 0) {
4674                /*  BEAM is this needed for PCI-6143 ?? */
4675                devpriv->clock_and_fout =
4676                    Slow_Internal_Time_Divide_By_2 |
4677                    Slow_Internal_Timebase |
4678                    Clock_To_Board_Divide_By_2 |
4679                    Clock_To_Board |
4680                    AI_Output_Divide_By_2 | AO_Output_Divide_By_2;
4681        } else {
4682                devpriv->clock_and_fout =
4683                    Slow_Internal_Time_Divide_By_2 |
4684                    Slow_Internal_Timebase |
4685                    Clock_To_Board_Divide_By_2 | Clock_To_Board;
4686        }
4687        devpriv->stc_writew(dev, devpriv->clock_and_fout,
4688                            Clock_and_FOUT_Register);
4689
4690        /* analog output configuration */
4691        ni_ao_reset(dev, dev->subdevices + NI_AO_SUBDEV);
4692
4693        if (dev->irq) {
4694                devpriv->stc_writew(dev,
4695                                    (IRQ_POLARITY ? Interrupt_Output_Polarity :
4696                                     0) | (Interrupt_Output_On_3_Pins & 0) |
4697                                    Interrupt_A_Enable | Interrupt_B_Enable |
4698                                    Interrupt_A_Output_Select(interrupt_pin
4699                                                              (dev->irq)) |
4700                                    Interrupt_B_Output_Select(interrupt_pin
4701                                                              (dev->irq)),
4702                                    Interrupt_Control_Register);
4703        }
4704
4705        /* DMA setup */
4706        ni_writeb(devpriv->ai_ao_select_reg, AI_AO_Select);
4707        ni_writeb(devpriv->g0_g1_select_reg, G0_G1_Select);
4708
4709        if (boardtype.reg_type & ni_reg_6xxx_mask) {
4710                ni_writeb(0, Magic_611x);
4711        } else if (boardtype.reg_type & ni_reg_m_series_mask) {
4712                int channel;
4713                for (channel = 0; channel < boardtype.n_aochan; ++channel) {
4714                        ni_writeb(0xf, M_Offset_AO_Waveform_Order(channel));
4715                        ni_writeb(0x0,
4716                                  M_Offset_AO_Reference_Attenuation(channel));
4717                }
4718                ni_writeb(0x0, M_Offset_AO_Calibration);
4719        }
4720
4721        printk("\n");
4722        return 0;
4723}
4724
4725static int ni_8255_callback(int dir, int port, int data, unsigned long arg)
4726{
4727        struct comedi_device *dev = (struct comedi_device *)arg;
4728
4729        if (dir) {
4730                ni_writeb(data, Port_A + 2 * port);
4731                return 0;
4732        } else {
4733                return ni_readb(Port_A + 2 * port);
4734        }
4735}
4736
4737/*
4738        presents the EEPROM as a subdevice
4739*/
4740
4741static int ni_eeprom_insn_read(struct comedi_device *dev,
4742                               struct comedi_subdevice *s,
4743                               struct comedi_insn *insn, unsigned int *data)
4744{
4745        data[0] = ni_read_eeprom(dev, CR_CHAN(insn->chanspec));
4746
4747        return 1;
4748}
4749
4750/*
4751        reads bytes out of eeprom
4752*/
4753
4754static int ni_read_eeprom(struct comedi_device *dev, int addr)
4755{
4756        int bit;
4757        int bitstring;
4758
4759        bitstring = 0x0300 | ((addr & 0x100) << 3) | (addr & 0xff);
4760        ni_writeb(0x04, Serial_Command);
4761        for (bit = 0x8000; bit; bit >>= 1) {
4762                ni_writeb(0x04 | ((bit & bitstring) ? 0x02 : 0),
4763                          Serial_Command);
4764                ni_writeb(0x05 | ((bit & bitstring) ? 0x02 : 0),
4765                          Serial_Command);
4766        }
4767        bitstring = 0;
4768        for (bit = 0x80; bit; bit >>= 1) {
4769                ni_writeb(0x04, Serial_Command);
4770                ni_writeb(0x05, Serial_Command);
4771                bitstring |= ((ni_readb(XXX_Status) & PROMOUT) ? bit : 0);
4772        }
4773        ni_writeb(0x00, Serial_Command);
4774
4775        return bitstring;
4776}
4777
4778static int ni_m_series_eeprom_insn_read(struct comedi_device *dev,
4779                                        struct comedi_subdevice *s,
4780                                        struct comedi_insn *insn,
4781                                        unsigned int *data)
4782{
4783        data[0] = devpriv->eeprom_buffer[CR_CHAN(insn->chanspec)];
4784
4785        return 1;
4786}
4787
4788static int ni_get_pwm_config(struct comedi_device *dev, unsigned int *data)
4789{
4790        data[1] = devpriv->pwm_up_count * devpriv->clock_ns;
4791        data[2] = devpriv->pwm_down_count * devpriv->clock_ns;
4792        return 3;
4793}
4794
4795static int ni_m_series_pwm_config(struct comedi_device *dev,
4796                                  struct comedi_subdevice *s,
4797                                  struct comedi_insn *insn, unsigned int *data)
4798{
4799        unsigned up_count, down_count;
4800        switch (data[0]) {
4801        case INSN_CONFIG_PWM_OUTPUT:
4802                switch (data[1]) {
4803                case TRIG_ROUND_NEAREST:
4804                        up_count =
4805                            (data[2] +
4806                             devpriv->clock_ns / 2) / devpriv->clock_ns;
4807                        break;
4808                case TRIG_ROUND_DOWN:
4809                        up_count = data[2] / devpriv->clock_ns;
4810                        break;
4811                case TRIG_ROUND_UP:
4812                        up_count =
4813                            (data[2] + devpriv->clock_ns -
4814                             1) / devpriv->clock_ns;
4815                        break;
4816                default:
4817                        return -EINVAL;
4818                        break;
4819                }
4820                switch (data[3]) {
4821                case TRIG_ROUND_NEAREST:
4822                        down_count =
4823                            (data[4] +
4824                             devpriv->clock_ns / 2) / devpriv->clock_ns;
4825                        break;
4826                case TRIG_ROUND_DOWN:
4827                        down_count = data[4] / devpriv->clock_ns;
4828                        break;
4829                case TRIG_ROUND_UP:
4830                        down_count =
4831                            (data[4] + devpriv->clock_ns -
4832                             1) / devpriv->clock_ns;
4833                        break;
4834                default:
4835                        return -EINVAL;
4836                        break;
4837                }
4838                if (up_count * devpriv->clock_ns != data[2] ||
4839                    down_count * devpriv->clock_ns != data[4]) {
4840                        data[2] = up_count * devpriv->clock_ns;
4841                        data[4] = down_count * devpriv->clock_ns;
4842                        return -EAGAIN;
4843                }
4844                ni_writel(MSeries_Cal_PWM_High_Time_Bits(up_count) |
4845                          MSeries_Cal_PWM_Low_Time_Bits(down_count),
4846                          M_Offset_Cal_PWM);
4847                devpriv->pwm_up_count = up_count;
4848                devpriv->pwm_down_count = down_count;
4849                return 5;
4850                break;
4851        case INSN_CONFIG_GET_PWM_OUTPUT:
4852                return ni_get_pwm_config(dev, data);
4853                break;
4854        default:
4855                return -EINVAL;
4856                break;
4857        }
4858        return 0;
4859}
4860
4861static int ni_6143_pwm_config(struct comedi_device *dev,
4862                              struct comedi_subdevice *s,
4863                              struct comedi_insn *insn, unsigned int *data)
4864{
4865        unsigned up_count, down_count;
4866        switch (data[0]) {
4867        case INSN_CONFIG_PWM_OUTPUT:
4868                switch (data[1]) {
4869                case TRIG_ROUND_NEAREST:
4870                        up_count =
4871                            (data[2] +
4872                             devpriv->clock_ns / 2) / devpriv->clock_ns;
4873                        break;
4874                case TRIG_ROUND_DOWN:
4875                        up_count = data[2] / devpriv->clock_ns;
4876                        break;
4877                case TRIG_ROUND_UP:
4878                        up_count =
4879                            (data[2] + devpriv->clock_ns -
4880                             1) / devpriv->clock_ns;
4881                        break;
4882                default:
4883                        return -EINVAL;
4884                        break;
4885                }
4886                switch (data[3]) {
4887                case TRIG_ROUND_NEAREST:
4888                        down_count =
4889                            (data[4] +
4890                             devpriv->clock_ns / 2) / devpriv->clock_ns;
4891                        break;
4892                case TRIG_ROUND_DOWN:
4893                        down_count = data[4] / devpriv->clock_ns;
4894                        break;
4895                case TRIG_ROUND_UP:
4896                        down_count =
4897                            (data[4] + devpriv->clock_ns -
4898                             1) / devpriv->clock_ns;
4899                        break;
4900                default:
4901                        return -EINVAL;
4902                        break;
4903                }
4904                if (up_count * devpriv->clock_ns != data[2] ||
4905                    down_count * devpriv->clock_ns != data[4]) {
4906                        data[2] = up_count * devpriv->clock_ns;
4907                        data[4] = down_count * devpriv->clock_ns;
4908                        return -EAGAIN;
4909                }
4910                ni_writel(up_count, Calibration_HighTime_6143);
4911                devpriv->pwm_up_count = up_count;
4912                ni_writel(down_count, Calibration_LowTime_6143);
4913                devpriv->pwm_down_count = down_count;
4914                return 5;
4915                break;
4916        case INSN_CONFIG_GET_PWM_OUTPUT:
4917                return ni_get_pwm_config(dev, data);
4918        default:
4919                return -EINVAL;
4920                break;
4921        }
4922        return 0;
4923}
4924
4925static void ni_write_caldac(struct comedi_device *dev, int addr, int val);
4926/*
4927        calibration subdevice
4928*/
4929static int ni_calib_insn_write(struct comedi_device *dev,
4930                               struct comedi_subdevice *s,
4931                               struct comedi_insn *insn, unsigned int *data)
4932{
4933        ni_write_caldac(dev, CR_CHAN(insn->chanspec), data[0]);
4934
4935        return 1;
4936}
4937
4938static int ni_calib_insn_read(struct comedi_device *dev,
4939                              struct comedi_subdevice *s,
4940                              struct comedi_insn *insn, unsigned int *data)
4941{
4942        data[0] = devpriv->caldacs[CR_CHAN(insn->chanspec)];
4943
4944        return 1;
4945}
4946
4947static int pack_mb88341(int addr, int val, int *bitstring);
4948static int pack_dac8800(int addr, int val, int *bitstring);
4949static int pack_dac8043(int addr, int val, int *bitstring);
4950static int pack_ad8522(int addr, int val, int *bitstring);
4951static int pack_ad8804(int addr, int val, int *bitstring);
4952static int pack_ad8842(int addr, int val, int *bitstring);
4953
4954struct caldac_struct {
4955        int n_chans;
4956        int n_bits;
4957        int (*packbits) (int, int, int *);
4958};
4959
4960static struct caldac_struct caldacs[] = {
4961        [mb88341] = {12, 8, pack_mb88341},
4962        [dac8800] = {8, 8, pack_dac8800},
4963        [dac8043] = {1, 12, pack_dac8043},
4964        [ad8522] = {2, 12, pack_ad8522},
4965        [ad8804] = {12, 8, pack_ad8804},
4966        [ad8842] = {8, 8, pack_ad8842},
4967        [ad8804_debug] = {16, 8, pack_ad8804},
4968};
4969
4970static void caldac_setup(struct comedi_device *dev, struct comedi_subdevice *s)
4971{
4972        int i, j;
4973        int n_dacs;
4974        int n_chans = 0;
4975        int n_bits;
4976        int diffbits = 0;
4977        int type;
4978        int chan;
4979
4980        type = boardtype.caldac[0];
4981        if (type == caldac_none)
4982                return;
4983        n_bits = caldacs[type].n_bits;
4984        for (i = 0; i < 3; i++) {
4985                type = boardtype.caldac[i];
4986                if (type == caldac_none)
4987                        break;
4988                if (caldacs[type].n_bits != n_bits)
4989                        diffbits = 1;
4990                n_chans += caldacs[type].n_chans;
4991        }
4992        n_dacs = i;
4993        s->n_chan = n_chans;
4994
4995        if (diffbits) {
4996                unsigned int *maxdata_list;
4997
4998                if (n_chans > MAX_N_CALDACS) {
4999                        printk("BUG! MAX_N_CALDACS too small\n");
5000                }
5001                s->maxdata_list = maxdata_list = devpriv->caldac_maxdata_list;
5002                chan = 0;
5003                for (i = 0; i < n_dacs; i++) {
5004                        type = boardtype.caldac[i];
5005                        for (j = 0; j < caldacs[type].n_chans; j++) {
5006                                maxdata_list[chan] =
5007                                    (1 << caldacs[type].n_bits) - 1;
5008                                chan++;
5009                        }
5010                }
5011
5012                for (chan = 0; chan < s->n_chan; chan++)
5013                        ni_write_caldac(dev, i, s->maxdata_list[i] / 2);
5014        } else {
5015                type = boardtype.caldac[0];
5016                s->maxdata = (1 << caldacs[type].n_bits) - 1;
5017
5018                for (chan = 0; chan < s->n_chan; chan++)
5019                        ni_write_caldac(dev, i, s->maxdata / 2);
5020        }
5021}
5022
5023static void ni_write_caldac(struct comedi_device *dev, int addr, int val)
5024{
5025        unsigned int loadbit = 0, bits = 0, bit, bitstring = 0;
5026        int i;
5027        int type;
5028
5029        /* printk("ni_write_caldac: chan=%d val=%d\n",addr,val); */
5030        if (devpriv->caldacs[addr] == val)
5031                return;
5032        devpriv->caldacs[addr] = val;
5033
5034        for (i = 0; i < 3; i++) {
5035                type = boardtype.caldac[i];
5036                if (type == caldac_none)
5037                        break;
5038                if (addr < caldacs[type].n_chans) {
5039                        bits = caldacs[type].packbits(addr, val, &bitstring);
5040                        loadbit = SerDacLd(i);
5041                        /* printk("caldac: using i=%d addr=%d %x\n",i,addr,bitstring); */
5042                        break;
5043                }
5044                addr -= caldacs[type].n_chans;
5045        }
5046
5047        for (bit = 1 << (bits - 1); bit; bit >>= 1) {
5048                ni_writeb(((bit & bitstring) ? 0x02 : 0), Serial_Command);
5049                udelay(1);
5050                ni_writeb(1 | ((bit & bitstring) ? 0x02 : 0), Serial_Command);
5051                udelay(1);
5052        }
5053        ni_writeb(loadbit, Serial_Command);
5054        udelay(1);
5055        ni_writeb(0, Serial_Command);
5056}
5057
5058static int pack_mb88341(int addr, int val, int *bitstring)
5059{
5060        /*
5061           Fujitsu MB 88341
5062           Note that address bits are reversed.  Thanks to
5063           Ingo Keen for noticing this.
5064
5065           Note also that the 88341 expects address values from
5066           1-12, whereas we use channel numbers 0-11.  The NI
5067           docs use 1-12, also, so be careful here.
5068         */
5069        addr++;
5070        *bitstring = ((addr & 0x1) << 11) |
5071            ((addr & 0x2) << 9) |
5072            ((addr & 0x4) << 7) | ((addr & 0x8) << 5) | (val & 0xff);
5073        return 12;
5074}
5075
5076static int pack_dac8800(int addr, int val, int *bitstring)
5077{
5078        *bitstring = ((addr & 0x7) << 8) | (val & 0xff);
5079        return 11;
5080}
5081
5082static int pack_dac8043(int addr, int val, int *bitstring)
5083{
5084        *bitstring = val & 0xfff;
5085        return 12;
5086}
5087
5088static int pack_ad8522(int addr, int val, int *bitstring)
5089{
5090        *bitstring = (val & 0xfff) | (addr ? 0xc000 : 0xa000);
5091        return 16;
5092}
5093
5094static int pack_ad8804(int addr, int val, int *bitstring)
5095{
5096        *bitstring = ((addr & 0xf) << 8) | (val & 0xff);
5097        return 12;
5098}
5099
5100static int pack_ad8842(int addr, int val, int *bitstring)
5101{
5102        *bitstring = ((addr + 1) << 8) | (val & 0xff);
5103        return 12;
5104}
5105
5106#if 0
5107/*
5108 *      Read the GPCTs current value.
5109 */
5110static int GPCT_G_Watch(struct comedi_device *dev, int chan)
5111{
5112        unsigned int hi1, hi2, lo;
5113
5114        devpriv->gpct_command[chan] &= ~G_Save_Trace;
5115        devpriv->stc_writew(dev, devpriv->gpct_command[chan],
5116                            G_Command_Register(chan));
5117
5118        devpriv->gpct_command[chan] |= G_Save_Trace;
5119        devpriv->stc_writew(dev, devpriv->gpct_command[chan],
5120                            G_Command_Register(chan));
5121
5122        /* This procedure is used because the two registers cannot
5123         * be read atomically. */
5124        do {
5125                hi1 = devpriv->stc_readw(dev, G_Save_Register_High(chan));
5126                lo = devpriv->stc_readw(dev, G_Save_Register_Low(chan));
5127                hi2 = devpriv->stc_readw(dev, G_Save_Register_High(chan));
5128        } while (hi1 != hi2);
5129
5130        return (hi1 << 16) | lo;
5131}
5132
5133static void GPCT_Reset(struct comedi_device *dev, int chan)
5134{
5135        int temp_ack_reg = 0;
5136
5137        /* printk("GPCT_Reset..."); */
5138        devpriv->gpct_cur_operation[chan] = GPCT_RESET;
5139
5140        switch (chan) {
5141        case 0:
5142                devpriv->stc_writew(dev, G0_Reset, Joint_Reset_Register);
5143                ni_set_bits(dev, Interrupt_A_Enable_Register,
5144                            G0_TC_Interrupt_Enable, 0);
5145                ni_set_bits(dev, Interrupt_A_Enable_Register,
5146                            G0_Gate_Interrupt_Enable, 0);
5147                temp_ack_reg |= G0_Gate_Error_Confirm;
5148                temp_ack_reg |= G0_TC_Error_Confirm;
5149                temp_ack_reg |= G0_TC_Interrupt_Ack;
5150                temp_ack_reg |= G0_Gate_Interrupt_Ack;
5151                devpriv->stc_writew(dev, temp_ack_reg,
5152                                    Interrupt_A_Ack_Register);
5153
5154                /* problem...this interferes with the other ctr... */
5155                devpriv->an_trig_etc_reg |= GPFO_0_Output_Enable;
5156                devpriv->stc_writew(dev, devpriv->an_trig_etc_reg,
5157                                    Analog_Trigger_Etc_Register);
5158                break;
5159        case 1:
5160                devpriv->stc_writew(dev, G1_Reset, Joint_Reset_Register);
5161                ni_set_bits(dev, Interrupt_B_Enable_Register,
5162                            G1_TC_Interrupt_Enable, 0);
5163                ni_set_bits(dev, Interrupt_B_Enable_Register,
5164                            G0_Gate_Interrupt_Enable, 0);
5165                temp_ack_reg |= G1_Gate_Error_Confirm;
5166                temp_ack_reg |= G1_TC_Error_Confirm;
5167                temp_ack_reg |= G1_TC_Interrupt_Ack;
5168                temp_ack_reg |= G1_Gate_Interrupt_Ack;
5169                devpriv->stc_writew(dev, temp_ack_reg,
5170                                    Interrupt_B_Ack_Register);
5171
5172                devpriv->an_trig_etc_reg |= GPFO_1_Output_Enable;
5173                devpriv->stc_writew(dev, devpriv->an_trig_etc_reg,
5174                                    Analog_Trigger_Etc_Register);
5175                break;
5176        };
5177
5178        devpriv->gpct_mode[chan] = 0;
5179        devpriv->gpct_input_select[chan] = 0;
5180        devpriv->gpct_command[chan] = 0;
5181
5182        devpriv->gpct_command[chan] |= G_Synchronized_Gate;
5183
5184        devpriv->stc_writew(dev, devpriv->gpct_mode[chan],
5185                            G_Mode_Register(chan));
5186        devpriv->stc_writew(dev, devpriv->gpct_input_select[chan],
5187                            G_Input_Select_Register(chan));
5188        devpriv->stc_writew(dev, 0, G_Autoincrement_Register(chan));
5189
5190        /* printk("exit GPCT_Reset\n"); */
5191}
5192
5193#endif
5194
5195static int ni_gpct_insn_config(struct comedi_device *dev,
5196                               struct comedi_subdevice *s,
5197                               struct comedi_insn *insn, unsigned int *data)
5198{
5199        struct ni_gpct *counter = s->private;
5200        return ni_tio_insn_config(counter, insn, data);
5201}
5202
5203static int ni_gpct_insn_read(struct comedi_device *dev,
5204                             struct comedi_subdevice *s,
5205                             struct comedi_insn *insn, unsigned int *data)
5206{
5207        struct ni_gpct *counter = s->private;
5208        return ni_tio_rinsn(counter, insn, data);
5209}
5210
5211static int ni_gpct_insn_write(struct comedi_device *dev,
5212                              struct comedi_subdevice *s,
5213                              struct comedi_insn *insn, unsigned int *data)
5214{
5215        struct ni_gpct *counter = s->private;
5216        return ni_tio_winsn(counter, insn, data);
5217}
5218
5219static int ni_gpct_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
5220{
5221        int retval;
5222#ifdef PCIDMA
5223        struct ni_gpct *counter = s->private;
5224/* const struct comedi_cmd *cmd = &s->async->cmd; */
5225
5226        retval = ni_request_gpct_mite_channel(dev, counter->counter_index,
5227                                              COMEDI_INPUT);
5228        if (retval) {
5229                comedi_error(dev,
5230                             "no dma channel available for use by counter");
5231                return retval;
5232        }
5233        ni_tio_acknowledge_and_confirm(counter, NULL, NULL, NULL, NULL);
5234        ni_e_series_enable_second_irq(dev, counter->counter_index, 1);
5235        retval = ni_tio_cmd(counter, s->async);
5236#else
5237        retval = -ENOTSUPP;
5238#endif
5239        return retval;
5240}
5241
5242static int ni_gpct_cmdtest(struct comedi_device *dev,
5243                           struct comedi_subdevice *s, struct comedi_cmd *cmd)
5244{
5245#ifdef PCIDMA
5246        struct ni_gpct *counter = s->private;
5247
5248        return ni_tio_cmdtest(counter, cmd);
5249#else
5250        return -ENOTSUPP;
5251#endif
5252}
5253
5254static int ni_gpct_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
5255{
5256#ifdef PCIDMA
5257        struct ni_gpct *counter = s->private;
5258        int retval;
5259
5260        retval = ni_tio_cancel(counter);
5261        ni_e_series_enable_second_irq(dev, counter->counter_index, 0);
5262        ni_release_gpct_mite_channel(dev, counter->counter_index);
5263        return retval;
5264#else
5265        return 0;
5266#endif
5267}
5268
5269/*
5270 *
5271 *  Programmable Function Inputs
5272 *
5273 */
5274
5275static int ni_m_series_set_pfi_routing(struct comedi_device *dev, unsigned chan,
5276                                       unsigned source)
5277{
5278        unsigned pfi_reg_index;
5279        unsigned array_offset;
5280        if ((source & 0x1f) != source)
5281                return -EINVAL;
5282        pfi_reg_index = 1 + chan / 3;
5283        array_offset = pfi_reg_index - 1;
5284        devpriv->pfi_output_select_reg[array_offset] &=
5285            ~MSeries_PFI_Output_Select_Mask(chan);
5286        devpriv->pfi_output_select_reg[array_offset] |=
5287            MSeries_PFI_Output_Select_Bits(chan, source);
5288        ni_writew(devpriv->pfi_output_select_reg[array_offset],
5289                  M_Offset_PFI_Output_Select(pfi_reg_index));
5290        return 2;
5291}
5292
5293static int ni_old_set_pfi_routing(struct comedi_device *dev, unsigned chan,
5294                                  unsigned source)
5295{
5296        /*  pre-m-series boards have fixed signals on pfi pins */
5297        if (source != ni_old_get_pfi_routing(dev, chan))
5298                return -EINVAL;
5299        return 2;
5300}
5301
5302static int ni_set_pfi_routing(struct comedi_device *dev, unsigned chan,
5303                              unsigned source)
5304{
5305        if (boardtype.reg_type & ni_reg_m_series_mask)
5306                return ni_m_series_set_pfi_routing(dev, chan, source);
5307        else
5308                return ni_old_set_pfi_routing(dev, chan, source);
5309}
5310
5311static unsigned ni_m_series_get_pfi_routing(struct comedi_device *dev,
5312                                            unsigned chan)
5313{
5314        const unsigned array_offset = chan / 3;
5315        return MSeries_PFI_Output_Select_Source(chan,
5316                                                devpriv->
5317                                                pfi_output_select_reg
5318                                                [array_offset]);
5319}
5320
5321static unsigned ni_old_get_pfi_routing(struct comedi_device *dev, unsigned chan)
5322{
5323        /*  pre-m-series boards have fixed signals on pfi pins */
5324        switch (chan) {
5325        case 0:
5326                return NI_PFI_OUTPUT_AI_START1;
5327                break;
5328        case 1:
5329                return NI_PFI_OUTPUT_AI_START2;
5330                break;
5331        case 2:
5332                return NI_PFI_OUTPUT_AI_CONVERT;
5333                break;
5334        case 3:
5335                return NI_PFI_OUTPUT_G_SRC1;
5336                break;
5337        case 4:
5338                return NI_PFI_OUTPUT_G_GATE1;
5339                break;
5340        case 5:
5341                return NI_PFI_OUTPUT_AO_UPDATE_N;
5342                break;
5343        case 6:
5344                return NI_PFI_OUTPUT_AO_START1;
5345                break;
5346        case 7:
5347                return NI_PFI_OUTPUT_AI_START_PULSE;
5348                break;
5349        case 8:
5350                return NI_PFI_OUTPUT_G_SRC0;
5351                break;
5352        case 9:
5353                return NI_PFI_OUTPUT_G_GATE0;
5354                break;
5355        default:
5356                printk("%s: bug, unhandled case in switch.\n", __func__);
5357                break;
5358        }
5359        return 0;
5360}
5361
5362static unsigned ni_get_pfi_routing(struct comedi_device *dev, unsigned chan)
5363{
5364        if (boardtype.reg_type & ni_reg_m_series_mask)
5365                return ni_m_series_get_pfi_routing(dev, chan);
5366        else
5367                return ni_old_get_pfi_routing(dev, chan);
5368}
5369
5370static int ni_config_filter(struct comedi_device *dev, unsigned pfi_channel,
5371                            enum ni_pfi_filter_select filter)
5372{
5373        unsigned bits;
5374        if ((boardtype.reg_type & ni_reg_m_series_mask) == 0) {
5375                return -ENOTSUPP;
5376        }
5377        bits = ni_readl(M_Offset_PFI_Filter);
5378        bits &= ~MSeries_PFI_Filter_Select_Mask(pfi_channel);
5379        bits |= MSeries_PFI_Filter_Select_Bits(pfi_channel, filter);
5380        ni_writel(bits, M_Offset_PFI_Filter);
5381        return 0;
5382}
5383
5384static int ni_pfi_insn_bits(struct comedi_device *dev,
5385                            struct comedi_subdevice *s,
5386                            struct comedi_insn *insn, unsigned int *data)
5387{
5388        if ((boardtype.reg_type & ni_reg_m_series_mask) == 0) {
5389                return -ENOTSUPP;
5390        }
5391        if (data[0]) {
5392                s->state &= ~data[0];
5393                s->state |= (data[0] & data[1]);
5394                ni_writew(s->state, M_Offset_PFI_DO);
5395        }
5396        data[1] = ni_readw(M_Offset_PFI_DI);
5397        return 2;
5398}
5399
5400static int ni_pfi_insn_config(struct comedi_device *dev,
5401                              struct comedi_subdevice *s,
5402                              struct comedi_insn *insn, unsigned int *data)
5403{
5404        unsigned int chan;
5405
5406        if (insn->n < 1)
5407                return -EINVAL;
5408
5409        chan = CR_CHAN(insn->chanspec);
5410
5411        switch (data[0]) {
5412        case COMEDI_OUTPUT:
5413                ni_set_bits(dev, IO_Bidirection_Pin_Register, 1 << chan, 1);
5414                break;
5415        case COMEDI_INPUT:
5416                ni_set_bits(dev, IO_Bidirection_Pin_Register, 1 << chan, 0);
5417                break;
5418        case INSN_CONFIG_DIO_QUERY:
5419                data[1] =
5420                    (devpriv->io_bidirection_pin_reg & (1 << chan)) ?
5421                    COMEDI_OUTPUT : COMEDI_INPUT;
5422                return 0;
5423                break;
5424        case INSN_CONFIG_SET_ROUTING:
5425                return ni_set_pfi_routing(dev, chan, data[1]);
5426                break;
5427        case INSN_CONFIG_GET_ROUTING:
5428                data[1] = ni_get_pfi_routing(dev, chan);
5429                break;
5430        case INSN_CONFIG_FILTER:
5431                return ni_config_filter(dev, chan, data[1]);
5432                break;
5433        default:
5434                return -EINVAL;
5435        }
5436        return 0;
5437}
5438
5439/*
5440 *
5441 *  NI RTSI Bus Functions
5442 *
5443 */
5444static void ni_rtsi_init(struct comedi_device *dev)
5445{
5446        /*  Initialises the RTSI bus signal switch to a default state */
5447
5448        /*  Set clock mode to internal */
5449        devpriv->clock_and_fout2 = MSeries_RTSI_10MHz_Bit;
5450        if (ni_set_master_clock(dev, NI_MIO_INTERNAL_CLOCK, 0) < 0) {
5451                printk("ni_set_master_clock failed, bug?");
5452        }
5453        /*  default internal lines routing to RTSI bus lines */
5454        devpriv->rtsi_trig_a_output_reg =
5455            RTSI_Trig_Output_Bits(0,
5456                                  NI_RTSI_OUTPUT_ADR_START1) |
5457            RTSI_Trig_Output_Bits(1,
5458                                  NI_RTSI_OUTPUT_ADR_START2) |
5459            RTSI_Trig_Output_Bits(2,
5460                                  NI_RTSI_OUTPUT_SCLKG) |
5461            RTSI_Trig_Output_Bits(3, NI_RTSI_OUTPUT_DACUPDN);
5462        devpriv->stc_writew(dev, devpriv->rtsi_trig_a_output_reg,
5463                            RTSI_Trig_A_Output_Register);
5464        devpriv->rtsi_trig_b_output_reg =
5465            RTSI_Trig_Output_Bits(4,
5466                                  NI_RTSI_OUTPUT_DA_START1) |
5467            RTSI_Trig_Output_Bits(5,
5468                                  NI_RTSI_OUTPUT_G_SRC0) |
5469            RTSI_Trig_Output_Bits(6, NI_RTSI_OUTPUT_G_GATE0);
5470        if (boardtype.reg_type & ni_reg_m_series_mask)
5471                devpriv->rtsi_trig_b_output_reg |=
5472                    RTSI_Trig_Output_Bits(7, NI_RTSI_OUTPUT_RTSI_OSC);
5473        devpriv->stc_writew(dev, devpriv->rtsi_trig_b_output_reg,
5474                            RTSI_Trig_B_Output_Register);
5475
5476/*
5477* Sets the source and direction of the 4 on board lines
5478* devpriv->stc_writew(dev, 0x0000, RTSI_Board_Register);
5479*/
5480}
5481
5482static int ni_rtsi_insn_bits(struct comedi_device *dev,
5483                             struct comedi_subdevice *s,
5484                             struct comedi_insn *insn, unsigned int *data)
5485{
5486        if (insn->n != 2)
5487                return -EINVAL;
5488
5489        data[1] = 0;
5490
5491        return 2;
5492}
5493
5494/* Find best multiplier/divider to try and get the PLL running at 80 MHz
5495 * given an arbitrary frequency input clock */
5496static int ni_mseries_get_pll_parameters(unsigned reference_period_ns,
5497                                         unsigned *freq_divider,
5498                                         unsigned *freq_multiplier,
5499                                         unsigned *actual_period_ns)
5500{
5501        unsigned div;
5502        unsigned best_div = 1;
5503        static const unsigned max_div = 0x10;
5504        unsigned mult;
5505        unsigned best_mult = 1;
5506        static const unsigned max_mult = 0x100;
5507        static const unsigned pico_per_nano = 1000;
5508
5509        const unsigned reference_picosec = reference_period_ns * pico_per_nano;
5510        /* m-series wants the phased-locked loop to output 80MHz, which is divided by 4 to
5511         * 20 MHz for most timing clocks */
5512        static const unsigned target_picosec = 12500;
5513        static const unsigned fudge_factor_80_to_20Mhz = 4;
5514        int best_period_picosec = 0;
5515        for (div = 1; div <= max_div; ++div) {
5516                for (mult = 1; mult <= max_mult; ++mult) {
5517                        unsigned new_period_ps =
5518                            (reference_picosec * div) / mult;
5519                        if (abs(new_period_ps - target_picosec) <
5520                            abs(best_period_picosec - target_picosec)) {
5521                                best_period_picosec = new_period_ps;
5522                                best_div = div;
5523                                best_mult = mult;
5524                        }
5525                }
5526        }
5527        if (best_period_picosec == 0) {
5528                printk("%s: bug, failed to find pll parameters\n", __func__);
5529                return -EIO;
5530        }
5531        *freq_divider = best_div;
5532        *freq_multiplier = best_mult;
5533        *actual_period_ns =
5534            (best_period_picosec * fudge_factor_80_to_20Mhz +
5535             (pico_per_nano / 2)) / pico_per_nano;
5536        return 0;
5537}
5538
5539static inline unsigned num_configurable_rtsi_channels(struct comedi_device *dev)
5540{
5541        if (boardtype.reg_type & ni_reg_m_series_mask)
5542                return 8;
5543        else
5544                return 7;
5545}
5546
5547static int ni_mseries_set_pll_master_clock(struct comedi_device *dev,
5548                                           unsigned source, unsigned period_ns)
5549{
5550        static const unsigned min_period_ns = 50;
5551        static const unsigned max_period_ns = 1000;
5552        static const unsigned timeout = 1000;
5553        unsigned pll_control_bits;
5554        unsigned freq_divider;
5555        unsigned freq_multiplier;
5556        unsigned i;
5557        int retval;
5558        if (source == NI_MIO_PLL_PXI10_CLOCK)
5559                period_ns = 100;
5560        /*  these limits are somewhat arbitrary, but NI advertises 1 to 20MHz range so we'll use that */
5561        if (period_ns < min_period_ns || period_ns > max_period_ns) {
5562                printk
5563                    ("%s: you must specify an input clock frequency between %i and %i nanosec "
5564                     "for the phased-lock loop.\n", __func__,
5565                     min_period_ns, max_period_ns);
5566                return -EINVAL;
5567        }
5568        devpriv->rtsi_trig_direction_reg &= ~Use_RTSI_Clock_Bit;
5569        devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg,
5570                            RTSI_Trig_Direction_Register);
5571        pll_control_bits =
5572            MSeries_PLL_Enable_Bit | MSeries_PLL_VCO_Mode_75_150MHz_Bits;
5573        devpriv->clock_and_fout2 |=
5574            MSeries_Timebase1_Select_Bit | MSeries_Timebase3_Select_Bit;
5575        devpriv->clock_and_fout2 &= ~MSeries_PLL_In_Source_Select_Mask;
5576        switch (source) {
5577        case NI_MIO_PLL_PXI_STAR_TRIGGER_CLOCK:
5578                devpriv->clock_and_fout2 |=
5579                    MSeries_PLL_In_Source_Select_Star_Trigger_Bits;
5580                retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
5581                                                       &freq_multiplier,
5582                                                       &devpriv->clock_ns);
5583                if (retval < 0)
5584                        return retval;
5585                break;
5586        case NI_MIO_PLL_PXI10_CLOCK:
5587                /* pxi clock is 10MHz */
5588                devpriv->clock_and_fout2 |=
5589                    MSeries_PLL_In_Source_Select_PXI_Clock10;
5590                retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
5591                                                       &freq_multiplier,
5592                                                       &devpriv->clock_ns);
5593                if (retval < 0)
5594                        return retval;
5595                break;
5596        default:
5597                {
5598                        unsigned rtsi_channel;
5599                        static const unsigned max_rtsi_channel = 7;
5600                        for (rtsi_channel = 0; rtsi_channel <= max_rtsi_channel;
5601                             ++rtsi_channel) {
5602                                if (source ==
5603                                    NI_MIO_PLL_RTSI_CLOCK(rtsi_channel)) {
5604                                        devpriv->clock_and_fout2 |=
5605                                            MSeries_PLL_In_Source_Select_RTSI_Bits
5606                                            (rtsi_channel);
5607                                        break;
5608                                }
5609                        }
5610                        if (rtsi_channel > max_rtsi_channel)
5611                                return -EINVAL;
5612                        retval = ni_mseries_get_pll_parameters(period_ns,
5613                                                               &freq_divider,
5614                                                               &freq_multiplier,
5615                                                               &devpriv->
5616                                                               clock_ns);
5617                        if (retval < 0)
5618                                return retval;
5619                }
5620                break;
5621        }
5622        ni_writew(devpriv->clock_and_fout2, M_Offset_Clock_and_Fout2);
5623        pll_control_bits |=
5624            MSeries_PLL_Divisor_Bits(freq_divider) |
5625            MSeries_PLL_Multiplier_Bits(freq_multiplier);
5626
5627        /* printk("using divider=%i, multiplier=%i for PLL. pll_control_bits = 0x%x\n",
5628         * freq_divider, freq_multiplier, pll_control_bits); */
5629        /* printk("clock_ns=%d\n", devpriv->clock_ns); */
5630        ni_writew(pll_control_bits, M_Offset_PLL_Control);
5631        devpriv->clock_source = source;
5632        /* it seems to typically take a few hundred microseconds for PLL to lock */
5633        for (i = 0; i < timeout; ++i) {
5634                if (ni_readw(M_Offset_PLL_Status) & MSeries_PLL_Locked_Bit) {
5635                        break;
5636                }
5637                udelay(1);
5638        }
5639        if (i == timeout) {
5640                printk
5641                    ("%s: timed out waiting for PLL to lock to reference clock source %i with period %i ns.\n",
5642                     __func__, source, period_ns);
5643                return -ETIMEDOUT;
5644        }
5645        return 3;
5646}
5647
5648static int ni_set_master_clock(struct comedi_device *dev, unsigned source,
5649                               unsigned period_ns)
5650{
5651        if (source == NI_MIO_INTERNAL_CLOCK) {
5652                devpriv->rtsi_trig_direction_reg &= ~Use_RTSI_Clock_Bit;
5653                devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg,
5654                                    RTSI_Trig_Direction_Register);
5655                devpriv->clock_ns = TIMEBASE_1_NS;
5656                if (boardtype.reg_type & ni_reg_m_series_mask) {
5657                        devpriv->clock_and_fout2 &=
5658                            ~(MSeries_Timebase1_Select_Bit |
5659                              MSeries_Timebase3_Select_Bit);
5660                        ni_writew(devpriv->clock_and_fout2,
5661                                  M_Offset_Clock_and_Fout2);
5662                        ni_writew(0, M_Offset_PLL_Control);
5663                }
5664                devpriv->clock_source = source;
5665        } else {
5666                if (boardtype.reg_type & ni_reg_m_series_mask) {
5667                        return ni_mseries_set_pll_master_clock(dev, source,
5668                                                               period_ns);
5669                } else {
5670                        if (source == NI_MIO_RTSI_CLOCK) {
5671                                devpriv->rtsi_trig_direction_reg |=
5672                                    Use_RTSI_Clock_Bit;
5673                                devpriv->stc_writew(dev,
5674                                                    devpriv->
5675                                                    rtsi_trig_direction_reg,
5676                                                    RTSI_Trig_Direction_Register);
5677                                if (period_ns == 0) {
5678                                        printk
5679                                            ("%s: we don't handle an unspecified clock period correctly yet, returning error.\n",
5680                                             __func__);
5681                                        return -EINVAL;
5682                                } else {
5683                                        devpriv->clock_ns = period_ns;
5684                                }
5685                                devpriv->clock_source = source;
5686                        } else
5687                                return -EINVAL;
5688                }
5689        }
5690        return 3;
5691}
5692
5693static int ni_valid_rtsi_output_source(struct comedi_device *dev, unsigned chan,
5694                                       unsigned source)
5695{
5696        if (chan >= num_configurable_rtsi_channels(dev)) {
5697                if (chan == old_RTSI_clock_channel) {
5698                        if (source == NI_RTSI_OUTPUT_RTSI_OSC)
5699                                return 1;
5700                        else {
5701                                printk
5702                                    ("%s: invalid source for channel=%i, channel %i is always the RTSI clock for pre-m-series boards.\n",
5703                                     __func__, chan, old_RTSI_clock_channel);
5704                                return 0;
5705                        }
5706                }
5707                return 0;
5708        }
5709        switch (source) {
5710        case NI_RTSI_OUTPUT_ADR_START1:
5711        case NI_RTSI_OUTPUT_ADR_START2:
5712        case NI_RTSI_OUTPUT_SCLKG:
5713        case NI_RTSI_OUTPUT_DACUPDN:
5714        case NI_RTSI_OUTPUT_DA_START1:
5715        case NI_RTSI_OUTPUT_G_SRC0:
5716        case NI_RTSI_OUTPUT_G_GATE0:
5717        case NI_RTSI_OUTPUT_RGOUT0:
5718        case NI_RTSI_OUTPUT_RTSI_BRD_0:
5719                return 1;
5720                break;
5721        case NI_RTSI_OUTPUT_RTSI_OSC:
5722                if (boardtype.reg_type & ni_reg_m_series_mask)
5723                        return 1;
5724                else
5725                        return 0;
5726                break;
5727        default:
5728                return 0;
5729                break;
5730        }
5731}
5732
5733static int ni_set_rtsi_routing(struct comedi_device *dev, unsigned chan,
5734                               unsigned source)
5735{
5736        if (ni_valid_rtsi_output_source(dev, chan, source) == 0)
5737                return -EINVAL;
5738        if (chan < 4) {
5739                devpriv->rtsi_trig_a_output_reg &= ~RTSI_Trig_Output_Mask(chan);
5740                devpriv->rtsi_trig_a_output_reg |=
5741                    RTSI_Trig_Output_Bits(chan, source);
5742                devpriv->stc_writew(dev, devpriv->rtsi_trig_a_output_reg,
5743                                    RTSI_Trig_A_Output_Register);
5744        } else if (chan < 8) {
5745                devpriv->rtsi_trig_b_output_reg &= ~RTSI_Trig_Output_Mask(chan);
5746                devpriv->rtsi_trig_b_output_reg |=
5747                    RTSI_Trig_Output_Bits(chan, source);
5748                devpriv->stc_writew(dev, devpriv->rtsi_trig_b_output_reg,
5749                                    RTSI_Trig_B_Output_Register);
5750        }
5751        return 2;
5752}
5753
5754static unsigned ni_get_rtsi_routing(struct comedi_device *dev, unsigned chan)
5755{
5756        if (chan < 4) {
5757                return RTSI_Trig_Output_Source(chan,
5758                                               devpriv->rtsi_trig_a_output_reg);
5759        } else if (chan < num_configurable_rtsi_channels(dev)) {
5760                return RTSI_Trig_Output_Source(chan,
5761                                               devpriv->rtsi_trig_b_output_reg);
5762        } else {
5763                if (chan == old_RTSI_clock_channel)
5764                        return NI_RTSI_OUTPUT_RTSI_OSC;
5765                printk("%s: bug! should never get here?\n", __func__);
5766                return 0;
5767        }
5768}
5769
5770static int ni_rtsi_insn_config(struct comedi_device *dev,
5771                               struct comedi_subdevice *s,
5772                               struct comedi_insn *insn, unsigned int *data)
5773{
5774        unsigned int chan = CR_CHAN(insn->chanspec);
5775        switch (data[0]) {
5776        case INSN_CONFIG_DIO_OUTPUT:
5777                if (chan < num_configurable_rtsi_channels(dev)) {
5778                        devpriv->rtsi_trig_direction_reg |=
5779                            RTSI_Output_Bit(chan,
5780                                            (boardtype.
5781                                             reg_type & ni_reg_m_series_mask) !=
5782                                            0);
5783                } else if (chan == old_RTSI_clock_channel) {
5784                        devpriv->rtsi_trig_direction_reg |=
5785                            Drive_RTSI_Clock_Bit;
5786                }
5787                devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg,
5788                                    RTSI_Trig_Direction_Register);
5789                break;
5790        case INSN_CONFIG_DIO_INPUT:
5791                if (chan < num_configurable_rtsi_channels(dev)) {
5792                        devpriv->rtsi_trig_direction_reg &=
5793                            ~RTSI_Output_Bit(chan,
5794                                             (boardtype.
5795                                              reg_type & ni_reg_m_series_mask)
5796                                             != 0);
5797                } else if (chan == old_RTSI_clock_channel) {
5798                        devpriv->rtsi_trig_direction_reg &=
5799                            ~Drive_RTSI_Clock_Bit;
5800                }
5801                devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg,
5802                                    RTSI_Trig_Direction_Register);
5803                break;
5804        case INSN_CONFIG_DIO_QUERY:
5805                if (chan < num_configurable_rtsi_channels(dev)) {
5806                        data[1] =
5807                            (devpriv->rtsi_trig_direction_reg &
5808                             RTSI_Output_Bit(chan,
5809                                             (boardtype.reg_type &
5810                                              ni_reg_m_series_mask)
5811                                             != 0)) ? INSN_CONFIG_DIO_OUTPUT :
5812                            INSN_CONFIG_DIO_INPUT;
5813                } else if (chan == old_RTSI_clock_channel) {
5814                        data[1] =
5815                            (devpriv->rtsi_trig_direction_reg &
5816                             Drive_RTSI_Clock_Bit)
5817                            ? INSN_CONFIG_DIO_OUTPUT : INSN_CONFIG_DIO_INPUT;
5818                }
5819                return 2;
5820                break;
5821        case INSN_CONFIG_SET_CLOCK_SRC:
5822                return ni_set_master_clock(dev, data[1], data[2]);
5823                break;
5824        case INSN_CONFIG_GET_CLOCK_SRC:
5825                data[1] = devpriv->clock_source;
5826                data[2] = devpriv->clock_ns;
5827                return 3;
5828                break;
5829        case INSN_CONFIG_SET_ROUTING:
5830                return ni_set_rtsi_routing(dev, chan, data[1]);
5831                break;
5832        case INSN_CONFIG_GET_ROUTING:
5833                data[1] = ni_get_rtsi_routing(dev, chan);
5834                return 2;
5835                break;
5836        default:
5837                return -EINVAL;
5838                break;
5839        }
5840        return 1;
5841}
5842
5843static int cs5529_wait_for_idle(struct comedi_device *dev)
5844{
5845        unsigned short status;
5846        const int timeout = HZ;
5847        int i;
5848
5849        for (i = 0; i < timeout; i++) {
5850                status = ni_ao_win_inw(dev, CAL_ADC_Status_67xx);
5851                if ((status & CSS_ADC_BUSY) == 0) {
5852                        break;
5853                }
5854                set_current_state(TASK_INTERRUPTIBLE);
5855                if (schedule_timeout(1)) {
5856                        return -EIO;
5857                }
5858        }
5859/* printk("looped %i times waiting for idle\n", i); */
5860        if (i == timeout) {
5861                printk("%s: %s: timeout\n", __FILE__, __func__);
5862                return -ETIME;
5863        }
5864        return 0;
5865}
5866
5867static void cs5529_command(struct comedi_device *dev, unsigned short value)
5868{
5869        static const int timeout = 100;
5870        int i;
5871
5872        ni_ao_win_outw(dev, value, CAL_ADC_Command_67xx);
5873        /* give time for command to start being serially clocked into cs5529.
5874         * this insures that the CSS_ADC_BUSY bit will get properly
5875         * set before we exit this function.
5876         */
5877        for (i = 0; i < timeout; i++) {
5878                if ((ni_ao_win_inw(dev, CAL_ADC_Status_67xx) & CSS_ADC_BUSY))
5879                        break;
5880                udelay(1);
5881        }
5882/* printk("looped %i times writing command to cs5529\n", i); */
5883        if (i == timeout) {
5884                comedi_error(dev, "possible problem - never saw adc go busy?");
5885        }
5886}
5887
5888/* write to cs5529 register */
5889static void cs5529_config_write(struct comedi_device *dev, unsigned int value,
5890                                unsigned int reg_select_bits)
5891{
5892        ni_ao_win_outw(dev, ((value >> 16) & 0xff),
5893                       CAL_ADC_Config_Data_High_Word_67xx);
5894        ni_ao_win_outw(dev, (value & 0xffff),
5895                       CAL_ADC_Config_Data_Low_Word_67xx);
5896        reg_select_bits &= CSCMD_REGISTER_SELECT_MASK;
5897        cs5529_command(dev, CSCMD_COMMAND | reg_select_bits);
5898        if (cs5529_wait_for_idle(dev))
5899                comedi_error(dev, "time or signal in cs5529_config_write()");
5900}
5901
5902#ifdef NI_CS5529_DEBUG
5903/* read from cs5529 register */
5904static unsigned int cs5529_config_read(struct comedi_device *dev,
5905                                       unsigned int reg_select_bits)
5906{
5907        unsigned int value;
5908
5909        reg_select_bits &= CSCMD_REGISTER_SELECT_MASK;
5910        cs5529_command(dev, CSCMD_COMMAND | CSCMD_READ | reg_select_bits);
5911        if (cs5529_wait_for_idle(dev))
5912                comedi_error(dev, "timeout or signal in cs5529_config_read()");
5913        value = (ni_ao_win_inw(dev,
5914                               CAL_ADC_Config_Data_High_Word_67xx) << 16) &
5915            0xff0000;
5916        value |= ni_ao_win_inw(dev, CAL_ADC_Config_Data_Low_Word_67xx) & 0xffff;
5917        return value;
5918}
5919#endif
5920
5921static int cs5529_do_conversion(struct comedi_device *dev, unsigned short *data)
5922{
5923        int retval;
5924        unsigned short status;
5925
5926        cs5529_command(dev, CSCMD_COMMAND | CSCMD_SINGLE_CONVERSION);
5927        retval = cs5529_wait_for_idle(dev);
5928        if (retval) {
5929                comedi_error(dev,
5930                             "timeout or signal in cs5529_do_conversion()");
5931                return -ETIME;
5932        }
5933        status = ni_ao_win_inw(dev, CAL_ADC_Status_67xx);
5934        if (status & CSS_OSC_DETECT) {
5935                printk
5936                    ("ni_mio_common: cs5529 conversion error, status CSS_OSC_DETECT\n");
5937                return -EIO;
5938        }
5939        if (status & CSS_OVERRANGE) {
5940                printk
5941                    ("ni_mio_common: cs5529 conversion error, overrange (ignoring)\n");
5942        }
5943        if (data) {
5944                *data = ni_ao_win_inw(dev, CAL_ADC_Data_67xx);
5945                /* cs5529 returns 16 bit signed data in bipolar mode */
5946                *data ^= (1 << 15);
5947        }
5948        return 0;
5949}
5950
5951static int cs5529_ai_insn_read(struct comedi_device *dev,
5952                               struct comedi_subdevice *s,
5953                               struct comedi_insn *insn, unsigned int *data)
5954{
5955        int n, retval;
5956        unsigned short sample;
5957        unsigned int channel_select;
5958        const unsigned int INTERNAL_REF = 0x1000;
5959
5960        /* Set calibration adc source.  Docs lie, reference select bits 8 to 11
5961         * do nothing. bit 12 seems to chooses internal reference voltage, bit
5962         * 13 causes the adc input to go overrange (maybe reads external reference?) */
5963        if (insn->chanspec & CR_ALT_SOURCE)
5964                channel_select = INTERNAL_REF;
5965        else
5966                channel_select = CR_CHAN(insn->chanspec);
5967        ni_ao_win_outw(dev, channel_select, AO_Calibration_Channel_Select_67xx);
5968
5969        for (n = 0; n < insn->n; n++) {
5970                retval = cs5529_do_conversion(dev, &sample);
5971                if (retval < 0)
5972                        return retval;
5973                data[n] = sample;
5974        }
5975        return insn->n;
5976}
5977
5978static int init_cs5529(struct comedi_device *dev)
5979{
5980        unsigned int config_bits =
5981            CSCFG_PORT_MODE | CSCFG_WORD_RATE_2180_CYCLES;
5982
5983#if 1
5984        /* do self-calibration */
5985        cs5529_config_write(dev, config_bits | CSCFG_SELF_CAL_OFFSET_GAIN,
5986                            CSCMD_CONFIG_REGISTER);
5987        /* need to force a conversion for calibration to run */
5988        cs5529_do_conversion(dev, NULL);
5989#else
5990        /* force gain calibration to 1 */
5991        cs5529_config_write(dev, 0x400000, CSCMD_GAIN_REGISTER);
5992        cs5529_config_write(dev, config_bits | CSCFG_SELF_CAL_OFFSET,
5993                            CSCMD_CONFIG_REGISTER);
5994        if (cs5529_wait_for_idle(dev))
5995                comedi_error(dev, "timeout or signal in init_cs5529()\n");
5996#endif
5997#ifdef NI_CS5529_DEBUG
5998        printk("config: 0x%x\n", cs5529_config_read(dev,
5999                                                    CSCMD_CONFIG_REGISTER));
6000        printk("gain: 0x%x\n", cs5529_config_read(dev, CSCMD_GAIN_REGISTER));
6001        printk("offset: 0x%x\n", cs5529_config_read(dev,
6002                                                    CSCMD_OFFSET_REGISTER));
6003#endif
6004        return 0;
6005}
6006