Version:  2.0.40 2.2.26 2.4.37 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18

Linux/drivers/staging/comedi/drivers/ni_pcimio.c

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

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us