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