Merge tag 'for-linus' of git://github.com/realmz/blackfin-linux
[firefly-linux-kernel-4.4.55.git] / drivers / staging / comedi / drivers / ni_660x.c
1 /*
2   comedi/drivers/ni_660x.c
3   Hardware driver for NI 660x devices
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 2 of the License, or
8   (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program; if not, write to the Free Software
17   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 /*
21  * Driver: ni_660x
22  * Description: National Instruments 660x counter/timer boards
23  * Devices: [National Instruments] PCI-6601 (ni_660x), PCI-6602, PXI-6602,
24  *   PXI-6608, PXI-6624
25  * Author: J.P. Mellor <jpmellor@rose-hulman.edu>,
26  *   Herman.Bruyninckx@mech.kuleuven.ac.be,
27  *   Wim.Meeussen@mech.kuleuven.ac.be,
28  *   Klaas.Gadeyne@mech.kuleuven.ac.be,
29  *   Frank Mori Hess <fmhess@users.sourceforge.net>
30  * Updated: Fri, 15 Mar 2013 10:47:56 +0000
31  * Status: experimental
32  *
33  * Encoders work.  PulseGeneration (both single pulse and pulse train)
34  * works.  Buffered commands work for input but not output.
35  * 
36  * References:
37  * DAQ 660x Register-Level Programmer Manual  (NI 370505A-01)
38  * DAQ 6601/6602 User Manual (NI 322137B-01)
39  */
40
41 #include <linux/pci.h>
42 #include <linux/interrupt.h>
43
44 #include "../comedidev.h"
45
46 #include "mite.h"
47 #include "ni_tio.h"
48
49 enum ni_660x_constants {
50         min_counter_pfi_chan = 8,
51         max_dio_pfi_chan = 31,
52         counters_per_chip = 4
53 };
54
55 #define NUM_PFI_CHANNELS 40
56 /* really there are only up to 3 dma channels, but the register layout allows
57 for 4 */
58 #define MAX_DMA_CHANNEL 4
59
60 /* See Register-Level Programmer Manual page 3.1 */
61 enum NI_660x_Register {
62         G0InterruptAcknowledge,
63         G0StatusRegister,
64         G1InterruptAcknowledge,
65         G1StatusRegister,
66         G01StatusRegister,
67         G0CommandRegister,
68         STCDIOParallelInput,
69         G1CommandRegister,
70         G0HWSaveRegister,
71         G1HWSaveRegister,
72         STCDIOOutput,
73         STCDIOControl,
74         G0SWSaveRegister,
75         G1SWSaveRegister,
76         G0ModeRegister,
77         G01JointStatus1Register,
78         G1ModeRegister,
79         STCDIOSerialInput,
80         G0LoadARegister,
81         G01JointStatus2Register,
82         G0LoadBRegister,
83         G1LoadARegister,
84         G1LoadBRegister,
85         G0InputSelectRegister,
86         G1InputSelectRegister,
87         G0AutoincrementRegister,
88         G1AutoincrementRegister,
89         G01JointResetRegister,
90         G0InterruptEnable,
91         G1InterruptEnable,
92         G0CountingModeRegister,
93         G1CountingModeRegister,
94         G0SecondGateRegister,
95         G1SecondGateRegister,
96         G0DMAConfigRegister,
97         G0DMAStatusRegister,
98         G1DMAConfigRegister,
99         G1DMAStatusRegister,
100         G2InterruptAcknowledge,
101         G2StatusRegister,
102         G3InterruptAcknowledge,
103         G3StatusRegister,
104         G23StatusRegister,
105         G2CommandRegister,
106         G3CommandRegister,
107         G2HWSaveRegister,
108         G3HWSaveRegister,
109         G2SWSaveRegister,
110         G3SWSaveRegister,
111         G2ModeRegister,
112         G23JointStatus1Register,
113         G3ModeRegister,
114         G2LoadARegister,
115         G23JointStatus2Register,
116         G2LoadBRegister,
117         G3LoadARegister,
118         G3LoadBRegister,
119         G2InputSelectRegister,
120         G3InputSelectRegister,
121         G2AutoincrementRegister,
122         G3AutoincrementRegister,
123         G23JointResetRegister,
124         G2InterruptEnable,
125         G3InterruptEnable,
126         G2CountingModeRegister,
127         G3CountingModeRegister,
128         G3SecondGateRegister,
129         G2SecondGateRegister,
130         G2DMAConfigRegister,
131         G2DMAStatusRegister,
132         G3DMAConfigRegister,
133         G3DMAStatusRegister,
134         DIO32Input,
135         DIO32Output,
136         ClockConfigRegister,
137         GlobalInterruptStatusRegister,
138         DMAConfigRegister,
139         GlobalInterruptConfigRegister,
140         IOConfigReg0_1,
141         IOConfigReg2_3,
142         IOConfigReg4_5,
143         IOConfigReg6_7,
144         IOConfigReg8_9,
145         IOConfigReg10_11,
146         IOConfigReg12_13,
147         IOConfigReg14_15,
148         IOConfigReg16_17,
149         IOConfigReg18_19,
150         IOConfigReg20_21,
151         IOConfigReg22_23,
152         IOConfigReg24_25,
153         IOConfigReg26_27,
154         IOConfigReg28_29,
155         IOConfigReg30_31,
156         IOConfigReg32_33,
157         IOConfigReg34_35,
158         IOConfigReg36_37,
159         IOConfigReg38_39,
160         NumRegisters,
161 };
162
163 static inline unsigned IOConfigReg(unsigned pfi_channel)
164 {
165         unsigned reg = IOConfigReg0_1 + pfi_channel / 2;
166         BUG_ON(reg > IOConfigReg38_39);
167         return reg;
168 }
169
170 enum ni_660x_register_width {
171         DATA_1B,
172         DATA_2B,
173         DATA_4B
174 };
175
176 enum ni_660x_register_direction {
177         NI_660x_READ,
178         NI_660x_WRITE,
179         NI_660x_READ_WRITE
180 };
181
182 enum ni_660x_pfi_output_select {
183         pfi_output_select_high_Z = 0,
184         pfi_output_select_counter = 1,
185         pfi_output_select_do = 2,
186         num_pfi_output_selects
187 };
188
189 enum ni_660x_subdevices {
190         NI_660X_DIO_SUBDEV = 1,
191         NI_660X_GPCT_SUBDEV_0 = 2
192 };
193 static inline unsigned NI_660X_GPCT_SUBDEV(unsigned index)
194 {
195         return NI_660X_GPCT_SUBDEV_0 + index;
196 }
197
198 struct NI_660xRegisterData {
199
200         const char *name;       /*  Register Name */
201         int offset;             /*  Offset from base address from GPCT chip */
202         enum ni_660x_register_direction direction;
203         enum ni_660x_register_width size; /* 1 byte, 2 bytes, or 4 bytes */
204 };
205
206 static const struct NI_660xRegisterData registerData[NumRegisters] = {
207         {"G0 Interrupt Acknowledge", 0x004, NI_660x_WRITE, DATA_2B},
208         {"G0 Status Register", 0x004, NI_660x_READ, DATA_2B},
209         {"G1 Interrupt Acknowledge", 0x006, NI_660x_WRITE, DATA_2B},
210         {"G1 Status Register", 0x006, NI_660x_READ, DATA_2B},
211         {"G01 Status Register ", 0x008, NI_660x_READ, DATA_2B},
212         {"G0 Command Register", 0x00C, NI_660x_WRITE, DATA_2B},
213         {"STC DIO Parallel Input", 0x00E, NI_660x_READ, DATA_2B},
214         {"G1 Command Register", 0x00E, NI_660x_WRITE, DATA_2B},
215         {"G0 HW Save Register", 0x010, NI_660x_READ, DATA_4B},
216         {"G1 HW Save Register", 0x014, NI_660x_READ, DATA_4B},
217         {"STC DIO Output", 0x014, NI_660x_WRITE, DATA_2B},
218         {"STC DIO Control", 0x016, NI_660x_WRITE, DATA_2B},
219         {"G0 SW Save Register", 0x018, NI_660x_READ, DATA_4B},
220         {"G1 SW Save Register", 0x01C, NI_660x_READ, DATA_4B},
221         {"G0 Mode Register", 0x034, NI_660x_WRITE, DATA_2B},
222         {"G01 Joint Status 1 Register", 0x036, NI_660x_READ, DATA_2B},
223         {"G1 Mode Register", 0x036, NI_660x_WRITE, DATA_2B},
224         {"STC DIO Serial Input", 0x038, NI_660x_READ, DATA_2B},
225         {"G0 Load A Register", 0x038, NI_660x_WRITE, DATA_4B},
226         {"G01 Joint Status 2 Register", 0x03A, NI_660x_READ, DATA_2B},
227         {"G0 Load B Register", 0x03C, NI_660x_WRITE, DATA_4B},
228         {"G1 Load A Register", 0x040, NI_660x_WRITE, DATA_4B},
229         {"G1 Load B Register", 0x044, NI_660x_WRITE, DATA_4B},
230         {"G0 Input Select Register", 0x048, NI_660x_WRITE, DATA_2B},
231         {"G1 Input Select Register", 0x04A, NI_660x_WRITE, DATA_2B},
232         {"G0 Autoincrement Register", 0x088, NI_660x_WRITE, DATA_2B},
233         {"G1 Autoincrement Register", 0x08A, NI_660x_WRITE, DATA_2B},
234         {"G01 Joint Reset Register", 0x090, NI_660x_WRITE, DATA_2B},
235         {"G0 Interrupt Enable", 0x092, NI_660x_WRITE, DATA_2B},
236         {"G1 Interrupt Enable", 0x096, NI_660x_WRITE, DATA_2B},
237         {"G0 Counting Mode Register", 0x0B0, NI_660x_WRITE, DATA_2B},
238         {"G1 Counting Mode Register", 0x0B2, NI_660x_WRITE, DATA_2B},
239         {"G0 Second Gate Register", 0x0B4, NI_660x_WRITE, DATA_2B},
240         {"G1 Second Gate Register", 0x0B6, NI_660x_WRITE, DATA_2B},
241         {"G0 DMA Config Register", 0x0B8, NI_660x_WRITE, DATA_2B},
242         {"G0 DMA Status Register", 0x0B8, NI_660x_READ, DATA_2B},
243         {"G1 DMA Config Register", 0x0BA, NI_660x_WRITE, DATA_2B},
244         {"G1 DMA Status Register", 0x0BA, NI_660x_READ, DATA_2B},
245         {"G2 Interrupt Acknowledge", 0x104, NI_660x_WRITE, DATA_2B},
246         {"G2 Status Register", 0x104, NI_660x_READ, DATA_2B},
247         {"G3 Interrupt Acknowledge", 0x106, NI_660x_WRITE, DATA_2B},
248         {"G3 Status Register", 0x106, NI_660x_READ, DATA_2B},
249         {"G23 Status Register", 0x108, NI_660x_READ, DATA_2B},
250         {"G2 Command Register", 0x10C, NI_660x_WRITE, DATA_2B},
251         {"G3 Command Register", 0x10E, NI_660x_WRITE, DATA_2B},
252         {"G2 HW Save Register", 0x110, NI_660x_READ, DATA_4B},
253         {"G3 HW Save Register", 0x114, NI_660x_READ, DATA_4B},
254         {"G2 SW Save Register", 0x118, NI_660x_READ, DATA_4B},
255         {"G3 SW Save Register", 0x11C, NI_660x_READ, DATA_4B},
256         {"G2 Mode Register", 0x134, NI_660x_WRITE, DATA_2B},
257         {"G23 Joint Status 1 Register", 0x136, NI_660x_READ, DATA_2B},
258         {"G3 Mode Register", 0x136, NI_660x_WRITE, DATA_2B},
259         {"G2 Load A Register", 0x138, NI_660x_WRITE, DATA_4B},
260         {"G23 Joint Status 2 Register", 0x13A, NI_660x_READ, DATA_2B},
261         {"G2 Load B Register", 0x13C, NI_660x_WRITE, DATA_4B},
262         {"G3 Load A Register", 0x140, NI_660x_WRITE, DATA_4B},
263         {"G3 Load B Register", 0x144, NI_660x_WRITE, DATA_4B},
264         {"G2 Input Select Register", 0x148, NI_660x_WRITE, DATA_2B},
265         {"G3 Input Select Register", 0x14A, NI_660x_WRITE, DATA_2B},
266         {"G2 Autoincrement Register", 0x188, NI_660x_WRITE, DATA_2B},
267         {"G3 Autoincrement Register", 0x18A, NI_660x_WRITE, DATA_2B},
268         {"G23 Joint Reset Register", 0x190, NI_660x_WRITE, DATA_2B},
269         {"G2 Interrupt Enable", 0x192, NI_660x_WRITE, DATA_2B},
270         {"G3 Interrupt Enable", 0x196, NI_660x_WRITE, DATA_2B},
271         {"G2 Counting Mode Register", 0x1B0, NI_660x_WRITE, DATA_2B},
272         {"G3 Counting Mode Register", 0x1B2, NI_660x_WRITE, DATA_2B},
273         {"G3 Second Gate Register", 0x1B6, NI_660x_WRITE, DATA_2B},
274         {"G2 Second Gate Register", 0x1B4, NI_660x_WRITE, DATA_2B},
275         {"G2 DMA Config Register", 0x1B8, NI_660x_WRITE, DATA_2B},
276         {"G2 DMA Status Register", 0x1B8, NI_660x_READ, DATA_2B},
277         {"G3 DMA Config Register", 0x1BA, NI_660x_WRITE, DATA_2B},
278         {"G3 DMA Status Register", 0x1BA, NI_660x_READ, DATA_2B},
279         {"32 bit Digital Input", 0x414, NI_660x_READ, DATA_4B},
280         {"32 bit Digital Output", 0x510, NI_660x_WRITE, DATA_4B},
281         {"Clock Config Register", 0x73C, NI_660x_WRITE, DATA_4B},
282         {"Global Interrupt Status Register", 0x754, NI_660x_READ, DATA_4B},
283         {"DMA Configuration Register", 0x76C, NI_660x_WRITE, DATA_4B},
284         {"Global Interrupt Config Register", 0x770, NI_660x_WRITE, DATA_4B},
285         {"IO Config Register 0-1", 0x77C, NI_660x_READ_WRITE, DATA_2B},
286         {"IO Config Register 2-3", 0x77E, NI_660x_READ_WRITE, DATA_2B},
287         {"IO Config Register 4-5", 0x780, NI_660x_READ_WRITE, DATA_2B},
288         {"IO Config Register 6-7", 0x782, NI_660x_READ_WRITE, DATA_2B},
289         {"IO Config Register 8-9", 0x784, NI_660x_READ_WRITE, DATA_2B},
290         {"IO Config Register 10-11", 0x786, NI_660x_READ_WRITE, DATA_2B},
291         {"IO Config Register 12-13", 0x788, NI_660x_READ_WRITE, DATA_2B},
292         {"IO Config Register 14-15", 0x78A, NI_660x_READ_WRITE, DATA_2B},
293         {"IO Config Register 16-17", 0x78C, NI_660x_READ_WRITE, DATA_2B},
294         {"IO Config Register 18-19", 0x78E, NI_660x_READ_WRITE, DATA_2B},
295         {"IO Config Register 20-21", 0x790, NI_660x_READ_WRITE, DATA_2B},
296         {"IO Config Register 22-23", 0x792, NI_660x_READ_WRITE, DATA_2B},
297         {"IO Config Register 24-25", 0x794, NI_660x_READ_WRITE, DATA_2B},
298         {"IO Config Register 26-27", 0x796, NI_660x_READ_WRITE, DATA_2B},
299         {"IO Config Register 28-29", 0x798, NI_660x_READ_WRITE, DATA_2B},
300         {"IO Config Register 30-31", 0x79A, NI_660x_READ_WRITE, DATA_2B},
301         {"IO Config Register 32-33", 0x79C, NI_660x_READ_WRITE, DATA_2B},
302         {"IO Config Register 34-35", 0x79E, NI_660x_READ_WRITE, DATA_2B},
303         {"IO Config Register 36-37", 0x7A0, NI_660x_READ_WRITE, DATA_2B},
304         {"IO Config Register 38-39", 0x7A2, NI_660x_READ_WRITE, DATA_2B}
305 };
306
307 /* kind of ENABLE for the second counter */
308 enum clock_config_register_bits {
309         CounterSwap = 0x1 << 21
310 };
311
312 /* ioconfigreg */
313 static inline unsigned ioconfig_bitshift(unsigned pfi_channel)
314 {
315         if (pfi_channel % 2)
316                 return 0;
317         else
318                 return 8;
319 }
320
321 static inline unsigned pfi_output_select_mask(unsigned pfi_channel)
322 {
323         return 0x3 << ioconfig_bitshift(pfi_channel);
324 }
325
326 static inline unsigned pfi_output_select_bits(unsigned pfi_channel,
327                                               unsigned output_select)
328 {
329         return (output_select & 0x3) << ioconfig_bitshift(pfi_channel);
330 }
331
332 static inline unsigned pfi_input_select_mask(unsigned pfi_channel)
333 {
334         return 0x7 << (4 + ioconfig_bitshift(pfi_channel));
335 }
336
337 static inline unsigned pfi_input_select_bits(unsigned pfi_channel,
338                                              unsigned input_select)
339 {
340         return (input_select & 0x7) << (4 + ioconfig_bitshift(pfi_channel));
341 }
342
343 /* dma configuration register bits */
344 static inline unsigned dma_select_mask(unsigned dma_channel)
345 {
346         BUG_ON(dma_channel >= MAX_DMA_CHANNEL);
347         return 0x1f << (8 * dma_channel);
348 }
349
350 enum dma_selection {
351         dma_selection_none = 0x1f,
352 };
353 static inline unsigned dma_selection_counter(unsigned counter_index)
354 {
355         BUG_ON(counter_index >= counters_per_chip);
356         return counter_index;
357 }
358
359 static inline unsigned dma_select_bits(unsigned dma_channel, unsigned selection)
360 {
361         BUG_ON(dma_channel >= MAX_DMA_CHANNEL);
362         return (selection << (8 * dma_channel)) & dma_select_mask(dma_channel);
363 }
364
365 static inline unsigned dma_reset_bit(unsigned dma_channel)
366 {
367         BUG_ON(dma_channel >= MAX_DMA_CHANNEL);
368         return 0x80 << (8 * dma_channel);
369 }
370
371 enum global_interrupt_status_register_bits {
372         Counter_0_Int_Bit = 0x100,
373         Counter_1_Int_Bit = 0x200,
374         Counter_2_Int_Bit = 0x400,
375         Counter_3_Int_Bit = 0x800,
376         Cascade_Int_Bit = 0x20000000,
377         Global_Int_Bit = 0x80000000
378 };
379
380 enum global_interrupt_config_register_bits {
381         Cascade_Int_Enable_Bit = 0x20000000,
382         Global_Int_Polarity_Bit = 0x40000000,
383         Global_Int_Enable_Bit = 0x80000000
384 };
385
386 /* Offset of the GPCT chips from the base-address of the card */
387 /* First chip is at base-address + 0x00, etc. */
388 static const unsigned GPCT_OFFSET[2] = { 0x0, 0x800 };
389
390 enum ni_660x_boardid {
391         BOARD_PCI6601,
392         BOARD_PCI6602,
393         BOARD_PXI6602,
394         BOARD_PXI6608,
395         BOARD_PXI6624
396 };
397
398 struct ni_660x_board {
399         const char *name;
400         unsigned n_chips;       /* total number of TIO chips */
401 };
402
403 static const struct ni_660x_board ni_660x_boards[] = {
404         [BOARD_PCI6601] = {
405                 .name           = "PCI-6601",
406                 .n_chips        = 1,
407         },
408         [BOARD_PCI6602] = {
409                 .name           = "PCI-6602",
410                 .n_chips        = 2,
411         },
412         [BOARD_PXI6602] = {
413                 .name           = "PXI-6602",
414                 .n_chips        = 2,
415         },
416         [BOARD_PXI6608] = {
417                 .name           = "PXI-6608",
418                 .n_chips        = 2,
419         },
420         [BOARD_PXI6624] = {
421                 .name           = "PXI-6624",
422                 .n_chips        = 2,
423         },
424 };
425
426 #define NI_660X_MAX_NUM_CHIPS 2
427 #define NI_660X_MAX_NUM_COUNTERS (NI_660X_MAX_NUM_CHIPS * counters_per_chip)
428
429 struct ni_660x_private {
430         struct mite_struct *mite;
431         struct ni_gpct_device *counter_dev;
432         uint64_t pfi_direction_bits;
433         struct mite_dma_descriptor_ring
434         *mite_rings[NI_660X_MAX_NUM_CHIPS][counters_per_chip];
435         spinlock_t mite_channel_lock;
436         /* interrupt_lock prevents races between interrupt and comedi_poll */
437         spinlock_t interrupt_lock;
438         unsigned dma_configuration_soft_copies[NI_660X_MAX_NUM_CHIPS];
439         spinlock_t soft_reg_copy_lock;
440         unsigned short pfi_output_selects[NUM_PFI_CHANNELS];
441 };
442
443 static inline unsigned ni_660x_num_counters(struct comedi_device *dev)
444 {
445         const struct ni_660x_board *board = comedi_board(dev);
446
447         return board->n_chips * counters_per_chip;
448 }
449
450 static enum NI_660x_Register ni_gpct_to_660x_register(enum ni_gpct_register reg)
451 {
452         enum NI_660x_Register ni_660x_register;
453         switch (reg) {
454         case NITIO_G0_Autoincrement_Reg:
455                 ni_660x_register = G0AutoincrementRegister;
456                 break;
457         case NITIO_G1_Autoincrement_Reg:
458                 ni_660x_register = G1AutoincrementRegister;
459                 break;
460         case NITIO_G2_Autoincrement_Reg:
461                 ni_660x_register = G2AutoincrementRegister;
462                 break;
463         case NITIO_G3_Autoincrement_Reg:
464                 ni_660x_register = G3AutoincrementRegister;
465                 break;
466         case NITIO_G0_Command_Reg:
467                 ni_660x_register = G0CommandRegister;
468                 break;
469         case NITIO_G1_Command_Reg:
470                 ni_660x_register = G1CommandRegister;
471                 break;
472         case NITIO_G2_Command_Reg:
473                 ni_660x_register = G2CommandRegister;
474                 break;
475         case NITIO_G3_Command_Reg:
476                 ni_660x_register = G3CommandRegister;
477                 break;
478         case NITIO_G0_HW_Save_Reg:
479                 ni_660x_register = G0HWSaveRegister;
480                 break;
481         case NITIO_G1_HW_Save_Reg:
482                 ni_660x_register = G1HWSaveRegister;
483                 break;
484         case NITIO_G2_HW_Save_Reg:
485                 ni_660x_register = G2HWSaveRegister;
486                 break;
487         case NITIO_G3_HW_Save_Reg:
488                 ni_660x_register = G3HWSaveRegister;
489                 break;
490         case NITIO_G0_SW_Save_Reg:
491                 ni_660x_register = G0SWSaveRegister;
492                 break;
493         case NITIO_G1_SW_Save_Reg:
494                 ni_660x_register = G1SWSaveRegister;
495                 break;
496         case NITIO_G2_SW_Save_Reg:
497                 ni_660x_register = G2SWSaveRegister;
498                 break;
499         case NITIO_G3_SW_Save_Reg:
500                 ni_660x_register = G3SWSaveRegister;
501                 break;
502         case NITIO_G0_Mode_Reg:
503                 ni_660x_register = G0ModeRegister;
504                 break;
505         case NITIO_G1_Mode_Reg:
506                 ni_660x_register = G1ModeRegister;
507                 break;
508         case NITIO_G2_Mode_Reg:
509                 ni_660x_register = G2ModeRegister;
510                 break;
511         case NITIO_G3_Mode_Reg:
512                 ni_660x_register = G3ModeRegister;
513                 break;
514         case NITIO_G0_LoadA_Reg:
515                 ni_660x_register = G0LoadARegister;
516                 break;
517         case NITIO_G1_LoadA_Reg:
518                 ni_660x_register = G1LoadARegister;
519                 break;
520         case NITIO_G2_LoadA_Reg:
521                 ni_660x_register = G2LoadARegister;
522                 break;
523         case NITIO_G3_LoadA_Reg:
524                 ni_660x_register = G3LoadARegister;
525                 break;
526         case NITIO_G0_LoadB_Reg:
527                 ni_660x_register = G0LoadBRegister;
528                 break;
529         case NITIO_G1_LoadB_Reg:
530                 ni_660x_register = G1LoadBRegister;
531                 break;
532         case NITIO_G2_LoadB_Reg:
533                 ni_660x_register = G2LoadBRegister;
534                 break;
535         case NITIO_G3_LoadB_Reg:
536                 ni_660x_register = G3LoadBRegister;
537                 break;
538         case NITIO_G0_Input_Select_Reg:
539                 ni_660x_register = G0InputSelectRegister;
540                 break;
541         case NITIO_G1_Input_Select_Reg:
542                 ni_660x_register = G1InputSelectRegister;
543                 break;
544         case NITIO_G2_Input_Select_Reg:
545                 ni_660x_register = G2InputSelectRegister;
546                 break;
547         case NITIO_G3_Input_Select_Reg:
548                 ni_660x_register = G3InputSelectRegister;
549                 break;
550         case NITIO_G01_Status_Reg:
551                 ni_660x_register = G01StatusRegister;
552                 break;
553         case NITIO_G23_Status_Reg:
554                 ni_660x_register = G23StatusRegister;
555                 break;
556         case NITIO_G01_Joint_Reset_Reg:
557                 ni_660x_register = G01JointResetRegister;
558                 break;
559         case NITIO_G23_Joint_Reset_Reg:
560                 ni_660x_register = G23JointResetRegister;
561                 break;
562         case NITIO_G01_Joint_Status1_Reg:
563                 ni_660x_register = G01JointStatus1Register;
564                 break;
565         case NITIO_G23_Joint_Status1_Reg:
566                 ni_660x_register = G23JointStatus1Register;
567                 break;
568         case NITIO_G01_Joint_Status2_Reg:
569                 ni_660x_register = G01JointStatus2Register;
570                 break;
571         case NITIO_G23_Joint_Status2_Reg:
572                 ni_660x_register = G23JointStatus2Register;
573                 break;
574         case NITIO_G0_Counting_Mode_Reg:
575                 ni_660x_register = G0CountingModeRegister;
576                 break;
577         case NITIO_G1_Counting_Mode_Reg:
578                 ni_660x_register = G1CountingModeRegister;
579                 break;
580         case NITIO_G2_Counting_Mode_Reg:
581                 ni_660x_register = G2CountingModeRegister;
582                 break;
583         case NITIO_G3_Counting_Mode_Reg:
584                 ni_660x_register = G3CountingModeRegister;
585                 break;
586         case NITIO_G0_Second_Gate_Reg:
587                 ni_660x_register = G0SecondGateRegister;
588                 break;
589         case NITIO_G1_Second_Gate_Reg:
590                 ni_660x_register = G1SecondGateRegister;
591                 break;
592         case NITIO_G2_Second_Gate_Reg:
593                 ni_660x_register = G2SecondGateRegister;
594                 break;
595         case NITIO_G3_Second_Gate_Reg:
596                 ni_660x_register = G3SecondGateRegister;
597                 break;
598         case NITIO_G0_DMA_Config_Reg:
599                 ni_660x_register = G0DMAConfigRegister;
600                 break;
601         case NITIO_G0_DMA_Status_Reg:
602                 ni_660x_register = G0DMAStatusRegister;
603                 break;
604         case NITIO_G1_DMA_Config_Reg:
605                 ni_660x_register = G1DMAConfigRegister;
606                 break;
607         case NITIO_G1_DMA_Status_Reg:
608                 ni_660x_register = G1DMAStatusRegister;
609                 break;
610         case NITIO_G2_DMA_Config_Reg:
611                 ni_660x_register = G2DMAConfigRegister;
612                 break;
613         case NITIO_G2_DMA_Status_Reg:
614                 ni_660x_register = G2DMAStatusRegister;
615                 break;
616         case NITIO_G3_DMA_Config_Reg:
617                 ni_660x_register = G3DMAConfigRegister;
618                 break;
619         case NITIO_G3_DMA_Status_Reg:
620                 ni_660x_register = G3DMAStatusRegister;
621                 break;
622         case NITIO_G0_Interrupt_Acknowledge_Reg:
623                 ni_660x_register = G0InterruptAcknowledge;
624                 break;
625         case NITIO_G1_Interrupt_Acknowledge_Reg:
626                 ni_660x_register = G1InterruptAcknowledge;
627                 break;
628         case NITIO_G2_Interrupt_Acknowledge_Reg:
629                 ni_660x_register = G2InterruptAcknowledge;
630                 break;
631         case NITIO_G3_Interrupt_Acknowledge_Reg:
632                 ni_660x_register = G3InterruptAcknowledge;
633                 break;
634         case NITIO_G0_Status_Reg:
635                 ni_660x_register = G0StatusRegister;
636                 break;
637         case NITIO_G1_Status_Reg:
638                 ni_660x_register = G1StatusRegister;
639                 break;
640         case NITIO_G2_Status_Reg:
641                 ni_660x_register = G2StatusRegister;
642                 break;
643         case NITIO_G3_Status_Reg:
644                 ni_660x_register = G3StatusRegister;
645                 break;
646         case NITIO_G0_Interrupt_Enable_Reg:
647                 ni_660x_register = G0InterruptEnable;
648                 break;
649         case NITIO_G1_Interrupt_Enable_Reg:
650                 ni_660x_register = G1InterruptEnable;
651                 break;
652         case NITIO_G2_Interrupt_Enable_Reg:
653                 ni_660x_register = G2InterruptEnable;
654                 break;
655         case NITIO_G3_Interrupt_Enable_Reg:
656                 ni_660x_register = G3InterruptEnable;
657                 break;
658         default:
659                 BUG();
660                 return 0;
661                 break;
662         }
663         return ni_660x_register;
664 }
665
666 static inline void ni_660x_write_register(struct comedi_device *dev,
667                                           unsigned chip_index, unsigned bits,
668                                           enum NI_660x_Register reg)
669 {
670         struct ni_660x_private *devpriv = dev->private;
671         void __iomem *write_address =
672             devpriv->mite->daq_io_addr + GPCT_OFFSET[chip_index] +
673             registerData[reg].offset;
674
675         switch (registerData[reg].size) {
676         case DATA_2B:
677                 writew(bits, write_address);
678                 break;
679         case DATA_4B:
680                 writel(bits, write_address);
681                 break;
682         default:
683                 BUG();
684                 break;
685         }
686 }
687
688 static inline unsigned ni_660x_read_register(struct comedi_device *dev,
689                                              unsigned chip_index,
690                                              enum NI_660x_Register reg)
691 {
692         struct ni_660x_private *devpriv = dev->private;
693         void __iomem *read_address =
694             devpriv->mite->daq_io_addr + GPCT_OFFSET[chip_index] +
695             registerData[reg].offset;
696
697         switch (registerData[reg].size) {
698         case DATA_2B:
699                 return readw(read_address);
700                 break;
701         case DATA_4B:
702                 return readl(read_address);
703                 break;
704         default:
705                 BUG();
706                 break;
707         }
708         return 0;
709 }
710
711 static void ni_gpct_write_register(struct ni_gpct *counter, unsigned bits,
712                                    enum ni_gpct_register reg)
713 {
714         struct comedi_device *dev = counter->counter_dev->dev;
715         enum NI_660x_Register ni_660x_register = ni_gpct_to_660x_register(reg);
716         ni_660x_write_register(dev, counter->chip_index, bits,
717                                ni_660x_register);
718 }
719
720 static unsigned ni_gpct_read_register(struct ni_gpct *counter,
721                                       enum ni_gpct_register reg)
722 {
723         struct comedi_device *dev = counter->counter_dev->dev;
724         enum NI_660x_Register ni_660x_register = ni_gpct_to_660x_register(reg);
725         return ni_660x_read_register(dev, counter->chip_index,
726                                      ni_660x_register);
727 }
728
729 static inline struct mite_dma_descriptor_ring *mite_ring(struct ni_660x_private
730                                                          *priv,
731                                                          struct ni_gpct
732                                                          *counter)
733 {
734         return priv->mite_rings[counter->chip_index][counter->counter_index];
735 }
736
737 static inline void ni_660x_set_dma_channel(struct comedi_device *dev,
738                                            unsigned mite_channel,
739                                            struct ni_gpct *counter)
740 {
741         struct ni_660x_private *devpriv = dev->private;
742         unsigned long flags;
743
744         spin_lock_irqsave(&devpriv->soft_reg_copy_lock, flags);
745         devpriv->dma_configuration_soft_copies[counter->chip_index] &=
746             ~dma_select_mask(mite_channel);
747         devpriv->dma_configuration_soft_copies[counter->chip_index] |=
748             dma_select_bits(mite_channel,
749                             dma_selection_counter(counter->counter_index));
750         ni_660x_write_register(dev, counter->chip_index,
751                                devpriv->dma_configuration_soft_copies
752                                [counter->chip_index] |
753                                dma_reset_bit(mite_channel), DMAConfigRegister);
754         mmiowb();
755         spin_unlock_irqrestore(&devpriv->soft_reg_copy_lock, flags);
756 }
757
758 static inline void ni_660x_unset_dma_channel(struct comedi_device *dev,
759                                              unsigned mite_channel,
760                                              struct ni_gpct *counter)
761 {
762         struct ni_660x_private *devpriv = dev->private;
763         unsigned long flags;
764
765         spin_lock_irqsave(&devpriv->soft_reg_copy_lock, flags);
766         devpriv->dma_configuration_soft_copies[counter->chip_index] &=
767             ~dma_select_mask(mite_channel);
768         devpriv->dma_configuration_soft_copies[counter->chip_index] |=
769             dma_select_bits(mite_channel, dma_selection_none);
770         ni_660x_write_register(dev, counter->chip_index,
771                                devpriv->dma_configuration_soft_copies
772                                [counter->chip_index], DMAConfigRegister);
773         mmiowb();
774         spin_unlock_irqrestore(&devpriv->soft_reg_copy_lock, flags);
775 }
776
777 static int ni_660x_request_mite_channel(struct comedi_device *dev,
778                                         struct ni_gpct *counter,
779                                         enum comedi_io_direction direction)
780 {
781         struct ni_660x_private *devpriv = dev->private;
782         unsigned long flags;
783         struct mite_channel *mite_chan;
784
785         spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
786         BUG_ON(counter->mite_chan);
787         mite_chan = mite_request_channel(devpriv->mite,
788                                          mite_ring(devpriv, counter));
789         if (mite_chan == NULL) {
790                 spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
791                 comedi_error(dev,
792                              "failed to reserve mite dma channel for counter.");
793                 return -EBUSY;
794         }
795         mite_chan->dir = direction;
796         ni_tio_set_mite_channel(counter, mite_chan);
797         ni_660x_set_dma_channel(dev, mite_chan->channel, counter);
798         spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
799         return 0;
800 }
801
802 static void ni_660x_release_mite_channel(struct comedi_device *dev,
803                                          struct ni_gpct *counter)
804 {
805         struct ni_660x_private *devpriv = dev->private;
806         unsigned long flags;
807
808         spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
809         if (counter->mite_chan) {
810                 struct mite_channel *mite_chan = counter->mite_chan;
811
812                 ni_660x_unset_dma_channel(dev, mite_chan->channel, counter);
813                 ni_tio_set_mite_channel(counter, NULL);
814                 mite_release_channel(mite_chan);
815         }
816         spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
817 }
818
819 static int ni_660x_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
820 {
821         int retval;
822
823         struct ni_gpct *counter = subdev_to_counter(s);
824 /* const struct comedi_cmd *cmd = &s->async->cmd; */
825
826         retval = ni_660x_request_mite_channel(dev, counter, COMEDI_INPUT);
827         if (retval) {
828                 comedi_error(dev,
829                              "no dma channel available for use by counter");
830                 return retval;
831         }
832         ni_tio_acknowledge_and_confirm(counter, NULL, NULL, NULL, NULL);
833         retval = ni_tio_cmd(counter, s->async);
834
835         return retval;
836 }
837
838 static int ni_660x_cmdtest(struct comedi_device *dev,
839                            struct comedi_subdevice *s, struct comedi_cmd *cmd)
840 {
841         struct ni_gpct *counter = subdev_to_counter(s);
842
843         return ni_tio_cmdtest(counter, cmd);
844 }
845
846 static int ni_660x_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
847 {
848         struct ni_gpct *counter = subdev_to_counter(s);
849         int retval;
850
851         retval = ni_tio_cancel(counter);
852         ni_660x_release_mite_channel(dev, counter);
853         return retval;
854 }
855
856 static void set_tio_counterswap(struct comedi_device *dev, int chipset)
857 {
858         /* See P. 3.5 of the Register-Level Programming manual.  The
859            CounterSwap bit has to be set on the second chip, otherwise
860            it will try to use the same pins as the first chip.
861          */
862         if (chipset)
863                 ni_660x_write_register(dev, chipset, CounterSwap,
864                                        ClockConfigRegister);
865         else
866                 ni_660x_write_register(dev, chipset, 0, ClockConfigRegister);
867 }
868
869 static void ni_660x_handle_gpct_interrupt(struct comedi_device *dev,
870                                           struct comedi_subdevice *s)
871 {
872         ni_tio_handle_interrupt(subdev_to_counter(s), s);
873         if (s->async->events) {
874                 if (s->async->events & (COMEDI_CB_EOA | COMEDI_CB_ERROR |
875                                         COMEDI_CB_OVERFLOW)) {
876                         ni_660x_cancel(dev, s);
877                 }
878                 comedi_event(dev, s);
879         }
880 }
881
882 static irqreturn_t ni_660x_interrupt(int irq, void *d)
883 {
884         struct comedi_device *dev = d;
885         struct ni_660x_private *devpriv = dev->private;
886         struct comedi_subdevice *s;
887         unsigned i;
888         unsigned long flags;
889
890         if (!dev->attached)
891                 return IRQ_NONE;
892         /* lock to avoid race with comedi_poll */
893         spin_lock_irqsave(&devpriv->interrupt_lock, flags);
894         smp_mb();
895         for (i = 0; i < ni_660x_num_counters(dev); ++i) {
896                 s = &dev->subdevices[NI_660X_GPCT_SUBDEV(i)];
897                 ni_660x_handle_gpct_interrupt(dev, s);
898         }
899         spin_unlock_irqrestore(&devpriv->interrupt_lock, flags);
900         return IRQ_HANDLED;
901 }
902
903 static int ni_660x_input_poll(struct comedi_device *dev,
904                               struct comedi_subdevice *s)
905 {
906         struct ni_660x_private *devpriv = dev->private;
907         unsigned long flags;
908
909         /* lock to avoid race with comedi_poll */
910         spin_lock_irqsave(&devpriv->interrupt_lock, flags);
911         mite_sync_input_dma(subdev_to_counter(s)->mite_chan, s->async);
912         spin_unlock_irqrestore(&devpriv->interrupt_lock, flags);
913         return comedi_buf_read_n_available(s->async);
914 }
915
916 static int ni_660x_buf_change(struct comedi_device *dev,
917                               struct comedi_subdevice *s,
918                               unsigned long new_size)
919 {
920         struct ni_660x_private *devpriv = dev->private;
921         int ret;
922
923         ret = mite_buf_change(mite_ring(devpriv, subdev_to_counter(s)),
924                               s->async);
925         if (ret < 0)
926                 return ret;
927
928         return 0;
929 }
930
931 static int ni_660x_allocate_private(struct comedi_device *dev)
932 {
933         struct ni_660x_private *devpriv;
934         unsigned i;
935
936         devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
937         if (!devpriv)
938                 return -ENOMEM;
939         dev->private = devpriv;
940
941         spin_lock_init(&devpriv->mite_channel_lock);
942         spin_lock_init(&devpriv->interrupt_lock);
943         spin_lock_init(&devpriv->soft_reg_copy_lock);
944         for (i = 0; i < NUM_PFI_CHANNELS; ++i)
945                 devpriv->pfi_output_selects[i] = pfi_output_select_counter;
946
947         return 0;
948 }
949
950 static int ni_660x_alloc_mite_rings(struct comedi_device *dev)
951 {
952         const struct ni_660x_board *board = comedi_board(dev);
953         struct ni_660x_private *devpriv = dev->private;
954         unsigned i;
955         unsigned j;
956
957         for (i = 0; i < board->n_chips; ++i) {
958                 for (j = 0; j < counters_per_chip; ++j) {
959                         devpriv->mite_rings[i][j] =
960                             mite_alloc_ring(devpriv->mite);
961                         if (devpriv->mite_rings[i][j] == NULL)
962                                 return -ENOMEM;
963                 }
964         }
965         return 0;
966 }
967
968 static void ni_660x_free_mite_rings(struct comedi_device *dev)
969 {
970         const struct ni_660x_board *board = comedi_board(dev);
971         struct ni_660x_private *devpriv = dev->private;
972         unsigned i;
973         unsigned j;
974
975         for (i = 0; i < board->n_chips; ++i) {
976                 for (j = 0; j < counters_per_chip; ++j)
977                         mite_free_ring(devpriv->mite_rings[i][j]);
978         }
979 }
980
981 static int
982 ni_660x_GPCT_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
983                    struct comedi_insn *insn, unsigned int *data)
984 {
985         return ni_tio_rinsn(subdev_to_counter(s), insn, data);
986 }
987
988 static void init_tio_chip(struct comedi_device *dev, int chipset)
989 {
990         struct ni_660x_private *devpriv = dev->private;
991         unsigned i;
992
993         /*  init dma configuration register */
994         devpriv->dma_configuration_soft_copies[chipset] = 0;
995         for (i = 0; i < MAX_DMA_CHANNEL; ++i) {
996                 devpriv->dma_configuration_soft_copies[chipset] |=
997                     dma_select_bits(i, dma_selection_none) & dma_select_mask(i);
998         }
999         ni_660x_write_register(dev, chipset,
1000                                devpriv->dma_configuration_soft_copies[chipset],
1001                                DMAConfigRegister);
1002         for (i = 0; i < NUM_PFI_CHANNELS; ++i)
1003                 ni_660x_write_register(dev, chipset, 0, IOConfigReg(i));
1004 }
1005
1006 static int
1007 ni_660x_GPCT_insn_config(struct comedi_device *dev, struct comedi_subdevice *s,
1008                          struct comedi_insn *insn, unsigned int *data)
1009 {
1010         return ni_tio_insn_config(subdev_to_counter(s), insn, data);
1011 }
1012
1013 static int ni_660x_GPCT_winsn(struct comedi_device *dev,
1014                               struct comedi_subdevice *s,
1015                               struct comedi_insn *insn, unsigned int *data)
1016 {
1017         return ni_tio_winsn(subdev_to_counter(s), insn, data);
1018 }
1019
1020 static int ni_660x_dio_insn_bits(struct comedi_device *dev,
1021                                  struct comedi_subdevice *s,
1022                                  struct comedi_insn *insn, unsigned int *data)
1023 {
1024         unsigned base_bitfield_channel = CR_CHAN(insn->chanspec);
1025
1026         /*  Check if we have to write some bits */
1027         if (data[0]) {
1028                 s->state &= ~(data[0] << base_bitfield_channel);
1029                 s->state |= (data[0] & data[1]) << base_bitfield_channel;
1030                 /* Write out the new digital output lines */
1031                 ni_660x_write_register(dev, 0, s->state, DIO32Output);
1032         }
1033         /* on return, data[1] contains the value of the digital
1034          * input and output lines. */
1035         data[1] =
1036             (ni_660x_read_register(dev, 0,
1037                                    DIO32Input) >> base_bitfield_channel);
1038         return insn->n;
1039 }
1040
1041 static void ni_660x_select_pfi_output(struct comedi_device *dev,
1042                                       unsigned pfi_channel,
1043                                       unsigned output_select)
1044 {
1045         const struct ni_660x_board *board = comedi_board(dev);
1046         static const unsigned counter_4_7_first_pfi = 8;
1047         static const unsigned counter_4_7_last_pfi = 23;
1048         unsigned active_chipset = 0;
1049         unsigned idle_chipset = 0;
1050         unsigned active_bits;
1051         unsigned idle_bits;
1052
1053         if (board->n_chips > 1) {
1054                 if (output_select == pfi_output_select_counter &&
1055                     pfi_channel >= counter_4_7_first_pfi &&
1056                     pfi_channel <= counter_4_7_last_pfi) {
1057                         active_chipset = 1;
1058                         idle_chipset = 0;
1059                 } else {
1060                         active_chipset = 0;
1061                         idle_chipset = 1;
1062                 }
1063         }
1064
1065         if (idle_chipset != active_chipset) {
1066                 idle_bits =
1067                     ni_660x_read_register(dev, idle_chipset,
1068                                           IOConfigReg(pfi_channel));
1069                 idle_bits &= ~pfi_output_select_mask(pfi_channel);
1070                 idle_bits |=
1071                     pfi_output_select_bits(pfi_channel,
1072                                            pfi_output_select_high_Z);
1073                 ni_660x_write_register(dev, idle_chipset, idle_bits,
1074                                        IOConfigReg(pfi_channel));
1075         }
1076
1077         active_bits =
1078             ni_660x_read_register(dev, active_chipset,
1079                                   IOConfigReg(pfi_channel));
1080         active_bits &= ~pfi_output_select_mask(pfi_channel);
1081         active_bits |= pfi_output_select_bits(pfi_channel, output_select);
1082         ni_660x_write_register(dev, active_chipset, active_bits,
1083                                IOConfigReg(pfi_channel));
1084 }
1085
1086 static int ni_660x_set_pfi_routing(struct comedi_device *dev, unsigned chan,
1087                                    unsigned source)
1088 {
1089         struct ni_660x_private *devpriv = dev->private;
1090
1091         if (source > num_pfi_output_selects)
1092                 return -EINVAL;
1093         if (source == pfi_output_select_high_Z)
1094                 return -EINVAL;
1095         if (chan < min_counter_pfi_chan) {
1096                 if (source == pfi_output_select_counter)
1097                         return -EINVAL;
1098         } else if (chan > max_dio_pfi_chan) {
1099                 if (source == pfi_output_select_do)
1100                         return -EINVAL;
1101         }
1102
1103         devpriv->pfi_output_selects[chan] = source;
1104         if (devpriv->pfi_direction_bits & (((uint64_t) 1) << chan))
1105                 ni_660x_select_pfi_output(dev, chan,
1106                                           devpriv->pfi_output_selects[chan]);
1107         return 0;
1108 }
1109
1110 static int ni_660x_dio_insn_config(struct comedi_device *dev,
1111                                    struct comedi_subdevice *s,
1112                                    struct comedi_insn *insn,
1113                                    unsigned int *data)
1114 {
1115         struct ni_660x_private *devpriv = dev->private;
1116         unsigned int chan = CR_CHAN(insn->chanspec);
1117         uint64_t bit = 1ULL << chan;
1118         unsigned int val;
1119         int ret;
1120
1121         switch (data[0]) {
1122         case INSN_CONFIG_DIO_OUTPUT:
1123                 devpriv->pfi_direction_bits |= bit;
1124                 ni_660x_select_pfi_output(dev, chan,
1125                                           devpriv->pfi_output_selects[chan]);
1126                 break;
1127
1128         case INSN_CONFIG_DIO_INPUT:
1129                 devpriv->pfi_direction_bits &= ~bit;
1130                 ni_660x_select_pfi_output(dev, chan, pfi_output_select_high_Z);
1131                 break;
1132
1133         case INSN_CONFIG_DIO_QUERY:
1134                 data[1] = (devpriv->pfi_direction_bits & bit) ? COMEDI_OUTPUT
1135                                                               : COMEDI_INPUT;
1136                 break;
1137
1138         case INSN_CONFIG_SET_ROUTING:
1139                 ret = ni_660x_set_pfi_routing(dev, chan, data[1]);
1140                 if (ret)
1141                         return ret;
1142                 break;
1143
1144         case INSN_CONFIG_GET_ROUTING:
1145                 data[1] = devpriv->pfi_output_selects[chan];
1146                 break;
1147
1148         case INSN_CONFIG_FILTER:
1149                 val = ni_660x_read_register(dev, 0, IOConfigReg(chan));
1150                 val &= ~pfi_input_select_mask(chan);
1151                 val |= pfi_input_select_bits(chan, data[1]);
1152                 ni_660x_write_register(dev, 0, val, IOConfigReg(chan));
1153                 break;
1154
1155         default:
1156                 return -EINVAL;
1157         }
1158
1159         return insn->n;
1160 }
1161
1162 static int ni_660x_auto_attach(struct comedi_device *dev,
1163                                unsigned long context)
1164 {
1165         struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1166         const struct ni_660x_board *board = NULL;
1167         struct ni_660x_private *devpriv;
1168         struct comedi_subdevice *s;
1169         int ret;
1170         unsigned i;
1171         unsigned global_interrupt_config_bits;
1172
1173         if (context < ARRAY_SIZE(ni_660x_boards))
1174                 board = &ni_660x_boards[context];
1175         if (!board)
1176                 return -ENODEV;
1177         dev->board_ptr = board;
1178         dev->board_name = board->name;
1179
1180         ret = comedi_pci_enable(dev);
1181         if (ret)
1182                 return ret;
1183
1184         ret = ni_660x_allocate_private(dev);
1185         if (ret < 0)
1186                 return ret;
1187         devpriv = dev->private;
1188
1189         devpriv->mite = mite_alloc(pcidev);
1190         if (!devpriv->mite)
1191                 return -ENOMEM;
1192
1193         ret = mite_setup2(devpriv->mite, 1);
1194         if (ret < 0) {
1195                 dev_warn(dev->class_dev, "error setting up mite\n");
1196                 return ret;
1197         }
1198
1199         ret = ni_660x_alloc_mite_rings(dev);
1200         if (ret < 0)
1201                 return ret;
1202
1203         ret = comedi_alloc_subdevices(dev, 2 + NI_660X_MAX_NUM_COUNTERS);
1204         if (ret)
1205                 return ret;
1206
1207         s = &dev->subdevices[0];
1208         /* Old GENERAL-PURPOSE COUNTER/TIME (GPCT) subdevice, no longer used */
1209         s->type = COMEDI_SUBD_UNUSED;
1210
1211         s = &dev->subdevices[NI_660X_DIO_SUBDEV];
1212         /* DIGITAL I/O SUBDEVICE */
1213         s->type = COMEDI_SUBD_DIO;
1214         s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
1215         s->n_chan = NUM_PFI_CHANNELS;
1216         s->maxdata = 1;
1217         s->range_table = &range_digital;
1218         s->insn_bits = ni_660x_dio_insn_bits;
1219         s->insn_config = ni_660x_dio_insn_config;
1220         s->io_bits = 0;         /* all bits default to input */
1221         /*  we use the ioconfig registers to control dio direction, so zero
1222         output enables in stc dio control reg */
1223         ni_660x_write_register(dev, 0, 0, STCDIOControl);
1224
1225         devpriv->counter_dev = ni_gpct_device_construct(dev,
1226                                                      &ni_gpct_write_register,
1227                                                      &ni_gpct_read_register,
1228                                                      ni_gpct_variant_660x,
1229                                                      ni_660x_num_counters
1230                                                      (dev));
1231         if (devpriv->counter_dev == NULL)
1232                 return -ENOMEM;
1233         for (i = 0; i < NI_660X_MAX_NUM_COUNTERS; ++i) {
1234                 s = &dev->subdevices[NI_660X_GPCT_SUBDEV(i)];
1235                 if (i < ni_660x_num_counters(dev)) {
1236                         s->type = COMEDI_SUBD_COUNTER;
1237                         s->subdev_flags =
1238                             SDF_READABLE | SDF_WRITABLE | SDF_LSAMPL |
1239                             SDF_CMD_READ /* | SDF_CMD_WRITE */ ;
1240                         s->n_chan = 3;
1241                         s->maxdata = 0xffffffff;
1242                         s->insn_read = ni_660x_GPCT_rinsn;
1243                         s->insn_write = ni_660x_GPCT_winsn;
1244                         s->insn_config = ni_660x_GPCT_insn_config;
1245                         s->do_cmd = &ni_660x_cmd;
1246                         s->len_chanlist = 1;
1247                         s->do_cmdtest = &ni_660x_cmdtest;
1248                         s->cancel = &ni_660x_cancel;
1249                         s->poll = &ni_660x_input_poll;
1250                         s->async_dma_dir = DMA_BIDIRECTIONAL;
1251                         s->buf_change = &ni_660x_buf_change;
1252                         s->private = &devpriv->counter_dev->counters[i];
1253
1254                         devpriv->counter_dev->counters[i].chip_index =
1255                             i / counters_per_chip;
1256                         devpriv->counter_dev->counters[i].counter_index =
1257                             i % counters_per_chip;
1258                 } else {
1259                         s->type = COMEDI_SUBD_UNUSED;
1260                 }
1261         }
1262         for (i = 0; i < board->n_chips; ++i)
1263                 init_tio_chip(dev, i);
1264
1265         for (i = 0; i < ni_660x_num_counters(dev); ++i)
1266                 ni_tio_init_counter(&devpriv->counter_dev->counters[i]);
1267
1268         for (i = 0; i < NUM_PFI_CHANNELS; ++i) {
1269                 if (i < min_counter_pfi_chan)
1270                         ni_660x_set_pfi_routing(dev, i, pfi_output_select_do);
1271                 else
1272                         ni_660x_set_pfi_routing(dev, i,
1273                                                 pfi_output_select_counter);
1274                 ni_660x_select_pfi_output(dev, i, pfi_output_select_high_Z);
1275         }
1276         /* to be safe, set counterswap bits on tio chips after all the counter
1277            outputs have been set to high impedance mode */
1278         for (i = 0; i < board->n_chips; ++i)
1279                 set_tio_counterswap(dev, i);
1280
1281         ret = request_irq(mite_irq(devpriv->mite), ni_660x_interrupt,
1282                           IRQF_SHARED, "ni_660x", dev);
1283         if (ret < 0) {
1284                 dev_warn(dev->class_dev, " irq not available\n");
1285                 return ret;
1286         }
1287         dev->irq = mite_irq(devpriv->mite);
1288         global_interrupt_config_bits = Global_Int_Enable_Bit;
1289         if (board->n_chips > 1)
1290                 global_interrupt_config_bits |= Cascade_Int_Enable_Bit;
1291         ni_660x_write_register(dev, 0, global_interrupt_config_bits,
1292                                GlobalInterruptConfigRegister);
1293         dev_info(dev->class_dev, "ni_660x: %s attached\n", dev->board_name);
1294         return 0;
1295 }
1296
1297 static void ni_660x_detach(struct comedi_device *dev)
1298 {
1299         struct ni_660x_private *devpriv = dev->private;
1300
1301         if (dev->irq)
1302                 free_irq(dev->irq, dev);
1303         if (devpriv) {
1304                 if (devpriv->counter_dev)
1305                         ni_gpct_device_destroy(devpriv->counter_dev);
1306                 if (devpriv->mite) {
1307                         ni_660x_free_mite_rings(dev);
1308                         mite_unsetup(devpriv->mite);
1309                         mite_free(devpriv->mite);
1310                 }
1311         }
1312         comedi_pci_disable(dev);
1313 }
1314
1315 static struct comedi_driver ni_660x_driver = {
1316         .driver_name    = "ni_660x",
1317         .module         = THIS_MODULE,
1318         .auto_attach    = ni_660x_auto_attach,
1319         .detach         = ni_660x_detach,
1320 };
1321
1322 static int ni_660x_pci_probe(struct pci_dev *dev,
1323                              const struct pci_device_id *id)
1324 {
1325         return comedi_pci_auto_config(dev, &ni_660x_driver, id->driver_data);
1326 }
1327
1328 static DEFINE_PCI_DEVICE_TABLE(ni_660x_pci_table) = {
1329         { PCI_VDEVICE(NI, 0x1310), BOARD_PCI6602 },
1330         { PCI_VDEVICE(NI, 0x1360), BOARD_PXI6602 },
1331         { PCI_VDEVICE(NI, 0x2c60), BOARD_PCI6601 },
1332         { PCI_VDEVICE(NI, 0x2cc0), BOARD_PXI6608 },
1333         { PCI_VDEVICE(NI, 0x1e40), BOARD_PXI6624 },
1334         { 0 }
1335 };
1336 MODULE_DEVICE_TABLE(pci, ni_660x_pci_table);
1337
1338 static struct pci_driver ni_660x_pci_driver = {
1339         .name           = "ni_660x",
1340         .id_table       = ni_660x_pci_table,
1341         .probe          = ni_660x_pci_probe,
1342         .remove         = comedi_pci_auto_unconfig,
1343 };
1344 module_comedi_pci_driver(ni_660x_driver, ni_660x_pci_driver);
1345
1346 MODULE_AUTHOR("Comedi http://www.comedi.org");
1347 MODULE_DESCRIPTION("Comedi low-level driver");
1348 MODULE_LICENSE("GPL");