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