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