Merge branch 'master' into next
[pandora-kernel.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     You should have received a copy of the GNU General Public License
19     along with this program; if not, write to the Free Software
20     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22 /*
23 Driver: ni_pcimio
24 Description: National Instruments PCI-MIO-E series and M series (all boards)
25 Author: ds, John Hallen, Frank Mori Hess, Rolf Mueller, Herbert Peremans,
26   Herman Bruyninckx, Terry Barnaby
27 Status: works
28 Devices: [National Instruments] PCI-MIO-16XE-50 (ni_pcimio),
29   PCI-MIO-16XE-10, PXI-6030E, PCI-MIO-16E-1, PCI-MIO-16E-4, PCI-6014, PCI-6040E,
30   PXI-6040E, PCI-6030E, PCI-6031E, PCI-6032E, PCI-6033E, PCI-6071E, PCI-6023E,
31   PCI-6024E, PCI-6025E, PXI-6025E, PCI-6034E, PCI-6035E, PCI-6052E,
32   PCI-6110, PCI-6111, PCI-6220, PCI-6221, PCI-6224, PXI-6224, PCI-6225,
33   PCI-6229, PCI-6250, PCI-6251, PCIe-6251, PCI-6254, PCI-6259, PCIe-6259,
34   PCI-6280, PCI-6281, PXI-6281, PCI-6284, PCI-6289,
35   PCI-6711, PXI-6711, PCI-6713, PXI-6713,
36   PXI-6071E, PCI-6070E, PXI-6070E,
37   PXI-6052E, PCI-6036E, PCI-6731, PCI-6733, PXI-6733,
38   PCI-6143, PXI-6143
39 Updated: Wed, 03 Dec 2008 10:51:47 +0000
40
41 These boards are almost identical to the AT-MIO E series, except that
42 they use the PCI bus instead of ISA (i.e., AT).  See the notes for
43 the ni_atmio.o driver for additional information about these boards.
44
45 Autocalibration is supported on many of the devices, using the
46 comedi_calibrate (or comedi_soft_calibrate for m-series) utility.
47 M-Series boards do analog input and analog output calibration entirely
48 in software. The software calibration corrects
49 the analog input for offset, gain and
50 nonlinearity.  The analog outputs are corrected for offset and gain.
51 See the comedilib documentation on comedi_get_softcal_converter() for
52 more information.
53
54 By default, the driver uses DMA to transfer analog input data to
55 memory.  When DMA is enabled, not all triggering features are
56 supported.
57
58 Digital I/O may not work on 673x.
59
60 Note that the PCI-6143 is a simultaineous sampling device with 8 convertors.
61 With this board all of the convertors perform one simultaineous sample during
62 a scan interval. The period for a scan is used for the convert time in a
63 Comedi cmd. The convert trigger source is normally set to TRIG_NOW by default.
64
65 The RTSI trigger bus is supported on these cards on
66 subdevice 10. See the comedilib documentation for details.
67
68 Information (number of channels, bits, etc.) for some devices may be
69 incorrect.  Please check this and submit a bug if there are problems
70 for your device.
71
72 SCXI is probably broken for m-series boards.
73
74 Bugs:
75  - When DMA is enabled, COMEDI_EV_CONVERT does
76    not work correctly.
77
78 */
79 /*
80         The PCI-MIO E series driver was originally written by
81         Tomasz Motylewski <...>, and ported to comedi by ds.
82
83         References:
84
85            341079b.pdf  PCI E Series Register-Level Programmer Manual
86            340934b.pdf  DAQ-STC reference manual
87
88            322080b.pdf  6711/6713/6715 User Manual
89
90            320945c.pdf  PCI E Series User Manual
91            322138a.pdf  PCI-6052E and DAQPad-6052E User Manual
92
93         ISSUES:
94
95         need to deal with external reference for DAC, and other DAC
96         properties in board properties
97
98         deal with at-mio-16de-10 revision D to N changes, etc.
99
100         need to add other CALDAC type
101
102         need to slow down DAC loading.  I don't trust NI's claim that
103         two writes to the PCI bus slows IO enough.  I would prefer to
104         use comedi_udelay().  Timing specs: (clock)
105                 AD8522          30ns
106                 DAC8043         120ns
107                 DAC8800         60ns
108                 MB88341         ?
109
110 */
111
112 #include "../comedidev.h"
113
114 #include <asm/byteorder.h>
115 #include <linux/delay.h>
116
117 #include "ni_stc.h"
118 #include "mite.h"
119
120 //#define PCI_DEBUG
121
122 #define PCIDMA
123
124 #define PCIMIO 1
125 #undef ATMIO
126
127 #define MAX_N_CALDACS (16+16+2)
128
129 #define DRV_NAME "ni_pcimio"
130
131 /* The following two tables must be in the same order */
132 static DEFINE_PCI_DEVICE_TABLE(ni_pci_table) = {
133         {PCI_VENDOR_ID_NATINST, 0x0162, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
134         {PCI_VENDOR_ID_NATINST, 0x1170, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
135         {PCI_VENDOR_ID_NATINST, 0x1180, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
136         {PCI_VENDOR_ID_NATINST, 0x1190, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
137         {PCI_VENDOR_ID_NATINST, 0x11b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
138         {PCI_VENDOR_ID_NATINST, 0x11c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
139         {PCI_VENDOR_ID_NATINST, 0x11d0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
140         {PCI_VENDOR_ID_NATINST, 0x1270, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
141         {PCI_VENDOR_ID_NATINST, 0x1330, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
142         {PCI_VENDOR_ID_NATINST, 0x1340, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
143         {PCI_VENDOR_ID_NATINST, 0x1350, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
144         {PCI_VENDOR_ID_NATINST, 0x14e0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
145         {PCI_VENDOR_ID_NATINST, 0x14f0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
146         {PCI_VENDOR_ID_NATINST, 0x1580, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
147         {PCI_VENDOR_ID_NATINST, 0x15b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
148         {PCI_VENDOR_ID_NATINST, 0x1880, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
149         {PCI_VENDOR_ID_NATINST, 0x1870, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
150         {PCI_VENDOR_ID_NATINST, 0x18b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
151         {PCI_VENDOR_ID_NATINST, 0x18c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
152         {PCI_VENDOR_ID_NATINST, 0x2410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
153         {PCI_VENDOR_ID_NATINST, 0x2420, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
154         {PCI_VENDOR_ID_NATINST, 0x2430, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
155         {PCI_VENDOR_ID_NATINST, 0x2890, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
156         {PCI_VENDOR_ID_NATINST, 0x28c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
157         {PCI_VENDOR_ID_NATINST, 0x2a60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
158         {PCI_VENDOR_ID_NATINST, 0x2a70, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
159         {PCI_VENDOR_ID_NATINST, 0x2a80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
160         {PCI_VENDOR_ID_NATINST, 0x2ab0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
161         {PCI_VENDOR_ID_NATINST, 0x2b80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
162         {PCI_VENDOR_ID_NATINST, 0x2b90, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
163         {PCI_VENDOR_ID_NATINST, 0x2c80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
164         {PCI_VENDOR_ID_NATINST, 0x2ca0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
165         {PCI_VENDOR_ID_NATINST, 0x70aa, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
166         {PCI_VENDOR_ID_NATINST, 0x70ab, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
167         {PCI_VENDOR_ID_NATINST, 0x70ac, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
168         {PCI_VENDOR_ID_NATINST, 0x70af, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
169         {PCI_VENDOR_ID_NATINST, 0x70b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
170         {PCI_VENDOR_ID_NATINST, 0x70b4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
171         {PCI_VENDOR_ID_NATINST, 0x70b6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
172         {PCI_VENDOR_ID_NATINST, 0x70b7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
173         {PCI_VENDOR_ID_NATINST, 0x70b8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
174         {PCI_VENDOR_ID_NATINST, 0x70bc, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
175         {PCI_VENDOR_ID_NATINST, 0x70bd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
176         {PCI_VENDOR_ID_NATINST, 0x70bf, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
177         {PCI_VENDOR_ID_NATINST, 0x70c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
178         {PCI_VENDOR_ID_NATINST, 0x70f2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
179         {PCI_VENDOR_ID_NATINST, 0x710d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
180         {PCI_VENDOR_ID_NATINST, 0x716c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
181         {PCI_VENDOR_ID_NATINST, 0x717f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
182         {PCI_VENDOR_ID_NATINST, 0x71bc, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
183         {PCI_VENDOR_ID_NATINST, 0x717d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
184         {0}
185 };
186
187 MODULE_DEVICE_TABLE(pci, ni_pci_table);
188
189 /* These are not all the possible ao ranges for 628x boards.
190  They can do OFFSET +- REFERENCE where OFFSET can be
191  0V, 5V, APFI<0,1>, or AO<0...3> and RANGE can
192  be 10V, 5V, 2V, 1V, APFI<0,1>, AO<0...3>.  That's
193  63 different possibilities.  An AO channel
194  can not act as it's own OFFSET or REFERENCE.
195 */
196 static const struct comedi_lrange range_ni_M_628x_ao = { 8, {
197                         RANGE(-10, 10),
198                         RANGE(-5, 5),
199                         RANGE(-2, 2),
200                         RANGE(-1, 1),
201                         RANGE(-5, 15),
202                         RANGE(0, 10),
203                         RANGE(3, 7),
204                         RANGE(4, 6),
205                         RANGE_ext(-1, 1)
206         }
207 };
208 static const struct comedi_lrange range_ni_M_625x_ao = { 3, {
209                         RANGE(-10, 10),
210                         RANGE(-5, 5),
211                         RANGE_ext(-1, 1)
212         }
213 };
214 static const struct comedi_lrange range_ni_M_622x_ao = { 1, {
215                         RANGE(-10, 10),
216         }
217 };
218
219 static const ni_board ni_boards[] = {
220         {
221                         .device_id = 0x0162,    // NI also says 0x1620.  typo?
222                         .name = "pci-mio-16xe-50",
223                         .n_adchan = 16,
224                         .adbits = 16,
225                         .ai_fifo_depth = 2048,
226                         .alwaysdither = 1,
227                         .gainlkup = ai_gain_8,
228                         .ai_speed = 50000,
229                         .n_aochan = 2,
230                         .aobits = 12,
231                         .ao_fifo_depth = 0,
232                         .ao_range_table = &range_bipolar10,
233                         .ao_unipolar = 0,
234                         .ao_speed = 50000,
235                         .num_p0_dio_channels = 8,
236                         .caldac = {dac8800, dac8043},
237                         .has_8255 = 0,
238                 },
239         {
240                         .device_id = 0x1170,
241                         .name = "pci-mio-16xe-10",      // aka pci-6030E
242                         .n_adchan = 16,
243                         .adbits = 16,
244                         .ai_fifo_depth = 512,
245                         .alwaysdither = 1,
246                         .gainlkup = ai_gain_14,
247                         .ai_speed = 10000,
248                         .n_aochan = 2,
249                         .aobits = 16,
250                         .ao_fifo_depth = 2048,
251                         .ao_range_table = &range_ni_E_ao_ext,
252                         .ao_unipolar = 1,
253                         .ao_speed = 10000,
254                         .num_p0_dio_channels = 8,
255                         .caldac = {dac8800, dac8043, ad8522},
256                         .has_8255 = 0,
257                 },
258         {
259                         .device_id = 0x28c0,
260                         .name = "pci-6014",
261                         .n_adchan = 16,
262                         .adbits = 16,
263                         .ai_fifo_depth = 512,
264                         .alwaysdither = 1,
265                         .gainlkup = ai_gain_4,
266                         .ai_speed = 5000,
267                         .n_aochan = 2,
268                         .aobits = 16,
269                         .ao_fifo_depth = 0,
270                         .ao_range_table = &range_bipolar10,
271                         .ao_unipolar = 0,
272                         .ao_speed = 100000,
273                         .num_p0_dio_channels = 8,
274                         .caldac = {ad8804_debug},
275                         .has_8255 = 0,
276                 },
277         {
278                         .device_id = 0x11d0,
279                         .name = "pxi-6030e",
280                         .n_adchan = 16,
281                         .adbits = 16,
282                         .ai_fifo_depth = 512,
283                         .alwaysdither = 1,
284                         .gainlkup = ai_gain_14,
285                         .ai_speed = 10000,
286                         .n_aochan = 2,
287                         .aobits = 16,
288                         .ao_fifo_depth = 2048,
289                         .ao_range_table = &range_ni_E_ao_ext,
290                         .ao_unipolar = 1,
291                         .ao_speed = 10000,
292                         .num_p0_dio_channels = 8,
293                         .caldac = {dac8800, dac8043, ad8522},
294                         .has_8255 = 0,
295                 },
296         {
297                         .device_id = 0x1180,
298                         .name = "pci-mio-16e-1",        /* aka pci-6070e */
299                         .n_adchan = 16,
300                         .adbits = 12,
301                         .ai_fifo_depth = 512,
302                         .alwaysdither = 0,
303                         .gainlkup = ai_gain_16,
304                         .ai_speed = 800,
305                         .n_aochan = 2,
306                         .aobits = 12,
307                         .ao_fifo_depth = 2048,
308                         .ao_range_table = &range_ni_E_ao_ext,
309                         .ao_unipolar = 1,
310                         .ao_speed = 1000,
311                         .num_p0_dio_channels = 8,
312                         .caldac = {mb88341},
313                         .has_8255 = 0,
314                 },
315         {
316                         .device_id = 0x1190,
317                         .name = "pci-mio-16e-4",        /* aka pci-6040e */
318                         .n_adchan = 16,
319                         .adbits = 12,
320                         .ai_fifo_depth = 512,
321                         .alwaysdither = 0,
322                         .gainlkup = ai_gain_16,
323                         /* Note: there have been reported problems with full speed
324                          * on this board */
325                         .ai_speed = 2000,
326                         .n_aochan = 2,
327                         .aobits = 12,
328                         .ao_fifo_depth = 512,
329                         .ao_range_table = &range_ni_E_ao_ext,
330                         .ao_unipolar = 1,
331                         .ao_speed = 1000,
332                         .num_p0_dio_channels = 8,
333                         .caldac = {ad8804_debug},       // doc says mb88341
334                         .has_8255 = 0,
335                 },
336         {
337                         .device_id = 0x11c0,
338                         .name = "pxi-6040e",
339                         .n_adchan = 16,
340                         .adbits = 12,
341                         .ai_fifo_depth = 512,
342                         .alwaysdither = 0,
343                         .gainlkup = ai_gain_16,
344                         .ai_speed = 2000,
345                         .n_aochan = 2,
346                         .aobits = 12,
347                         .ao_fifo_depth = 512,
348                         .ao_range_table = &range_ni_E_ao_ext,
349                         .ao_unipolar = 1,
350                         .ao_speed = 1000,
351                         .num_p0_dio_channels = 8,
352                         .caldac = {mb88341},
353                         .has_8255 = 0,
354                 },
355
356         {
357                         .device_id = 0x1330,
358                         .name = "pci-6031e",
359                         .n_adchan = 64,
360                         .adbits = 16,
361                         .ai_fifo_depth = 512,
362                         .alwaysdither = 1,
363                         .gainlkup = ai_gain_14,
364                         .ai_speed = 10000,
365                         .n_aochan = 2,
366                         .aobits = 16,
367                         .ao_fifo_depth = 2048,
368                         .ao_range_table = &range_ni_E_ao_ext,
369                         .ao_unipolar = 1,
370                         .ao_speed = 10000,
371                         .num_p0_dio_channels = 8,
372                         .caldac = {dac8800, dac8043, ad8522},
373                         .has_8255 = 0,
374                 },
375         {
376                         .device_id = 0x1270,
377                         .name = "pci-6032e",
378                         .n_adchan = 16,
379                         .adbits = 16,
380                         .ai_fifo_depth = 512,
381                         .alwaysdither = 1,
382                         .gainlkup = ai_gain_14,
383                         .ai_speed = 10000,
384                         .n_aochan = 0,
385                         .aobits = 0,
386                         .ao_fifo_depth = 0,
387                         .ao_unipolar = 0,
388                         .num_p0_dio_channels = 8,
389                         .caldac = {dac8800, dac8043, ad8522},
390                         .has_8255 = 0,
391                 },
392         {
393                         .device_id = 0x1340,
394                         .name = "pci-6033e",
395                         .n_adchan = 64,
396                         .adbits = 16,
397                         .ai_fifo_depth = 512,
398                         .alwaysdither = 1,
399                         .gainlkup = ai_gain_14,
400                         .ai_speed = 10000,
401                         .n_aochan = 0,
402                         .aobits = 0,
403                         .ao_fifo_depth = 0,
404                         .ao_unipolar = 0,
405                         .num_p0_dio_channels = 8,
406                         .caldac = {dac8800, dac8043, ad8522},
407                         .has_8255 = 0,
408                 },
409         {
410                         .device_id = 0x1350,
411                         .name = "pci-6071e",
412                         .n_adchan = 64,
413                         .adbits = 12,
414                         .ai_fifo_depth = 512,
415                         .alwaysdither = 1,
416                         .gainlkup = ai_gain_16,
417                         .ai_speed = 800,
418                         .n_aochan = 2,
419                         .aobits = 12,
420                         .ao_fifo_depth = 2048,
421                         .ao_range_table = &range_ni_E_ao_ext,
422                         .ao_unipolar = 1,
423                         .ao_speed = 1000,
424                         .num_p0_dio_channels = 8,
425                         .caldac = {ad8804_debug},
426                         .has_8255 = 0,
427                 },
428         {
429                         .device_id = 0x2a60,
430                         .name = "pci-6023e",
431                         .n_adchan = 16,
432                         .adbits = 12,
433                         .ai_fifo_depth = 512,
434                         .alwaysdither = 0,
435                         .gainlkup = ai_gain_4,
436                         .ai_speed = 5000,
437                         .n_aochan = 0,
438                         .aobits = 0,
439                         .ao_unipolar = 0,
440                         .num_p0_dio_channels = 8,
441                         .caldac = {ad8804_debug},       /* manual is wrong */
442                         .has_8255 = 0,
443                 },
444         {
445                         .device_id = 0x2a70,
446                         .name = "pci-6024e",
447                         .n_adchan = 16,
448                         .adbits = 12,
449                         .ai_fifo_depth = 512,
450                         .alwaysdither = 0,
451                         .gainlkup = ai_gain_4,
452                         .ai_speed = 5000,
453                         .n_aochan = 2,
454                         .aobits = 12,
455                         .ao_fifo_depth = 0,
456                         .ao_range_table = &range_bipolar10,
457                         .ao_unipolar = 0,
458                         .ao_speed = 100000,
459                         .num_p0_dio_channels = 8,
460                         .caldac = {ad8804_debug},       /* manual is wrong */
461                         .has_8255 = 0,
462                 },
463         {
464                         .device_id = 0x2a80,
465                         .name = "pci-6025e",
466                         .n_adchan = 16,
467                         .adbits = 12,
468                         .ai_fifo_depth = 512,
469                         .alwaysdither = 0,
470                         .gainlkup = ai_gain_4,
471                         .ai_speed = 5000,
472                         .n_aochan = 2,
473                         .aobits = 12,
474                         .ao_fifo_depth = 0,
475                         .ao_range_table = &range_bipolar10,
476                         .ao_unipolar = 0,
477                         .ao_speed = 100000,
478                         .num_p0_dio_channels = 8,
479                         .caldac = {ad8804_debug},       /* manual is wrong */
480                         .has_8255 = 1,
481                 },
482         {
483                         .device_id = 0x2ab0,
484                         .name = "pxi-6025e",
485                         .n_adchan = 16,
486                         .adbits = 12,
487                         .ai_fifo_depth = 512,
488                         .alwaysdither = 0,
489                         .gainlkup = ai_gain_4,
490                         .ai_speed = 5000,
491                         .n_aochan = 2,
492                         .aobits = 12,
493                         .ao_fifo_depth = 0,
494                         .ao_range_table = &range_ni_E_ao_ext,
495                         .ao_unipolar = 1,
496                         .ao_speed = 100000,
497                         .num_p0_dio_channels = 8,
498                         .caldac = {ad8804_debug},       /* manual is wrong */
499                         .has_8255 = 1,
500                 },
501
502         {
503                         .device_id = 0x2ca0,
504                         .name = "pci-6034e",
505                         .n_adchan = 16,
506                         .adbits = 16,
507                         .ai_fifo_depth = 512,
508                         .alwaysdither = 1,
509                         .gainlkup = ai_gain_4,
510                         .ai_speed = 5000,
511                         .n_aochan = 0,
512                         .aobits = 0,
513                         .ao_fifo_depth = 0,
514                         .ao_unipolar = 0,
515                         .num_p0_dio_channels = 8,
516                         .caldac = {ad8804_debug},
517                         .has_8255 = 0,
518                 },
519         {
520                         .device_id = 0x2c80,
521                         .name = "pci-6035e",
522                         .n_adchan = 16,
523                         .adbits = 16,
524                         .ai_fifo_depth = 512,
525                         .alwaysdither = 1,
526                         .gainlkup = ai_gain_4,
527                         .ai_speed = 5000,
528                         .n_aochan = 2,
529                         .aobits = 12,
530                         .ao_fifo_depth = 0,
531                         .ao_range_table = &range_bipolar10,
532                         .ao_unipolar = 0,
533                         .ao_speed = 100000,
534                         .num_p0_dio_channels = 8,
535                         .caldac = {ad8804_debug},
536                         .has_8255 = 0,
537                 },
538         {
539                         .device_id = 0x18b0,
540                         .name = "pci-6052e",
541                         .n_adchan = 16,
542                         .adbits = 16,
543                         .ai_fifo_depth = 512,
544                         .alwaysdither = 1,
545                         .gainlkup = ai_gain_16,
546                         .ai_speed = 3000,
547                         .n_aochan = 2,
548                         .aobits = 16,
549                         .ao_unipolar = 1,
550                         .ao_fifo_depth = 2048,
551                         .ao_range_table = &range_ni_E_ao_ext,
552                         .ao_speed = 3000,
553                         .num_p0_dio_channels = 8,
554                         .caldac = {ad8804_debug, ad8804_debug, ad8522}, /* manual is wrong */
555                 },
556         {.device_id = 0x14e0,
557                         .name = "pci-6110",
558                         .n_adchan = 4,
559                         .adbits = 12,
560                         .ai_fifo_depth = 8192,
561                         .alwaysdither = 0,
562                         .gainlkup = ai_gain_611x,
563                         .ai_speed = 200,
564                         .n_aochan = 2,
565                         .aobits = 16,
566                         .reg_type = ni_reg_611x,
567                         .ao_range_table = &range_bipolar10,
568                         .ao_unipolar = 0,
569                         .ao_fifo_depth = 2048,
570                         .ao_speed = 250,
571                         .num_p0_dio_channels = 8,
572                         .caldac = {ad8804, ad8804},
573                 },
574         {
575                         .device_id = 0x14f0,
576                         .name = "pci-6111",
577                         .n_adchan = 2,
578                         .adbits = 12,
579                         .ai_fifo_depth = 8192,
580                         .alwaysdither = 0,
581                         .gainlkup = ai_gain_611x,
582                         .ai_speed = 200,
583                         .n_aochan = 2,
584                         .aobits = 16,
585                         .reg_type = ni_reg_611x,
586                         .ao_range_table = &range_bipolar10,
587                         .ao_unipolar = 0,
588                         .ao_fifo_depth = 2048,
589                         .ao_speed = 250,
590                         .num_p0_dio_channels = 8,
591                         .caldac = {ad8804, ad8804},
592                 },
593 #if 0
594         /* The 6115 boards probably need their own driver */
595         {
596                         .device_id = 0x2ed0,
597                         .name = "pci-6115",
598                         .n_adchan = 4,
599                         .adbits = 12,
600                         .ai_fifo_depth = 8192,
601                         .alwaysdither = 0,
602                         .gainlkup = ai_gain_611x,
603                         .ai_speed = 100,
604                         .n_aochan = 2,
605                         .aobits = 16,
606                         .ao_671x = 1,
607                         .ao_unipolar = 0,
608                         .ao_fifo_depth = 2048,
609                         .ao_speed = 250,
610                         .num_p0_dio_channels = 8,
611                         .reg_611x = 1,
612                         .caldac = {ad8804_debug, ad8804_debug, ad8804_debug},   /* XXX */
613                 },
614 #endif
615 #if 0
616         {
617                         .device_id = 0x0000,
618                         .name = "pxi-6115",
619                         .n_adchan = 4,
620                         .adbits = 12,
621                         .ai_fifo_depth = 8192,
622                         .alwaysdither = 0,
623                         .gainlkup = ai_gain_611x,
624                         .ai_speed = 100,
625                         .n_aochan = 2,
626                         .aobits = 16,
627                         .ao_671x = 1,
628                         .ao_unipolar = 0,
629                         .ao_fifo_depth = 2048,
630                         .ao_speed = 250,
631                         .reg_611x = 1,
632                         .num_p0_dio_channels = 8,
633                         caldac = {ad8804_debug, ad8804_debug, ad8804_debug},    /* XXX */
634                 },
635 #endif
636         {
637                         .device_id = 0x1880,
638                         .name = "pci-6711",
639                         .n_adchan = 0,  /* no analog input */
640                         .n_aochan = 4,
641                         .aobits = 12,
642                         .ao_unipolar = 0,
643                         .ao_fifo_depth = 16384,
644                         /* data sheet says 8192, but fifo really holds 16384 samples */
645                         .ao_range_table = &range_bipolar10,
646                         .ao_speed = 1000,
647                         .num_p0_dio_channels = 8,
648                         .reg_type = ni_reg_6711,
649                         .caldac = {ad8804_debug},
650                 },
651         {
652                         .device_id = 0x2b90,
653                         .name = "pxi-6711",
654                         .n_adchan = 0,  /* no analog input */
655                         .n_aochan = 4,
656                         .aobits = 12,
657                         .ao_unipolar = 0,
658                         .ao_fifo_depth = 16384,
659                         .ao_range_table = &range_bipolar10,
660                         .ao_speed = 1000,
661                         .num_p0_dio_channels = 8,
662                         .reg_type = ni_reg_6711,
663                         .caldac = {ad8804_debug},
664                 },
665         {
666                         .device_id = 0x1870,
667                         .name = "pci-6713",
668                         .n_adchan = 0,  /* no analog input */
669                         .n_aochan = 8,
670                         .aobits = 12,
671                         .ao_unipolar = 0,
672                         .ao_fifo_depth = 16384,
673                         .ao_range_table = &range_bipolar10,
674                         .ao_speed = 1000,
675                         .num_p0_dio_channels = 8,
676                         .reg_type = ni_reg_6713,
677                         .caldac = {ad8804_debug, ad8804_debug},
678                 },
679         {
680                         .device_id = 0x2b80,
681                         .name = "pxi-6713",
682                         .n_adchan = 0,  /* no analog input */
683                         .n_aochan = 8,
684                         .aobits = 12,
685                         .ao_unipolar = 0,
686                         .ao_fifo_depth = 16384,
687                         .ao_range_table = &range_bipolar10,
688                         .ao_speed = 1000,
689                         .num_p0_dio_channels = 8,
690                         .reg_type = ni_reg_6713,
691                         .caldac = {ad8804_debug, ad8804_debug},
692                 },
693         {
694                         .device_id = 0x2430,
695                         .name = "pci-6731",
696                         .n_adchan = 0,  /* no analog input */
697                         .n_aochan = 4,
698                         .aobits = 16,
699                         .ao_unipolar = 0,
700                         .ao_fifo_depth = 8192,
701                         .ao_range_table = &range_bipolar10,
702                         .ao_speed = 1000,
703                         .num_p0_dio_channels = 8,
704                         .reg_type = ni_reg_6711,
705                         .caldac = {ad8804_debug},
706                 },
707 #if 0                           /* need device ids */
708         {
709                         .device_id = 0x0,
710                         .name = "pxi-6731",
711                         .n_adchan = 0,  /* no analog input */
712                         .n_aochan = 4,
713                         .aobits = 16,
714                         .ao_unipolar = 0,
715                         .ao_fifo_depth = 8192,
716                         .ao_range_table = &range_bipolar10,
717                         .num_p0_dio_channels = 8,
718                         .reg_type = ni_reg_6711,
719                         .caldac = {ad8804_debug},
720                 },
721 #endif
722         {
723                         .device_id = 0x2410,
724                         .name = "pci-6733",
725                         .n_adchan = 0,  /* no analog input */
726                         .n_aochan = 8,
727                         .aobits = 16,
728                         .ao_unipolar = 0,
729                         .ao_fifo_depth = 16384,
730                         .ao_range_table = &range_bipolar10,
731                         .ao_speed = 1000,
732                         .num_p0_dio_channels = 8,
733                         .reg_type = ni_reg_6713,
734                         .caldac = {ad8804_debug, ad8804_debug},
735                 },
736         {
737                         .device_id = 0x2420,
738                         .name = "pxi-6733",
739                         .n_adchan = 0,  /* no analog input */
740                         .n_aochan = 8,
741                         .aobits = 16,
742                         .ao_unipolar = 0,
743                         .ao_fifo_depth = 16384,
744                         .ao_range_table = &range_bipolar10,
745                         .ao_speed = 1000,
746                         .num_p0_dio_channels = 8,
747                         .reg_type = ni_reg_6713,
748                         .caldac = {ad8804_debug, ad8804_debug},
749                 },
750         {
751                         .device_id = 0x15b0,
752                         .name = "pxi-6071e",
753                         .n_adchan = 64,
754                         .adbits = 12,
755                         .ai_fifo_depth = 512,
756                         .alwaysdither = 1,
757                         .gainlkup = ai_gain_16,
758                         .ai_speed = 800,
759                         .n_aochan = 2,
760                         .aobits = 12,
761                         .ao_fifo_depth = 2048,
762                         .ao_range_table = &range_ni_E_ao_ext,
763                         .ao_unipolar = 1,
764                         .ao_speed = 1000,
765                         .num_p0_dio_channels = 8,
766                         .caldac = {ad8804_debug},
767                         .has_8255 = 0,
768                 },
769         {
770                         .device_id = 0x11b0,
771                         .name = "pxi-6070e",
772                         .n_adchan = 16,
773                         .adbits = 12,
774                         .ai_fifo_depth = 512,
775                         .alwaysdither = 1,
776                         .gainlkup = ai_gain_16,
777                         .ai_speed = 800,
778                         .n_aochan = 2,
779                         .aobits = 12,
780                         .ao_fifo_depth = 2048,
781                         .ao_range_table = &range_ni_E_ao_ext,
782                         .ao_unipolar = 1,
783                         .ao_speed = 1000,
784                         .num_p0_dio_channels = 8,
785                         .caldac = {ad8804_debug},
786                         .has_8255 = 0,
787                 },
788         {
789                         .device_id = 0x18c0,
790                         .name = "pxi-6052e",
791                         .n_adchan = 16,
792                         .adbits = 16,
793                         .ai_fifo_depth = 512,
794                         .alwaysdither = 1,
795                         .gainlkup = ai_gain_16,
796                         .ai_speed = 3000,
797                         .n_aochan = 2,
798                         .aobits = 16,
799                         .ao_unipolar = 1,
800                         .ao_fifo_depth = 2048,
801                         .ao_range_table = &range_ni_E_ao_ext,
802                         .ao_speed = 3000,
803                         .num_p0_dio_channels = 8,
804                         .caldac = {mb88341, mb88341, ad8522},
805                 },
806         {
807                         .device_id = 0x1580,
808                         .name = "pxi-6031e",
809                         .n_adchan = 64,
810                         .adbits = 16,
811                         .ai_fifo_depth = 512,
812                         .alwaysdither = 1,
813                         .gainlkup = ai_gain_14,
814                         .ai_speed = 10000,
815                         .n_aochan = 2,
816                         .aobits = 16,
817                         .ao_fifo_depth = 2048,
818                         .ao_range_table = &range_ni_E_ao_ext,
819                         .ao_unipolar = 1,
820                         .ao_speed = 10000,
821                         .num_p0_dio_channels = 8,
822                         .caldac = {dac8800, dac8043, ad8522},
823                 },
824         {
825                         .device_id = 0x2890,
826                         .name = "pci-6036e",
827                         .n_adchan = 16,
828                         .adbits = 16,
829                         .ai_fifo_depth = 512,
830                         .alwaysdither = 1,
831                         .gainlkup = ai_gain_4,
832                         .ai_speed = 5000,
833                         .n_aochan = 2,
834                         .aobits = 16,
835                         .ao_fifo_depth = 0,
836                         .ao_range_table = &range_bipolar10,
837                         .ao_unipolar = 0,
838                         .ao_speed = 100000,
839                         .num_p0_dio_channels = 8,
840                         .caldac = {ad8804_debug},
841                         .has_8255 = 0,
842                 },
843         {
844                         .device_id = 0x70b0,
845                         .name = "pci-6220",
846                         .n_adchan = 16,
847                         .adbits = 16,
848                         .ai_fifo_depth = 512,
849                         //FIXME:  guess
850                         .gainlkup = ai_gain_622x,
851                         .ai_speed = 4000,
852                         .n_aochan = 0,
853                         .aobits = 0,
854                         .ao_fifo_depth = 0,
855                         .num_p0_dio_channels = 8,
856                         .reg_type = ni_reg_622x,
857                         .ao_unipolar = 0,
858                         .caldac = {caldac_none},
859                         .has_8255 = 0,
860                 },
861         {
862                         .device_id = 0x70af,
863                         .name = "pci-6221",
864                         .n_adchan = 16,
865                         .adbits = 16,
866                         .ai_fifo_depth = 4095,
867                         .gainlkup = ai_gain_622x,
868                         .ai_speed = 4000,
869                         .n_aochan = 2,
870                         .aobits = 16,
871                         .ao_fifo_depth = 8191,
872                         .ao_range_table = &range_ni_M_622x_ao,
873                         .reg_type = ni_reg_622x,
874                         .ao_unipolar = 0,
875                         .ao_speed = 1200,
876                         .num_p0_dio_channels = 8,
877                         .caldac = {caldac_none},
878                         .has_8255 = 0,
879                 },
880         {
881                         .device_id = 0x71bc,
882                         .name = "pci-6221_37pin",
883                         .n_adchan = 16,
884                         .adbits = 16,
885                         .ai_fifo_depth = 4095,
886                         .gainlkup = ai_gain_622x,
887                         .ai_speed = 4000,
888                         .n_aochan = 2,
889                         .aobits = 16,
890                         .ao_fifo_depth = 8191,
891                         .ao_range_table = &range_ni_M_622x_ao,
892                         .reg_type = ni_reg_622x,
893                         .ao_unipolar = 0,
894                         .ao_speed = 1200,
895                         .num_p0_dio_channels = 8,
896                         .caldac = {caldac_none},
897                         .has_8255 = 0,
898                 },
899         {
900                         .device_id = 0x70f2,
901                         .name = "pci-6224",
902                         .n_adchan = 32,
903                         .adbits = 16,
904                         .ai_fifo_depth = 4095,
905                         .gainlkup = ai_gain_622x,
906                         .ai_speed = 4000,
907                         .n_aochan = 0,
908                         .aobits = 0,
909                         .ao_fifo_depth = 0,
910                         .reg_type = ni_reg_622x,
911                         .ao_unipolar = 0,
912                         .num_p0_dio_channels = 32,
913                         .caldac = {caldac_none},
914                         .has_8255 = 0,
915                 },
916         {
917                         .device_id = 0x70f3,
918                         .name = "pxi-6224",
919                         .n_adchan = 32,
920                         .adbits = 16,
921                         .ai_fifo_depth = 4095,
922                         .gainlkup = ai_gain_622x,
923                         .ai_speed = 4000,
924                         .n_aochan = 0,
925                         .aobits = 0,
926                         .ao_fifo_depth = 0,
927                         .reg_type = ni_reg_622x,
928                         .ao_unipolar = 0,
929                         .num_p0_dio_channels = 32,
930                         .caldac = {caldac_none},
931                         .has_8255 = 0,
932                 },
933         {
934                         .device_id = 0x716c,
935                         .name = "pci-6225",
936                         .n_adchan = 80,
937                         .adbits = 16,
938                         .ai_fifo_depth = 4095,
939                         .gainlkup = ai_gain_622x,
940                         .ai_speed = 4000,
941                         .n_aochan = 2,
942                         .aobits = 16,
943                         .ao_fifo_depth = 8191,
944                         .ao_range_table = &range_ni_M_622x_ao,
945                         .reg_type = ni_reg_622x,
946                         .ao_unipolar = 0,
947                         .ao_speed = 1200,
948                         .num_p0_dio_channels = 32,
949                         .caldac = {caldac_none},
950                         .has_8255 = 0,
951                 },
952         {
953                         .device_id = 0x70aa,
954                         .name = "pci-6229",
955                         .n_adchan = 32,
956                         .adbits = 16,
957                         .ai_fifo_depth = 4095,
958                         .gainlkup = ai_gain_622x,
959                         .ai_speed = 4000,
960                         .n_aochan = 4,
961                         .aobits = 16,
962                         .ao_fifo_depth = 8191,
963                         .ao_range_table = &range_ni_M_622x_ao,
964                         .reg_type = ni_reg_622x,
965                         .ao_unipolar = 0,
966                         .ao_speed = 1200,
967                         .num_p0_dio_channels = 32,
968                         .caldac = {caldac_none},
969                         .has_8255 = 0,
970                 },
971         {
972                         .device_id = 0x70b4,
973                         .name = "pci-6250",
974                         .n_adchan = 16,
975                         .adbits = 16,
976                         .ai_fifo_depth = 4095,
977                         .gainlkup = ai_gain_628x,
978                         .ai_speed = 800,
979                         .n_aochan = 0,
980                         .aobits = 0,
981                         .ao_fifo_depth = 0,
982                         .reg_type = ni_reg_625x,
983                         .ao_unipolar = 0,
984                         .num_p0_dio_channels = 8,
985                         .caldac = {caldac_none},
986                         .has_8255 = 0,
987                 },
988         {
989                         .device_id = 0x70b8,
990                         .name = "pci-6251",
991                         .n_adchan = 16,
992                         .adbits = 16,
993                         .ai_fifo_depth = 4095,
994                         .gainlkup = ai_gain_628x,
995                         .ai_speed = 800,
996                         .n_aochan = 2,
997                         .aobits = 16,
998                         .ao_fifo_depth = 8191,
999                         .ao_range_table = &range_ni_M_625x_ao,
1000                         .reg_type = ni_reg_625x,
1001                         .ao_unipolar = 0,
1002                         .ao_speed = 357,
1003                         .num_p0_dio_channels = 8,
1004                         .caldac = {caldac_none},
1005                         .has_8255 = 0,
1006                 },
1007         {
1008                         .device_id = 0x717d,
1009                         .name = "pcie-6251",
1010                         .n_adchan = 16,
1011                         .adbits = 16,
1012                         .ai_fifo_depth = 4095,
1013                         .gainlkup = ai_gain_628x,
1014                         .ai_speed = 800,
1015                         .n_aochan = 2,
1016                         .aobits = 16,
1017                         .ao_fifo_depth = 8191,
1018                         .ao_range_table = &range_ni_M_625x_ao,
1019                         .reg_type = ni_reg_625x,
1020                         .ao_unipolar = 0,
1021                         .ao_speed = 357,
1022                         .num_p0_dio_channels = 8,
1023                         .caldac = {caldac_none},
1024                         .has_8255 = 0,
1025                 },
1026         {
1027                         .device_id = 0x70b7,
1028                         .name = "pci-6254",
1029                         .n_adchan = 32,
1030                         .adbits = 16,
1031                         .ai_fifo_depth = 4095,
1032                         .gainlkup = ai_gain_628x,
1033                         .ai_speed = 800,
1034                         .n_aochan = 0,
1035                         .aobits = 0,
1036                         .ao_fifo_depth = 0,
1037                         .reg_type = ni_reg_625x,
1038                         .ao_unipolar = 0,
1039                         .num_p0_dio_channels = 32,
1040                         .caldac = {caldac_none},
1041                         .has_8255 = 0,
1042                 },
1043         {
1044                         .device_id = 0x70ab,
1045                         .name = "pci-6259",
1046                         .n_adchan = 32,
1047                         .adbits = 16,
1048                         .ai_fifo_depth = 4095,
1049                         .gainlkup = ai_gain_628x,
1050                         .ai_speed = 800,
1051                         .n_aochan = 4,
1052                         .aobits = 16,
1053                         .ao_fifo_depth = 8191,
1054                         .ao_range_table = &range_ni_M_625x_ao,
1055                         .reg_type = ni_reg_625x,
1056                         .ao_unipolar = 0,
1057                         .ao_speed = 357,
1058                         .num_p0_dio_channels = 32,
1059                         .caldac = {caldac_none},
1060                         .has_8255 = 0,
1061                 },
1062         {
1063                         .device_id = 0x717f,
1064                         .name = "pcie-6259",
1065                         .n_adchan = 32,
1066                         .adbits = 16,
1067                         .ai_fifo_depth = 4095,
1068                         .gainlkup = ai_gain_628x,
1069                         .ai_speed = 800,
1070                         .n_aochan = 4,
1071                         .aobits = 16,
1072                         .ao_fifo_depth = 8191,
1073                         .ao_range_table = &range_ni_M_625x_ao,
1074                         .reg_type = ni_reg_625x,
1075                         .ao_unipolar = 0,
1076                         .ao_speed = 357,
1077                         .num_p0_dio_channels = 32,
1078                         .caldac = {caldac_none},
1079                         .has_8255 = 0,
1080                 },
1081         {
1082                         .device_id = 0x70b6,
1083                         .name = "pci-6280",
1084                         .n_adchan = 16,
1085                         .adbits = 18,
1086                         .ai_fifo_depth = 2047,
1087                         .gainlkup = ai_gain_628x,
1088                         .ai_speed = 1600,
1089                         .n_aochan = 0,
1090                         .aobits = 0,
1091                         .ao_fifo_depth = 8191,
1092                         .reg_type = ni_reg_628x,
1093                         .ao_unipolar = 0,
1094                         .num_p0_dio_channels = 8,
1095                         .caldac = {caldac_none},
1096                         .has_8255 = 0,
1097                 },
1098         {
1099                         .device_id = 0x70bd,
1100                         .name = "pci-6281",
1101                         .n_adchan = 16,
1102                         .adbits = 18,
1103                         .ai_fifo_depth = 2047,
1104                         .gainlkup = ai_gain_628x,
1105                         .ai_speed = 1600,
1106                         .n_aochan = 2,
1107                         .aobits = 16,
1108                         .ao_fifo_depth = 8191,
1109                         .ao_range_table = &range_ni_M_628x_ao,
1110                         .reg_type = ni_reg_628x,
1111                         .ao_unipolar = 1,
1112                         .ao_speed = 357,
1113                         .num_p0_dio_channels = 8,
1114                         .caldac = {caldac_none},
1115                         .has_8255 = 0,
1116                 },
1117         {
1118                         .device_id = 0x70bf,
1119                         .name = "pxi-6281",
1120                         .n_adchan = 16,
1121                         .adbits = 18,
1122                         .ai_fifo_depth = 2047,
1123                         .gainlkup = ai_gain_628x,
1124                         .ai_speed = 1600,
1125                         .n_aochan = 2,
1126                         .aobits = 16,
1127                         .ao_fifo_depth = 8191,
1128                         .ao_range_table = &range_ni_M_628x_ao,
1129                         .reg_type = ni_reg_628x,
1130                         .ao_unipolar = 1,
1131                         .ao_speed = 357,
1132                         .num_p0_dio_channels = 8,
1133                         .caldac = {caldac_none},
1134                         .has_8255 = 0,
1135                 },
1136         {
1137                         .device_id = 0x70bc,
1138                         .name = "pci-6284",
1139                         .n_adchan = 32,
1140                         .adbits = 18,
1141                         .ai_fifo_depth = 2047,
1142                         .gainlkup = ai_gain_628x,
1143                         .ai_speed = 1600,
1144                         .n_aochan = 0,
1145                         .aobits = 0,
1146                         .ao_fifo_depth = 0,
1147                         .reg_type = ni_reg_628x,
1148                         .ao_unipolar = 0,
1149                         .num_p0_dio_channels = 32,
1150                         .caldac = {caldac_none},
1151                         .has_8255 = 0,
1152                 },
1153         {
1154                         .device_id = 0x70ac,
1155                         .name = "pci-6289",
1156                         .n_adchan = 32,
1157                         .adbits = 18,
1158                         .ai_fifo_depth = 2047,
1159                         .gainlkup = ai_gain_628x,
1160                         .ai_speed = 1600,
1161                         .n_aochan = 4,
1162                         .aobits = 16,
1163                         .ao_fifo_depth = 8191,
1164                         .ao_range_table = &range_ni_M_628x_ao,
1165                         .reg_type = ni_reg_628x,
1166                         .ao_unipolar = 1,
1167                         .ao_speed = 357,
1168                         .num_p0_dio_channels = 32,
1169                         .caldac = {caldac_none},
1170                         .has_8255 = 0,
1171                 },
1172         {
1173                         .device_id = 0x70C0,
1174                         .name = "pci-6143",
1175                         .n_adchan = 8,
1176                         .adbits = 16,
1177                         .ai_fifo_depth = 1024,
1178                         .alwaysdither = 0,
1179                         .gainlkup = ai_gain_6143,
1180                         .ai_speed = 4000,
1181                         .n_aochan = 0,
1182                         .aobits = 0,
1183                         .reg_type = ni_reg_6143,
1184                         .ao_unipolar = 0,
1185                         .ao_fifo_depth = 0,
1186                         .num_p0_dio_channels = 8,
1187                         .caldac = {ad8804_debug, ad8804_debug},
1188                 },
1189         {
1190                         .device_id = 0x710D,
1191                         .name = "pxi-6143",
1192                         .n_adchan = 8,
1193                         .adbits = 16,
1194                         .ai_fifo_depth = 1024,
1195                         .alwaysdither = 0,
1196                         .gainlkup = ai_gain_6143,
1197                         .ai_speed = 4000,
1198                         .n_aochan = 0,
1199                         .aobits = 0,
1200                         .reg_type = ni_reg_6143,
1201                         .ao_unipolar = 0,
1202                         .ao_fifo_depth = 0,
1203                         .num_p0_dio_channels = 8,
1204                         .caldac = {ad8804_debug, ad8804_debug},
1205                 },
1206 };
1207
1208 #define n_pcimio_boards ((sizeof(ni_boards)/sizeof(ni_boards[0])))
1209
1210 static int pcimio_attach(struct comedi_device * dev, struct comedi_devconfig * it);
1211 static int pcimio_detach(struct comedi_device * dev);
1212 static struct comedi_driver driver_pcimio = {
1213         driver_name: DRV_NAME,
1214         module:THIS_MODULE,
1215         attach:pcimio_attach,
1216         detach:pcimio_detach,
1217 };
1218
1219 COMEDI_PCI_INITCLEANUP(driver_pcimio, ni_pci_table)
1220
1221 typedef struct {
1222 NI_PRIVATE_COMMON} ni_private;
1223 #define devpriv ((ni_private *)dev->private)
1224
1225 /* How we access registers */
1226
1227 #define ni_writel(a,b)  (writel((a), devpriv->mite->daq_io_addr + (b)))
1228 #define ni_readl(a)     (readl(devpriv->mite->daq_io_addr + (a)))
1229 #define ni_writew(a,b)  (writew((a), devpriv->mite->daq_io_addr + (b)))
1230 #define ni_readw(a)     (readw(devpriv->mite->daq_io_addr + (a)))
1231 #define ni_writeb(a,b)  (writeb((a), devpriv->mite->daq_io_addr + (b)))
1232 #define ni_readb(a)     (readb(devpriv->mite->daq_io_addr + (a)))
1233
1234 /* How we access STC registers */
1235
1236 /* We automatically take advantage of STC registers that can be
1237  * read/written directly in the I/O space of the board.  Most
1238  * PCIMIO devices map the low 8 STC registers to iobase+addr*2.
1239  * The 611x devices map the write registers to iobase+addr*2, and
1240  * the read registers to iobase+(addr-1)*2. */
1241 /* However, the 611x boards still aren't working, so I'm disabling
1242  * non-windowed STC access temporarily */
1243
1244 static void e_series_win_out(struct comedi_device * dev, uint16_t data, int reg)
1245 {
1246         unsigned long flags;
1247
1248         comedi_spin_lock_irqsave(&devpriv->window_lock, flags);
1249         ni_writew(reg, Window_Address);
1250         ni_writew(data, Window_Data);
1251         comedi_spin_unlock_irqrestore(&devpriv->window_lock, flags);
1252 }
1253
1254 static uint16_t e_series_win_in(struct comedi_device * dev, int reg)
1255 {
1256         unsigned long flags;
1257         uint16_t ret;
1258
1259         comedi_spin_lock_irqsave(&devpriv->window_lock, flags);
1260         ni_writew(reg, Window_Address);
1261         ret = ni_readw(Window_Data);
1262         comedi_spin_unlock_irqrestore(&devpriv->window_lock, flags);
1263
1264         return ret;
1265 }
1266
1267 static void m_series_stc_writew(struct comedi_device * dev, uint16_t data, int reg)
1268 {
1269         unsigned offset;
1270         switch (reg) {
1271         case ADC_FIFO_Clear:
1272                 offset = M_Offset_AI_FIFO_Clear;
1273                 break;
1274         case AI_Command_1_Register:
1275                 offset = M_Offset_AI_Command_1;
1276                 break;
1277         case AI_Command_2_Register:
1278                 offset = M_Offset_AI_Command_2;
1279                 break;
1280         case AI_Mode_1_Register:
1281                 offset = M_Offset_AI_Mode_1;
1282                 break;
1283         case AI_Mode_2_Register:
1284                 offset = M_Offset_AI_Mode_2;
1285                 break;
1286         case AI_Mode_3_Register:
1287                 offset = M_Offset_AI_Mode_3;
1288                 break;
1289         case AI_Output_Control_Register:
1290                 offset = M_Offset_AI_Output_Control;
1291                 break;
1292         case AI_Personal_Register:
1293                 offset = M_Offset_AI_Personal;
1294                 break;
1295         case AI_SI2_Load_A_Register:
1296                 // this is actually a 32 bit register on m series boards
1297                 ni_writel(data, M_Offset_AI_SI2_Load_A);
1298                 return;
1299                 break;
1300         case AI_SI2_Load_B_Register:
1301                 // this is actually a 32 bit register on m series boards
1302                 ni_writel(data, M_Offset_AI_SI2_Load_B);
1303                 return;
1304                 break;
1305         case AI_START_STOP_Select_Register:
1306                 offset = M_Offset_AI_START_STOP_Select;
1307                 break;
1308         case AI_Trigger_Select_Register:
1309                 offset = M_Offset_AI_Trigger_Select;
1310                 break;
1311         case Analog_Trigger_Etc_Register:
1312                 offset = M_Offset_Analog_Trigger_Etc;
1313                 break;
1314         case AO_Command_1_Register:
1315                 offset = M_Offset_AO_Command_1;
1316                 break;
1317         case AO_Command_2_Register:
1318                 offset = M_Offset_AO_Command_2;
1319                 break;
1320         case AO_Mode_1_Register:
1321                 offset = M_Offset_AO_Mode_1;
1322                 break;
1323         case AO_Mode_2_Register:
1324                 offset = M_Offset_AO_Mode_2;
1325                 break;
1326         case AO_Mode_3_Register:
1327                 offset = M_Offset_AO_Mode_3;
1328                 break;
1329         case AO_Output_Control_Register:
1330                 offset = M_Offset_AO_Output_Control;
1331                 break;
1332         case AO_Personal_Register:
1333                 offset = M_Offset_AO_Personal;
1334                 break;
1335         case AO_Start_Select_Register:
1336                 offset = M_Offset_AO_Start_Select;
1337                 break;
1338         case AO_Trigger_Select_Register:
1339                 offset = M_Offset_AO_Trigger_Select;
1340                 break;
1341         case Clock_and_FOUT_Register:
1342                 offset = M_Offset_Clock_and_FOUT;
1343                 break;
1344         case Configuration_Memory_Clear:
1345                 offset = M_Offset_Configuration_Memory_Clear;
1346                 break;
1347         case DAC_FIFO_Clear:
1348                 offset = M_Offset_AO_FIFO_Clear;
1349                 break;
1350         case DIO_Control_Register:
1351                 rt_printk
1352                         ("%s: FIXME: register 0x%x does not map cleanly on to m-series boards.\n",
1353                         __FUNCTION__, reg);
1354                 return;
1355                 break;
1356         case G_Autoincrement_Register(0):
1357                 offset = M_Offset_G0_Autoincrement;
1358                 break;
1359         case G_Autoincrement_Register(1):
1360                 offset = M_Offset_G1_Autoincrement;
1361                 break;
1362         case G_Command_Register(0):
1363                 offset = M_Offset_G0_Command;
1364                 break;
1365         case G_Command_Register(1):
1366                 offset = M_Offset_G1_Command;
1367                 break;
1368         case G_Input_Select_Register(0):
1369                 offset = M_Offset_G0_Input_Select;
1370                 break;
1371         case G_Input_Select_Register(1):
1372                 offset = M_Offset_G1_Input_Select;
1373                 break;
1374         case G_Mode_Register(0):
1375                 offset = M_Offset_G0_Mode;
1376                 break;
1377         case G_Mode_Register(1):
1378                 offset = M_Offset_G1_Mode;
1379                 break;
1380         case Interrupt_A_Ack_Register:
1381                 offset = M_Offset_Interrupt_A_Ack;
1382                 break;
1383         case Interrupt_A_Enable_Register:
1384                 offset = M_Offset_Interrupt_A_Enable;
1385                 break;
1386         case Interrupt_B_Ack_Register:
1387                 offset = M_Offset_Interrupt_B_Ack;
1388                 break;
1389         case Interrupt_B_Enable_Register:
1390                 offset = M_Offset_Interrupt_B_Enable;
1391                 break;
1392         case Interrupt_Control_Register:
1393                 offset = M_Offset_Interrupt_Control;
1394                 break;
1395         case IO_Bidirection_Pin_Register:
1396                 offset = M_Offset_IO_Bidirection_Pin;
1397                 break;
1398         case Joint_Reset_Register:
1399                 offset = M_Offset_Joint_Reset;
1400                 break;
1401         case RTSI_Trig_A_Output_Register:
1402                 offset = M_Offset_RTSI_Trig_A_Output;
1403                 break;
1404         case RTSI_Trig_B_Output_Register:
1405                 offset = M_Offset_RTSI_Trig_B_Output;
1406                 break;
1407         case RTSI_Trig_Direction_Register:
1408                 offset = M_Offset_RTSI_Trig_Direction;
1409                 break;
1410                 /* FIXME: DIO_Output_Register (16 bit reg) is replaced by M_Offset_Static_Digital_Output (32 bit)
1411                    and M_Offset_SCXI_Serial_Data_Out (8 bit) */
1412         default:
1413                 rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1414                         __FUNCTION__, reg);
1415                 BUG();
1416                 return;
1417                 break;
1418         }
1419         ni_writew(data, offset);
1420 }
1421
1422 static uint16_t m_series_stc_readw(struct comedi_device * dev, int reg)
1423 {
1424         unsigned offset;
1425         switch (reg) {
1426         case AI_Status_1_Register:
1427                 offset = M_Offset_AI_Status_1;
1428                 break;
1429         case AO_Status_1_Register:
1430                 offset = M_Offset_AO_Status_1;
1431                 break;
1432         case AO_Status_2_Register:
1433                 offset = M_Offset_AO_Status_2;
1434                 break;
1435         case DIO_Serial_Input_Register:
1436                 return ni_readb(M_Offset_SCXI_Serial_Data_In);
1437                 break;
1438         case Joint_Status_1_Register:
1439                 offset = M_Offset_Joint_Status_1;
1440                 break;
1441         case Joint_Status_2_Register:
1442                 offset = M_Offset_Joint_Status_2;
1443                 break;
1444         case G_Status_Register:
1445                 offset = M_Offset_G01_Status;
1446                 break;
1447         default:
1448                 rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1449                         __FUNCTION__, reg);
1450                 BUG();
1451                 return 0;
1452                 break;
1453         }
1454         return ni_readw(offset);
1455 }
1456
1457 static void m_series_stc_writel(struct comedi_device * dev, uint32_t data, int reg)
1458 {
1459         unsigned offset;
1460         switch (reg) {
1461         case AI_SC_Load_A_Registers:
1462                 offset = M_Offset_AI_SC_Load_A;
1463                 break;
1464         case AI_SI_Load_A_Registers:
1465                 offset = M_Offset_AI_SI_Load_A;
1466                 break;
1467         case AO_BC_Load_A_Register:
1468                 offset = M_Offset_AO_BC_Load_A;
1469                 break;
1470         case AO_UC_Load_A_Register:
1471                 offset = M_Offset_AO_UC_Load_A;
1472                 break;
1473         case AO_UI_Load_A_Register:
1474                 offset = M_Offset_AO_UI_Load_A;
1475                 break;
1476         case G_Load_A_Register(0):
1477                 offset = M_Offset_G0_Load_A;
1478                 break;
1479         case G_Load_A_Register(1):
1480                 offset = M_Offset_G1_Load_A;
1481                 break;
1482         case G_Load_B_Register(0):
1483                 offset = M_Offset_G0_Load_B;
1484                 break;
1485         case G_Load_B_Register(1):
1486                 offset = M_Offset_G1_Load_B;
1487                 break;
1488         default:
1489                 rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1490                         __FUNCTION__, reg);
1491                 BUG();
1492                 return;
1493                 break;
1494         }
1495         ni_writel(data, offset);
1496 }
1497
1498 static uint32_t m_series_stc_readl(struct comedi_device * dev, int reg)
1499 {
1500         unsigned offset;
1501         switch (reg) {
1502         case G_HW_Save_Register(0):
1503                 offset = M_Offset_G0_HW_Save;
1504                 break;
1505         case G_HW_Save_Register(1):
1506                 offset = M_Offset_G1_HW_Save;
1507                 break;
1508         case G_Save_Register(0):
1509                 offset = M_Offset_G0_Save;
1510                 break;
1511         case G_Save_Register(1):
1512                 offset = M_Offset_G1_Save;
1513                 break;
1514         default:
1515                 rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1516                         __FUNCTION__, reg);
1517                 BUG();
1518                 return 0;
1519                 break;
1520         }
1521         return ni_readl(offset);
1522 }
1523
1524 #define interrupt_pin(a)        0
1525 #define IRQ_POLARITY 1
1526
1527 #define NI_E_IRQ_FLAGS          IRQF_SHARED
1528
1529 #include "ni_mio_common.c"
1530
1531 static int pcimio_find_device(struct comedi_device * dev, int bus, int slot);
1532 static int pcimio_ai_change(struct comedi_device * dev, struct comedi_subdevice * s,
1533         unsigned long new_size);
1534 static int pcimio_ao_change(struct comedi_device * dev, struct comedi_subdevice * s,
1535         unsigned long new_size);
1536 static int pcimio_gpct0_change(struct comedi_device * dev, struct comedi_subdevice * s,
1537         unsigned long new_size);
1538 static int pcimio_gpct1_change(struct comedi_device * dev, struct comedi_subdevice * s,
1539         unsigned long new_size);
1540 static int pcimio_dio_change(struct comedi_device * dev, struct comedi_subdevice * s,
1541         unsigned long new_size);
1542
1543 static void m_series_init_eeprom_buffer(struct comedi_device * dev)
1544 {
1545         static const int Start_Cal_EEPROM = 0x400;
1546         static const unsigned window_size = 10;
1547         static const int serial_number_eeprom_offset = 0x4;
1548         static const int serial_number_eeprom_length = 0x4;
1549         unsigned old_iodwbsr_bits;
1550         unsigned old_iodwbsr1_bits;
1551         unsigned old_iodwcr1_bits;
1552         int i;
1553
1554         old_iodwbsr_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWBSR);
1555         old_iodwbsr1_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1556         old_iodwcr1_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1557         writel(0x0, devpriv->mite->mite_io_addr + MITE_IODWBSR);
1558         writel(((0x80 | window_size) | devpriv->mite->daq_phys_addr),
1559                 devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1560         writel(0x1 | old_iodwcr1_bits, devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1561         writel(0xf, devpriv->mite->mite_io_addr + 0x30);
1562
1563         BUG_ON(serial_number_eeprom_length > sizeof(devpriv->serial_number));
1564         for (i = 0; i < serial_number_eeprom_length; ++i) {
1565                 char *byte_ptr = (char*)&devpriv->serial_number + i;
1566                 *byte_ptr = ni_readb(serial_number_eeprom_offset + i);
1567         }
1568         devpriv->serial_number = be32_to_cpu(devpriv->serial_number);
1569
1570         for (i = 0; i < M_SERIES_EEPROM_SIZE; ++i) {
1571                 devpriv->eeprom_buffer[i] = ni_readb(Start_Cal_EEPROM + i);
1572         }
1573
1574         writel(old_iodwbsr1_bits, devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1575         writel(old_iodwbsr_bits, devpriv->mite->mite_io_addr + MITE_IODWBSR);
1576         writel(old_iodwcr1_bits, devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1577         writel(0x0, devpriv->mite->mite_io_addr + 0x30);
1578 }
1579
1580 static void init_6143(struct comedi_device * dev)
1581 {
1582         // Disable interrupts
1583         devpriv->stc_writew(dev, 0, Interrupt_Control_Register);
1584
1585         // Initialise 6143 AI specific bits
1586         ni_writeb(0x00, Magic_6143);    // Set G0,G1 DMA mode to E series version
1587         ni_writeb(0x80, PipelineDelay_6143);    // Set EOCMode, ADCMode and pipelinedelay
1588         ni_writeb(0x00, EOC_Set_6143);  // Set EOC Delay
1589
1590         ni_writel(boardtype.ai_fifo_depth / 2, AIFIFO_Flag_6143);       // Set the FIFO half full level
1591
1592         // Strobe Relay disable bit
1593         devpriv->ai_calib_source_enabled = 0;
1594         ni_writew(devpriv->ai_calib_source | Calibration_Channel_6143_RelayOff,
1595                 Calibration_Channel_6143);
1596         ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143);
1597 }
1598
1599 /* cleans up allocated resources */
1600 static int pcimio_detach(struct comedi_device * dev)
1601 {
1602         mio_common_detach(dev);
1603         if (dev->irq) {
1604                 comedi_free_irq(dev->irq, dev);
1605         }
1606         if (dev->private) {
1607                 mite_free_ring(devpriv->ai_mite_ring);
1608                 mite_free_ring(devpriv->ao_mite_ring);
1609                 mite_free_ring(devpriv->cdo_mite_ring);
1610                 mite_free_ring(devpriv->gpct_mite_ring[0]);
1611                 mite_free_ring(devpriv->gpct_mite_ring[1]);
1612                 if (devpriv->mite)
1613                         mite_unsetup(devpriv->mite);
1614         }
1615
1616         return 0;
1617 }
1618
1619 static int pcimio_attach(struct comedi_device * dev, struct comedi_devconfig * it)
1620 {
1621         int ret;
1622
1623         printk("comedi%d: ni_pcimio:", dev->minor);
1624
1625         ret = ni_alloc_private(dev);
1626         if (ret < 0)
1627                 return ret;
1628
1629         ret = pcimio_find_device(dev, it->options[0], it->options[1]);
1630         if (ret < 0)
1631                 return ret;
1632
1633         printk(" %s", boardtype.name);
1634         dev->board_name = boardtype.name;
1635
1636         if (boardtype.reg_type & ni_reg_m_series_mask) {
1637                 devpriv->stc_writew = &m_series_stc_writew;
1638                 devpriv->stc_readw = &m_series_stc_readw;
1639                 devpriv->stc_writel = &m_series_stc_writel;
1640                 devpriv->stc_readl = &m_series_stc_readl;
1641         } else {
1642                 devpriv->stc_writew = &e_series_win_out;
1643                 devpriv->stc_readw = &e_series_win_in;
1644                 devpriv->stc_writel = &win_out2;
1645                 devpriv->stc_readl = &win_in2;
1646         }
1647
1648         ret = mite_setup(devpriv->mite);
1649         if (ret < 0) {
1650                 printk(" error setting up mite\n");
1651                 return ret;
1652         }
1653         comedi_set_hw_dev(dev, &devpriv->mite->pcidev->dev);
1654         devpriv->ai_mite_ring = mite_alloc_ring(devpriv->mite);
1655         if (devpriv->ai_mite_ring == NULL)
1656                 return -ENOMEM;
1657         devpriv->ao_mite_ring = mite_alloc_ring(devpriv->mite);
1658         if (devpriv->ao_mite_ring == NULL)
1659                 return -ENOMEM;
1660         devpriv->cdo_mite_ring = mite_alloc_ring(devpriv->mite);
1661         if (devpriv->cdo_mite_ring == NULL)
1662                 return -ENOMEM;
1663         devpriv->gpct_mite_ring[0] = mite_alloc_ring(devpriv->mite);
1664         if (devpriv->gpct_mite_ring[0] == NULL)
1665                 return -ENOMEM;
1666         devpriv->gpct_mite_ring[1] = mite_alloc_ring(devpriv->mite);
1667         if (devpriv->gpct_mite_ring[1] == NULL)
1668                 return -ENOMEM;
1669
1670         if (boardtype.reg_type & ni_reg_m_series_mask)
1671                 m_series_init_eeprom_buffer(dev);
1672         if (boardtype.reg_type == ni_reg_6143)
1673                 init_6143(dev);
1674
1675         dev->irq = mite_irq(devpriv->mite);
1676
1677         if (dev->irq == 0) {
1678                 printk(" unknown irq (bad)\n");
1679         } else {
1680                 printk(" ( irq = %u )", dev->irq);
1681                 if ((ret = comedi_request_irq(dev->irq, ni_E_interrupt,
1682                                         NI_E_IRQ_FLAGS, DRV_NAME,
1683                                         dev)) < 0) {
1684                         printk(" irq not available\n");
1685                         dev->irq = 0;
1686                 }
1687         }
1688
1689         ret = ni_E_init(dev, it);
1690         if (ret < 0)
1691                 return ret;
1692
1693         dev->subdevices[NI_AI_SUBDEV].buf_change = &pcimio_ai_change;
1694         dev->subdevices[NI_AO_SUBDEV].buf_change = &pcimio_ao_change;
1695         dev->subdevices[NI_GPCT_SUBDEV(0)].buf_change = &pcimio_gpct0_change;
1696         dev->subdevices[NI_GPCT_SUBDEV(1)].buf_change = &pcimio_gpct1_change;
1697         dev->subdevices[NI_DIO_SUBDEV].buf_change = &pcimio_dio_change;
1698
1699         return ret;
1700 }
1701
1702 static int pcimio_find_device(struct comedi_device * dev, int bus, int slot)
1703 {
1704         struct mite_struct *mite;
1705         int i;
1706
1707         for (mite = mite_devices; mite; mite = mite->next) {
1708                 if (mite->used)
1709                         continue;
1710                 if (bus || slot) {
1711                         if (bus != mite->pcidev->bus->number ||
1712                                 slot != PCI_SLOT(mite->pcidev->devfn))
1713                                 continue;
1714                 }
1715
1716                 for (i = 0; i < n_pcimio_boards; i++) {
1717                         if (mite_device_id(mite) == ni_boards[i].device_id) {
1718                                 dev->board_ptr = ni_boards + i;
1719                                 devpriv->mite = mite;
1720
1721                                 return 0;
1722                         }
1723                 }
1724         }
1725         printk("no device found\n");
1726         mite_list_devices();
1727         return -EIO;
1728 }
1729
1730 static int pcimio_ai_change(struct comedi_device * dev, struct comedi_subdevice * s,
1731         unsigned long new_size)
1732 {
1733         int ret;
1734
1735         ret = mite_buf_change(devpriv->ai_mite_ring, s->async);
1736         if (ret < 0)
1737                 return ret;
1738
1739         return 0;
1740 }
1741
1742 static int pcimio_ao_change(struct comedi_device * dev, struct comedi_subdevice * s,
1743         unsigned long new_size)
1744 {
1745         int ret;
1746
1747         ret = mite_buf_change(devpriv->ao_mite_ring, s->async);
1748         if (ret < 0)
1749                 return ret;
1750
1751         return 0;
1752 }
1753
1754 static int pcimio_gpct0_change(struct comedi_device * dev, struct comedi_subdevice * s,
1755         unsigned long new_size)
1756 {
1757         int ret;
1758
1759         ret = mite_buf_change(devpriv->gpct_mite_ring[0], s->async);
1760         if (ret < 0)
1761                 return ret;
1762
1763         return 0;
1764 }
1765
1766 static int pcimio_gpct1_change(struct comedi_device * dev, struct comedi_subdevice * s,
1767         unsigned long new_size)
1768 {
1769         int ret;
1770
1771         ret = mite_buf_change(devpriv->gpct_mite_ring[1], s->async);
1772         if (ret < 0)
1773                 return ret;
1774
1775         return 0;
1776 }
1777
1778 static int pcimio_dio_change(struct comedi_device * dev, struct comedi_subdevice * s,
1779         unsigned long new_size)
1780 {
1781         int ret;
1782
1783         ret = mite_buf_change(devpriv->cdo_mite_ring, s->async);
1784         if (ret < 0)
1785                 return ret;
1786
1787         return 0;
1788 }