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