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