Staging: comedi: Added reading of board serial number from eeprom for m-series boards
[linux-2.6] / 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, PCI-6225, PCI-6229,
33   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 Nov 29 10:30:36 EST 2006
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 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 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 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 = 0x716c,
918                         .name = "pci-6225",
919                         .n_adchan = 80,
920                         .adbits = 16,
921                         .ai_fifo_depth = 4095,
922                         .gainlkup = ai_gain_622x,
923                         .ai_speed = 4000,
924                         .n_aochan = 2,
925                         .aobits = 16,
926                         .ao_fifo_depth = 8191,
927                         .ao_range_table = &range_ni_M_622x_ao,
928                         .reg_type = ni_reg_622x,
929                         .ao_unipolar = 0,
930                         .ao_speed = 1200,
931                         .num_p0_dio_channels = 32,
932                         .caldac = {caldac_none},
933                         .has_8255 = 0,
934                 },
935         {
936                         .device_id = 0x70aa,
937                         .name = "pci-6229",
938                         .n_adchan = 32,
939                         .adbits = 16,
940                         .ai_fifo_depth = 4095,
941                         .gainlkup = ai_gain_622x,
942                         .ai_speed = 4000,
943                         .n_aochan = 4,
944                         .aobits = 16,
945                         .ao_fifo_depth = 8191,
946                         .ao_range_table = &range_ni_M_622x_ao,
947                         .reg_type = ni_reg_622x,
948                         .ao_unipolar = 0,
949                         .ao_speed = 1200,
950                         .num_p0_dio_channels = 32,
951                         .caldac = {caldac_none},
952                         .has_8255 = 0,
953                 },
954         {
955                         .device_id = 0x70b4,
956                         .name = "pci-6250",
957                         .n_adchan = 16,
958                         .adbits = 16,
959                         .ai_fifo_depth = 4095,
960                         .gainlkup = ai_gain_628x,
961                         .ai_speed = 800,
962                         .n_aochan = 0,
963                         .aobits = 0,
964                         .ao_fifo_depth = 0,
965                         .reg_type = ni_reg_625x,
966                         .ao_unipolar = 0,
967                         .num_p0_dio_channels = 8,
968                         .caldac = {caldac_none},
969                         .has_8255 = 0,
970                 },
971         {
972                         .device_id = 0x70b8,
973                         .name = "pci-6251",
974                         .n_adchan = 16,
975                         .adbits = 16,
976                         .ai_fifo_depth = 4095,
977                         .gainlkup = ai_gain_628x,
978                         .ai_speed = 800,
979                         .n_aochan = 2,
980                         .aobits = 16,
981                         .ao_fifo_depth = 8191,
982                         .ao_range_table = &range_ni_M_625x_ao,
983                         .reg_type = ni_reg_625x,
984                         .ao_unipolar = 0,
985                         .ao_speed = 357,
986                         .num_p0_dio_channels = 8,
987                         .caldac = {caldac_none},
988                         .has_8255 = 0,
989                 },
990         {
991                         .device_id = 0x717d,
992                         .name = "pcie-6251",
993                         .n_adchan = 16,
994                         .adbits = 16,
995                         .ai_fifo_depth = 4095,
996                         .gainlkup = ai_gain_628x,
997                         .ai_speed = 800,
998                         .n_aochan = 2,
999                         .aobits = 16,
1000                         .ao_fifo_depth = 8191,
1001                         .ao_range_table = &range_ni_M_625x_ao,
1002                         .reg_type = ni_reg_625x,
1003                         .ao_unipolar = 0,
1004                         .ao_speed = 357,
1005                         .num_p0_dio_channels = 8,
1006                         .caldac = {caldac_none},
1007                         .has_8255 = 0,
1008                 },
1009         {
1010                         .device_id = 0x70b7,
1011                         .name = "pci-6254",
1012                         .n_adchan = 32,
1013                         .adbits = 16,
1014                         .ai_fifo_depth = 4095,
1015                         .gainlkup = ai_gain_628x,
1016                         .ai_speed = 800,
1017                         .n_aochan = 0,
1018                         .aobits = 0,
1019                         .ao_fifo_depth = 0,
1020                         .reg_type = ni_reg_625x,
1021                         .ao_unipolar = 0,
1022                         .num_p0_dio_channels = 32,
1023                         .caldac = {caldac_none},
1024                         .has_8255 = 0,
1025                 },
1026         {
1027                         .device_id = 0x70ab,
1028                         .name = "pci-6259",
1029                         .n_adchan = 32,
1030                         .adbits = 16,
1031                         .ai_fifo_depth = 4095,
1032                         .gainlkup = ai_gain_628x,
1033                         .ai_speed = 800,
1034                         .n_aochan = 4,
1035                         .aobits = 16,
1036                         .ao_fifo_depth = 8191,
1037                         .ao_range_table = &range_ni_M_625x_ao,
1038                         .reg_type = ni_reg_625x,
1039                         .ao_unipolar = 0,
1040                         .ao_speed = 357,
1041                         .num_p0_dio_channels = 32,
1042                         .caldac = {caldac_none},
1043                         .has_8255 = 0,
1044                 },
1045         {
1046                         .device_id = 0x717f,
1047                         .name = "pcie-6259",
1048                         .n_adchan = 32,
1049                         .adbits = 16,
1050                         .ai_fifo_depth = 4095,
1051                         .gainlkup = ai_gain_628x,
1052                         .ai_speed = 800,
1053                         .n_aochan = 4,
1054                         .aobits = 16,
1055                         .ao_fifo_depth = 8191,
1056                         .ao_range_table = &range_ni_M_625x_ao,
1057                         .reg_type = ni_reg_625x,
1058                         .ao_unipolar = 0,
1059                         .ao_speed = 357,
1060                         .num_p0_dio_channels = 32,
1061                         .caldac = {caldac_none},
1062                         .has_8255 = 0,
1063                 },
1064         {
1065                         .device_id = 0x70b6,
1066                         .name = "pci-6280",
1067                         .n_adchan = 16,
1068                         .adbits = 18,
1069                         .ai_fifo_depth = 2047,
1070                         .gainlkup = ai_gain_628x,
1071                         .ai_speed = 1600,
1072                         .n_aochan = 0,
1073                         .aobits = 0,
1074                         .ao_fifo_depth = 8191,
1075                         .reg_type = ni_reg_628x,
1076                         .ao_unipolar = 0,
1077                         .num_p0_dio_channels = 8,
1078                         .caldac = {caldac_none},
1079                         .has_8255 = 0,
1080                 },
1081         {
1082                         .device_id = 0x70bd,
1083                         .name = "pci-6281",
1084                         .n_adchan = 16,
1085                         .adbits = 18,
1086                         .ai_fifo_depth = 2047,
1087                         .gainlkup = ai_gain_628x,
1088                         .ai_speed = 1600,
1089                         .n_aochan = 2,
1090                         .aobits = 16,
1091                         .ao_fifo_depth = 8191,
1092                         .ao_range_table = &range_ni_M_628x_ao,
1093                         .reg_type = ni_reg_628x,
1094                         .ao_unipolar = 1,
1095                         .ao_speed = 357,
1096                         .num_p0_dio_channels = 8,
1097                         .caldac = {caldac_none},
1098                         .has_8255 = 0,
1099                 },
1100         {
1101                         .device_id = 0x70bf,
1102                         .name = "pxi-6281",
1103                         .n_adchan = 16,
1104                         .adbits = 18,
1105                         .ai_fifo_depth = 2047,
1106                         .gainlkup = ai_gain_628x,
1107                         .ai_speed = 1600,
1108                         .n_aochan = 2,
1109                         .aobits = 16,
1110                         .ao_fifo_depth = 8191,
1111                         .ao_range_table = &range_ni_M_628x_ao,
1112                         .reg_type = ni_reg_628x,
1113                         .ao_unipolar = 1,
1114                         .ao_speed = 357,
1115                         .num_p0_dio_channels = 8,
1116                         .caldac = {caldac_none},
1117                         .has_8255 = 0,
1118                 },
1119         {
1120                         .device_id = 0x70bc,
1121                         .name = "pci-6284",
1122                         .n_adchan = 32,
1123                         .adbits = 18,
1124                         .ai_fifo_depth = 2047,
1125                         .gainlkup = ai_gain_628x,
1126                         .ai_speed = 1600,
1127                         .n_aochan = 0,
1128                         .aobits = 0,
1129                         .ao_fifo_depth = 0,
1130                         .reg_type = ni_reg_628x,
1131                         .ao_unipolar = 0,
1132                         .num_p0_dio_channels = 32,
1133                         .caldac = {caldac_none},
1134                         .has_8255 = 0,
1135                 },
1136         {
1137                         .device_id = 0x70ac,
1138                         .name = "pci-6289",
1139                         .n_adchan = 32,
1140                         .adbits = 18,
1141                         .ai_fifo_depth = 2047,
1142                         .gainlkup = ai_gain_628x,
1143                         .ai_speed = 1600,
1144                         .n_aochan = 4,
1145                         .aobits = 16,
1146                         .ao_fifo_depth = 8191,
1147                         .ao_range_table = &range_ni_M_628x_ao,
1148                         .reg_type = ni_reg_628x,
1149                         .ao_unipolar = 1,
1150                         .ao_speed = 357,
1151                         .num_p0_dio_channels = 32,
1152                         .caldac = {caldac_none},
1153                         .has_8255 = 0,
1154                 },
1155         {
1156                         .device_id = 0x70C0,
1157                         .name = "pci-6143",
1158                         .n_adchan = 8,
1159                         .adbits = 16,
1160                         .ai_fifo_depth = 1024,
1161                         .alwaysdither = 0,
1162                         .gainlkup = ai_gain_6143,
1163                         .ai_speed = 4000,
1164                         .n_aochan = 0,
1165                         .aobits = 0,
1166                         .reg_type = ni_reg_6143,
1167                         .ao_unipolar = 0,
1168                         .ao_fifo_depth = 0,
1169                         .num_p0_dio_channels = 8,
1170                         .caldac = {ad8804_debug, ad8804_debug},
1171                 },
1172         {
1173                         .device_id = 0x710D,
1174                         .name = "pxi-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
1191 #define n_pcimio_boards ((sizeof(ni_boards)/sizeof(ni_boards[0])))
1192
1193 static int pcimio_attach(comedi_device * dev, comedi_devconfig * it);
1194 static int pcimio_detach(comedi_device * dev);
1195 static comedi_driver driver_pcimio = {
1196         driver_name: DRV_NAME,
1197         module:THIS_MODULE,
1198         attach:pcimio_attach,
1199         detach:pcimio_detach,
1200 };
1201
1202 COMEDI_PCI_INITCLEANUP(driver_pcimio, ni_pci_table)
1203
1204 typedef struct {
1205 NI_PRIVATE_COMMON} ni_private;
1206 #define devpriv ((ni_private *)dev->private)
1207
1208 /* How we access registers */
1209
1210 #define ni_writel(a,b)  (writel((a), devpriv->mite->daq_io_addr + (b)))
1211 #define ni_readl(a)     (readl(devpriv->mite->daq_io_addr + (a)))
1212 #define ni_writew(a,b)  (writew((a), devpriv->mite->daq_io_addr + (b)))
1213 #define ni_readw(a)     (readw(devpriv->mite->daq_io_addr + (a)))
1214 #define ni_writeb(a,b)  (writeb((a), devpriv->mite->daq_io_addr + (b)))
1215 #define ni_readb(a)     (readb(devpriv->mite->daq_io_addr + (a)))
1216
1217 /* How we access STC registers */
1218
1219 /* We automatically take advantage of STC registers that can be
1220  * read/written directly in the I/O space of the board.  Most
1221  * PCIMIO devices map the low 8 STC registers to iobase+addr*2.
1222  * The 611x devices map the write registers to iobase+addr*2, and
1223  * the read registers to iobase+(addr-1)*2. */
1224 /* However, the 611x boards still aren't working, so I'm disabling
1225  * non-windowed STC access temporarily */
1226
1227 static void e_series_win_out(comedi_device * dev, uint16_t data, int reg)
1228 {
1229         unsigned long flags;
1230
1231         comedi_spin_lock_irqsave(&devpriv->window_lock, flags);
1232         ni_writew(reg, Window_Address);
1233         ni_writew(data, Window_Data);
1234         comedi_spin_unlock_irqrestore(&devpriv->window_lock, flags);
1235 }
1236
1237 static uint16_t e_series_win_in(comedi_device * dev, int reg)
1238 {
1239         unsigned long flags;
1240         uint16_t ret;
1241
1242         comedi_spin_lock_irqsave(&devpriv->window_lock, flags);
1243         ni_writew(reg, Window_Address);
1244         ret = ni_readw(Window_Data);
1245         comedi_spin_unlock_irqrestore(&devpriv->window_lock, flags);
1246
1247         return ret;
1248 }
1249
1250 static void m_series_stc_writew(comedi_device * dev, uint16_t data, int reg)
1251 {
1252         unsigned offset;
1253         switch (reg) {
1254         case ADC_FIFO_Clear:
1255                 offset = M_Offset_AI_FIFO_Clear;
1256                 break;
1257         case AI_Command_1_Register:
1258                 offset = M_Offset_AI_Command_1;
1259                 break;
1260         case AI_Command_2_Register:
1261                 offset = M_Offset_AI_Command_2;
1262                 break;
1263         case AI_Mode_1_Register:
1264                 offset = M_Offset_AI_Mode_1;
1265                 break;
1266         case AI_Mode_2_Register:
1267                 offset = M_Offset_AI_Mode_2;
1268                 break;
1269         case AI_Mode_3_Register:
1270                 offset = M_Offset_AI_Mode_3;
1271                 break;
1272         case AI_Output_Control_Register:
1273                 offset = M_Offset_AI_Output_Control;
1274                 break;
1275         case AI_Personal_Register:
1276                 offset = M_Offset_AI_Personal;
1277                 break;
1278         case AI_SI2_Load_A_Register:
1279                 // this is actually a 32 bit register on m series boards
1280                 ni_writel(data, M_Offset_AI_SI2_Load_A);
1281                 return;
1282                 break;
1283         case AI_SI2_Load_B_Register:
1284                 // this is actually a 32 bit register on m series boards
1285                 ni_writel(data, M_Offset_AI_SI2_Load_B);
1286                 return;
1287                 break;
1288         case AI_START_STOP_Select_Register:
1289                 offset = M_Offset_AI_START_STOP_Select;
1290                 break;
1291         case AI_Trigger_Select_Register:
1292                 offset = M_Offset_AI_Trigger_Select;
1293                 break;
1294         case Analog_Trigger_Etc_Register:
1295                 offset = M_Offset_Analog_Trigger_Etc;
1296                 break;
1297         case AO_Command_1_Register:
1298                 offset = M_Offset_AO_Command_1;
1299                 break;
1300         case AO_Command_2_Register:
1301                 offset = M_Offset_AO_Command_2;
1302                 break;
1303         case AO_Mode_1_Register:
1304                 offset = M_Offset_AO_Mode_1;
1305                 break;
1306         case AO_Mode_2_Register:
1307                 offset = M_Offset_AO_Mode_2;
1308                 break;
1309         case AO_Mode_3_Register:
1310                 offset = M_Offset_AO_Mode_3;
1311                 break;
1312         case AO_Output_Control_Register:
1313                 offset = M_Offset_AO_Output_Control;
1314                 break;
1315         case AO_Personal_Register:
1316                 offset = M_Offset_AO_Personal;
1317                 break;
1318         case AO_Start_Select_Register:
1319                 offset = M_Offset_AO_Start_Select;
1320                 break;
1321         case AO_Trigger_Select_Register:
1322                 offset = M_Offset_AO_Trigger_Select;
1323                 break;
1324         case Clock_and_FOUT_Register:
1325                 offset = M_Offset_Clock_and_FOUT;
1326                 break;
1327         case Configuration_Memory_Clear:
1328                 offset = M_Offset_Configuration_Memory_Clear;
1329                 break;
1330         case DAC_FIFO_Clear:
1331                 offset = M_Offset_AO_FIFO_Clear;
1332                 break;
1333         case DIO_Control_Register:
1334                 rt_printk
1335                         ("%s: FIXME: register 0x%x does not map cleanly on to m-series boards.\n",
1336                         __FUNCTION__, reg);
1337                 return;
1338                 break;
1339         case G_Autoincrement_Register(0):
1340                 offset = M_Offset_G0_Autoincrement;
1341                 break;
1342         case G_Autoincrement_Register(1):
1343                 offset = M_Offset_G1_Autoincrement;
1344                 break;
1345         case G_Command_Register(0):
1346                 offset = M_Offset_G0_Command;
1347                 break;
1348         case G_Command_Register(1):
1349                 offset = M_Offset_G1_Command;
1350                 break;
1351         case G_Input_Select_Register(0):
1352                 offset = M_Offset_G0_Input_Select;
1353                 break;
1354         case G_Input_Select_Register(1):
1355                 offset = M_Offset_G1_Input_Select;
1356                 break;
1357         case G_Mode_Register(0):
1358                 offset = M_Offset_G0_Mode;
1359                 break;
1360         case G_Mode_Register(1):
1361                 offset = M_Offset_G1_Mode;
1362                 break;
1363         case Interrupt_A_Ack_Register:
1364                 offset = M_Offset_Interrupt_A_Ack;
1365                 break;
1366         case Interrupt_A_Enable_Register:
1367                 offset = M_Offset_Interrupt_A_Enable;
1368                 break;
1369         case Interrupt_B_Ack_Register:
1370                 offset = M_Offset_Interrupt_B_Ack;
1371                 break;
1372         case Interrupt_B_Enable_Register:
1373                 offset = M_Offset_Interrupt_B_Enable;
1374                 break;
1375         case Interrupt_Control_Register:
1376                 offset = M_Offset_Interrupt_Control;
1377                 break;
1378         case IO_Bidirection_Pin_Register:
1379                 offset = M_Offset_IO_Bidirection_Pin;
1380                 break;
1381         case Joint_Reset_Register:
1382                 offset = M_Offset_Joint_Reset;
1383                 break;
1384         case RTSI_Trig_A_Output_Register:
1385                 offset = M_Offset_RTSI_Trig_A_Output;
1386                 break;
1387         case RTSI_Trig_B_Output_Register:
1388                 offset = M_Offset_RTSI_Trig_B_Output;
1389                 break;
1390         case RTSI_Trig_Direction_Register:
1391                 offset = M_Offset_RTSI_Trig_Direction;
1392                 break;
1393                 /* FIXME: DIO_Output_Register (16 bit reg) is replaced by M_Offset_Static_Digital_Output (32 bit)
1394                    and M_Offset_SCXI_Serial_Data_Out (8 bit) */
1395         default:
1396                 rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1397                         __FUNCTION__, reg);
1398                 BUG();
1399                 return;
1400                 break;
1401         }
1402         ni_writew(data, offset);
1403 }
1404
1405 static uint16_t m_series_stc_readw(comedi_device * dev, int reg)
1406 {
1407         unsigned offset;
1408         switch (reg) {
1409         case AI_Status_1_Register:
1410                 offset = M_Offset_AI_Status_1;
1411                 break;
1412         case AO_Status_1_Register:
1413                 offset = M_Offset_AO_Status_1;
1414                 break;
1415         case AO_Status_2_Register:
1416                 offset = M_Offset_AO_Status_2;
1417                 break;
1418         case DIO_Serial_Input_Register:
1419                 return ni_readb(M_Offset_SCXI_Serial_Data_In);
1420                 break;
1421         case Joint_Status_1_Register:
1422                 offset = M_Offset_Joint_Status_1;
1423                 break;
1424         case Joint_Status_2_Register:
1425                 offset = M_Offset_Joint_Status_2;
1426                 break;
1427         case G_Status_Register:
1428                 offset = M_Offset_G01_Status;
1429                 break;
1430         default:
1431                 rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1432                         __FUNCTION__, reg);
1433                 BUG();
1434                 return 0;
1435                 break;
1436         }
1437         return ni_readw(offset);
1438 }
1439
1440 static void m_series_stc_writel(comedi_device * dev, uint32_t data, int reg)
1441 {
1442         unsigned offset;
1443         switch (reg) {
1444         case AI_SC_Load_A_Registers:
1445                 offset = M_Offset_AI_SC_Load_A;
1446                 break;
1447         case AI_SI_Load_A_Registers:
1448                 offset = M_Offset_AI_SI_Load_A;
1449                 break;
1450         case AO_BC_Load_A_Register:
1451                 offset = M_Offset_AO_BC_Load_A;
1452                 break;
1453         case AO_UC_Load_A_Register:
1454                 offset = M_Offset_AO_UC_Load_A;
1455                 break;
1456         case AO_UI_Load_A_Register:
1457                 offset = M_Offset_AO_UI_Load_A;
1458                 break;
1459         case G_Load_A_Register(0):
1460                 offset = M_Offset_G0_Load_A;
1461                 break;
1462         case G_Load_A_Register(1):
1463                 offset = M_Offset_G1_Load_A;
1464                 break;
1465         case G_Load_B_Register(0):
1466                 offset = M_Offset_G0_Load_B;
1467                 break;
1468         case G_Load_B_Register(1):
1469                 offset = M_Offset_G1_Load_B;
1470                 break;
1471         default:
1472                 rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1473                         __FUNCTION__, reg);
1474                 BUG();
1475                 return;
1476                 break;
1477         }
1478         ni_writel(data, offset);
1479 }
1480
1481 static uint32_t m_series_stc_readl(comedi_device * dev, int reg)
1482 {
1483         unsigned offset;
1484         switch (reg) {
1485         case G_HW_Save_Register(0):
1486                 offset = M_Offset_G0_HW_Save;
1487                 break;
1488         case G_HW_Save_Register(1):
1489                 offset = M_Offset_G1_HW_Save;
1490                 break;
1491         case G_Save_Register(0):
1492                 offset = M_Offset_G0_Save;
1493                 break;
1494         case G_Save_Register(1):
1495                 offset = M_Offset_G1_Save;
1496                 break;
1497         default:
1498                 rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1499                         __FUNCTION__, reg);
1500                 BUG();
1501                 return 0;
1502                 break;
1503         }
1504         return ni_readl(offset);
1505 }
1506
1507 #define interrupt_pin(a)        0
1508 #define IRQ_POLARITY 1
1509
1510 #define NI_E_IRQ_FLAGS          IRQF_SHARED
1511
1512 #include "ni_mio_common.c"
1513
1514 static int pcimio_find_device(comedi_device * dev, int bus, int slot);
1515 static int pcimio_ai_change(comedi_device * dev, comedi_subdevice * s,
1516         unsigned long new_size);
1517 static int pcimio_ao_change(comedi_device * dev, comedi_subdevice * s,
1518         unsigned long new_size);
1519 static int pcimio_gpct0_change(comedi_device * dev, comedi_subdevice * s,
1520         unsigned long new_size);
1521 static int pcimio_gpct1_change(comedi_device * dev, comedi_subdevice * s,
1522         unsigned long new_size);
1523 static int pcimio_dio_change(comedi_device * dev, comedi_subdevice * s,
1524         unsigned long new_size);
1525
1526 static void m_series_init_eeprom_buffer(comedi_device * dev)
1527 {
1528         static const int Start_Cal_EEPROM = 0x400;
1529         static const unsigned window_size = 10;
1530         static const int serial_number_eeprom_offset = 0x4;
1531         static const int serial_number_eeprom_length = 0x4;
1532         unsigned old_iodwbsr_bits;
1533         unsigned old_iodwbsr1_bits;
1534         unsigned old_iodwcr1_bits;
1535         int i;
1536
1537         old_iodwbsr_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWBSR);
1538         old_iodwbsr1_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1539         old_iodwcr1_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1540         writel(0x0, devpriv->mite->mite_io_addr + MITE_IODWBSR);
1541         writel(((0x80 | window_size) | devpriv->mite->daq_phys_addr),
1542                 devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1543         writel(0x1 | old_iodwcr1_bits, devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1544         writel(0xf, devpriv->mite->mite_io_addr + 0x30);
1545
1546         BUG_ON(serial_number_eeprom_length > sizeof(devpriv->serial_number));
1547         for (i = 0; i < serial_number_eeprom_length; ++i) {
1548                 char *byte_ptr = (char*)&devpriv->serial_number + i;
1549                 *byte_ptr = ni_readb(serial_number_eeprom_offset + i);
1550         }
1551         devpriv->serial_number = be32_to_cpu(devpriv->serial_number);
1552
1553         for (i = 0; i < M_SERIES_EEPROM_SIZE; ++i) {
1554                 devpriv->eeprom_buffer[i] = ni_readb(Start_Cal_EEPROM + i);
1555         }
1556
1557         writel(old_iodwbsr1_bits, devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1558         writel(old_iodwbsr_bits, devpriv->mite->mite_io_addr + MITE_IODWBSR);
1559         writel(old_iodwcr1_bits, devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1560         writel(0x0, devpriv->mite->mite_io_addr + 0x30);
1561 }
1562
1563 static void init_6143(comedi_device * dev)
1564 {
1565         // Disable interrupts
1566         devpriv->stc_writew(dev, 0, Interrupt_Control_Register);
1567
1568         // Initialise 6143 AI specific bits
1569         ni_writeb(0x00, Magic_6143);    // Set G0,G1 DMA mode to E series version
1570         ni_writeb(0x80, PipelineDelay_6143);    // Set EOCMode, ADCMode and pipelinedelay
1571         ni_writeb(0x00, EOC_Set_6143);  // Set EOC Delay
1572
1573         ni_writel(boardtype.ai_fifo_depth / 2, AIFIFO_Flag_6143);       // Set the FIFO half full level
1574
1575         // Strobe Relay disable bit
1576         devpriv->ai_calib_source_enabled = 0;
1577         ni_writew(devpriv->ai_calib_source | Calibration_Channel_6143_RelayOff,
1578                 Calibration_Channel_6143);
1579         ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143);
1580 }
1581
1582 /* cleans up allocated resources */
1583 static int pcimio_detach(comedi_device * dev)
1584 {
1585         mio_common_detach(dev);
1586         if (dev->irq) {
1587                 comedi_free_irq(dev->irq, dev);
1588         }
1589         if (dev->private) {
1590                 mite_free_ring(devpriv->ai_mite_ring);
1591                 mite_free_ring(devpriv->ao_mite_ring);
1592                 mite_free_ring(devpriv->cdo_mite_ring);
1593                 mite_free_ring(devpriv->gpct_mite_ring[0]);
1594                 mite_free_ring(devpriv->gpct_mite_ring[1]);
1595                 if (devpriv->mite)
1596                         mite_unsetup(devpriv->mite);
1597         }
1598
1599         return 0;
1600 }
1601
1602 static int pcimio_attach(comedi_device * dev, comedi_devconfig * it)
1603 {
1604         int ret;
1605
1606         printk("comedi%d: ni_pcimio:", dev->minor);
1607
1608         ret = ni_alloc_private(dev);
1609         if (ret < 0)
1610                 return ret;
1611
1612         ret = pcimio_find_device(dev, it->options[0], it->options[1]);
1613         if (ret < 0)
1614                 return ret;
1615
1616         printk(" %s", boardtype.name);
1617         dev->board_name = boardtype.name;
1618
1619         if (boardtype.reg_type & ni_reg_m_series_mask) {
1620                 devpriv->stc_writew = &m_series_stc_writew;
1621                 devpriv->stc_readw = &m_series_stc_readw;
1622                 devpriv->stc_writel = &m_series_stc_writel;
1623                 devpriv->stc_readl = &m_series_stc_readl;
1624         } else {
1625                 devpriv->stc_writew = &e_series_win_out;
1626                 devpriv->stc_readw = &e_series_win_in;
1627                 devpriv->stc_writel = &win_out2;
1628                 devpriv->stc_readl = &win_in2;
1629         }
1630
1631         ret = mite_setup(devpriv->mite);
1632         if (ret < 0) {
1633                 printk(" error setting up mite\n");
1634                 return ret;
1635         }
1636         comedi_set_hw_dev(dev, &devpriv->mite->pcidev->dev);
1637         devpriv->ai_mite_ring = mite_alloc_ring(devpriv->mite);
1638         if (devpriv->ai_mite_ring == NULL)
1639                 return -ENOMEM;
1640         devpriv->ao_mite_ring = mite_alloc_ring(devpriv->mite);
1641         if (devpriv->ao_mite_ring == NULL)
1642                 return -ENOMEM;
1643         devpriv->cdo_mite_ring = mite_alloc_ring(devpriv->mite);
1644         if (devpriv->cdo_mite_ring == NULL)
1645                 return -ENOMEM;
1646         devpriv->gpct_mite_ring[0] = mite_alloc_ring(devpriv->mite);
1647         if (devpriv->gpct_mite_ring[0] == NULL)
1648                 return -ENOMEM;
1649         devpriv->gpct_mite_ring[1] = mite_alloc_ring(devpriv->mite);
1650         if (devpriv->gpct_mite_ring[1] == NULL)
1651                 return -ENOMEM;
1652
1653         if (boardtype.reg_type & ni_reg_m_series_mask)
1654                 m_series_init_eeprom_buffer(dev);
1655         if (boardtype.reg_type == ni_reg_6143)
1656                 init_6143(dev);
1657
1658         dev->irq = mite_irq(devpriv->mite);
1659
1660         if (dev->irq == 0) {
1661                 printk(" unknown irq (bad)\n");
1662         } else {
1663                 printk(" ( irq = %u )", dev->irq);
1664                 if ((ret = comedi_request_irq(dev->irq, ni_E_interrupt,
1665                                         NI_E_IRQ_FLAGS, DRV_NAME,
1666                                         dev)) < 0) {
1667                         printk(" irq not available\n");
1668                         dev->irq = 0;
1669                 }
1670         }
1671
1672         ret = ni_E_init(dev, it);
1673         if (ret < 0)
1674                 return ret;
1675
1676         dev->subdevices[NI_AI_SUBDEV].buf_change = &pcimio_ai_change;
1677         dev->subdevices[NI_AO_SUBDEV].buf_change = &pcimio_ao_change;
1678         dev->subdevices[NI_GPCT_SUBDEV(0)].buf_change = &pcimio_gpct0_change;
1679         dev->subdevices[NI_GPCT_SUBDEV(1)].buf_change = &pcimio_gpct1_change;
1680         dev->subdevices[NI_DIO_SUBDEV].buf_change = &pcimio_dio_change;
1681
1682         return ret;
1683 }
1684
1685 static int pcimio_find_device(comedi_device * dev, int bus, int slot)
1686 {
1687         struct mite_struct *mite;
1688         int i;
1689
1690         for (mite = mite_devices; mite; mite = mite->next) {
1691                 if (mite->used)
1692                         continue;
1693                 if (bus || slot) {
1694                         if (bus != mite->pcidev->bus->number ||
1695                                 slot != PCI_SLOT(mite->pcidev->devfn))
1696                                 continue;
1697                 }
1698
1699                 for (i = 0; i < n_pcimio_boards; i++) {
1700                         if (mite_device_id(mite) == ni_boards[i].device_id) {
1701                                 dev->board_ptr = ni_boards + i;
1702                                 devpriv->mite = mite;
1703
1704                                 return 0;
1705                         }
1706                 }
1707         }
1708         printk("no device found\n");
1709         mite_list_devices();
1710         return -EIO;
1711 }
1712
1713 static int pcimio_ai_change(comedi_device * dev, comedi_subdevice * s,
1714         unsigned long new_size)
1715 {
1716         int ret;
1717
1718         ret = mite_buf_change(devpriv->ai_mite_ring, s->async);
1719         if (ret < 0)
1720                 return ret;
1721
1722         return 0;
1723 }
1724
1725 static int pcimio_ao_change(comedi_device * dev, comedi_subdevice * s,
1726         unsigned long new_size)
1727 {
1728         int ret;
1729
1730         ret = mite_buf_change(devpriv->ao_mite_ring, s->async);
1731         if (ret < 0)
1732                 return ret;
1733
1734         return 0;
1735 }
1736
1737 static int pcimio_gpct0_change(comedi_device * dev, comedi_subdevice * s,
1738         unsigned long new_size)
1739 {
1740         int ret;
1741
1742         ret = mite_buf_change(devpriv->gpct_mite_ring[0], s->async);
1743         if (ret < 0)
1744                 return ret;
1745
1746         return 0;
1747 }
1748
1749 static int pcimio_gpct1_change(comedi_device * dev, comedi_subdevice * s,
1750         unsigned long new_size)
1751 {
1752         int ret;
1753
1754         ret = mite_buf_change(devpriv->gpct_mite_ring[1], s->async);
1755         if (ret < 0)
1756                 return ret;
1757
1758         return 0;
1759 }
1760
1761 static int pcimio_dio_change(comedi_device * dev, comedi_subdevice * s,
1762         unsigned long new_size)
1763 {
1764         int ret;
1765
1766         ret = mite_buf_change(devpriv->cdo_mite_ring, s->async);
1767         if (ret < 0)
1768                 return ret;
1769
1770         return 0;
1771 }