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