2 * Support for NI general purpose counters
4 * Copyright (C) 2006 Frank Mori Hess <fmhess@users.sourceforge.net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
19 * Description: National Instruments general purpose counters
20 * Author: J.P. Mellor <jpmellor@rose-hulman.edu>,
21 * Herman.Bruyninckx@mech.kuleuven.ac.be,
22 * Wim.Meeussen@mech.kuleuven.ac.be,
23 * Klaas.Gadeyne@mech.kuleuven.ac.be,
24 * Frank Mori Hess <fmhess@users.sourceforge.net>
25 * Updated: Thu Nov 16 09:50:32 EST 2006
28 * This module is not used directly by end-users. Rather, it
29 * is used by other drivers (for example ni_660x and ni_pcimio)
30 * to provide support for NI's general purpose counters. It was
31 * originally based on the counter code from ni_660x.c and
35 * DAQ 660x Register-Level Programmer Manual (NI 370505A-01)
36 * DAQ 6601/6602 User Manual (NI 322137B-01)
37 * 340934b.pdf DAQ-STC reference manual
39 * TODO: Support use of both banks X and Y
42 #include <linux/module.h>
43 #include <linux/slab.h>
45 #include "ni_tio_internal.h"
48 * clock sources for ni e and m series boards,
49 * get bits with GI_SRC_SEL()
51 #define NI_M_TIMEBASE_1_CLK 0x0 /* 20MHz */
52 #define NI_M_PFI_CLK(x) (((x) < 10) ? (1 + (x)) : (0xb + (x)))
53 #define NI_M_RTSI_CLK(x) (((x) == 7) ? 0x1b : (0xb + (x)))
54 #define NI_M_TIMEBASE_2_CLK 0x12 /* 100KHz */
55 #define NI_M_NEXT_TC_CLK 0x13
56 #define NI_M_NEXT_GATE_CLK 0x14 /* Gi_Src_SubSelect=0 */
57 #define NI_M_PXI_STAR_TRIGGER_CLK 0x14 /* Gi_Src_SubSelect=1 */
58 #define NI_M_PXI10_CLK 0x1d
59 #define NI_M_TIMEBASE_3_CLK 0x1e /* 80MHz, Gi_Src_SubSelect=0 */
60 #define NI_M_ANALOG_TRIGGER_OUT_CLK 0x1e /* Gi_Src_SubSelect=1 */
61 #define NI_M_LOGIC_LOW_CLK 0x1f
62 #define NI_M_MAX_PFI_CHAN 15
63 #define NI_M_MAX_RTSI_CHAN 7
66 * clock sources for ni_660x boards,
67 * get bits with GI_SRC_SEL()
69 #define NI_660X_TIMEBASE_1_CLK 0x0 /* 20MHz */
70 #define NI_660X_SRC_PIN_I_CLK 0x1
71 #define NI_660X_SRC_PIN_CLK(x) (0x2 + (x))
72 #define NI_660X_NEXT_GATE_CLK 0xa
73 #define NI_660X_RTSI_CLK(x) (0xb + (x))
74 #define NI_660X_TIMEBASE_2_CLK 0x12 /* 100KHz */
75 #define NI_660X_NEXT_TC_CLK 0x13
76 #define NI_660X_TIMEBASE_3_CLK 0x1e /* 80MHz */
77 #define NI_660X_LOGIC_LOW_CLK 0x1f
78 #define NI_660X_MAX_SRC_PIN 7
79 #define NI_660X_MAX_RTSI_CHAN 6
81 /* ni m series gate_select */
82 #define NI_M_TIMESTAMP_MUX_GATE_SEL 0x0
83 #define NI_M_PFI_GATE_SEL(x) (((x) < 10) ? (1 + (x)) : (0xb + (x)))
84 #define NI_M_RTSI_GATE_SEL(x) (((x) == 7) ? 0x1b : (0xb + (x)))
85 #define NI_M_AI_START2_GATE_SEL 0x12
86 #define NI_M_PXI_STAR_TRIGGER_GATE_SEL 0x13
87 #define NI_M_NEXT_OUT_GATE_SEL 0x14
88 #define NI_M_AI_START1_GATE_SEL 0x1c
89 #define NI_M_NEXT_SRC_GATE_SEL 0x1d
90 #define NI_M_ANALOG_TRIG_OUT_GATE_SEL 0x1e
91 #define NI_M_LOGIC_LOW_GATE_SEL 0x1f
93 /* ni_660x gate select */
94 #define NI_660X_SRC_PIN_I_GATE_SEL 0x0
95 #define NI_660X_GATE_PIN_I_GATE_SEL 0x1
96 #define NI_660X_PIN_GATE_SEL(x) (0x2 + (x))
97 #define NI_660X_NEXT_SRC_GATE_SEL 0xa
98 #define NI_660X_RTSI_GATE_SEL(x) (0xb + (x))
99 #define NI_660X_NEXT_OUT_GATE_SEL 0x14
100 #define NI_660X_LOGIC_LOW_GATE_SEL 0x1f
101 #define NI_660X_MAX_GATE_PIN 7
103 /* ni_660x second gate select */
104 #define NI_660X_SRC_PIN_I_GATE2_SEL 0x0
105 #define NI_660X_UD_PIN_I_GATE2_SEL 0x1
106 #define NI_660X_UD_PIN_GATE2_SEL(x) (0x2 + (x))
107 #define NI_660X_NEXT_SRC_GATE2_SEL 0xa
108 #define NI_660X_RTSI_GATE2_SEL(x) (0xb + (x))
109 #define NI_660X_NEXT_OUT_GATE2_SEL 0x14
110 #define NI_660X_SELECTED_GATE2_SEL 0x1e
111 #define NI_660X_LOGIC_LOW_GATE2_SEL 0x1f
112 #define NI_660X_MAX_UP_DOWN_PIN 7
114 static inline unsigned int GI_PRESCALE_X2(enum ni_gpct_variant variant)
117 case ni_gpct_variant_e_series:
120 case ni_gpct_variant_m_series:
121 return GI_M_PRESCALE_X2;
122 case ni_gpct_variant_660x:
123 return GI_660X_PRESCALE_X2;
127 static inline unsigned int GI_PRESCALE_X8(enum ni_gpct_variant variant)
130 case ni_gpct_variant_e_series:
133 case ni_gpct_variant_m_series:
134 return GI_M_PRESCALE_X8;
135 case ni_gpct_variant_660x:
136 return GI_660X_PRESCALE_X8;
140 static bool ni_tio_has_gate2_registers(const struct ni_gpct_device *counter_dev)
142 switch (counter_dev->variant) {
143 case ni_gpct_variant_e_series:
146 case ni_gpct_variant_m_series:
147 case ni_gpct_variant_660x:
153 * ni_tio_write() - Write a TIO register using the driver provided callback.
154 * @counter: struct ni_gpct counter.
155 * @value: the value to write
156 * @reg: the register to write.
158 void ni_tio_write(struct ni_gpct *counter, unsigned int value,
159 enum ni_gpct_register reg)
161 if (reg < NITIO_NUM_REGS)
162 counter->counter_dev->write(counter, value, reg);
164 EXPORT_SYMBOL_GPL(ni_tio_write);
167 * ni_tio_read() - Read a TIO register using the driver provided callback.
168 * @counter: struct ni_gpct counter.
169 * @reg: the register to read.
171 unsigned int ni_tio_read(struct ni_gpct *counter, enum ni_gpct_register reg)
173 if (reg < NITIO_NUM_REGS)
174 return counter->counter_dev->read(counter, reg);
177 EXPORT_SYMBOL_GPL(ni_tio_read);
179 static void ni_tio_reset_count_and_disarm(struct ni_gpct *counter)
181 unsigned int cidx = counter->counter_index;
183 ni_tio_write(counter, GI_RESET(cidx), NITIO_RESET_REG(cidx));
186 static int ni_tio_clock_period_ps(const struct ni_gpct *counter,
187 unsigned int generic_clock_source,
192 switch (generic_clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK) {
193 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
194 clock_period_ps = 50000;
196 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
197 clock_period_ps = 10000000;
199 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
200 clock_period_ps = 12500;
202 case NI_GPCT_PXI10_CLOCK_SRC_BITS:
203 clock_period_ps = 100000;
207 * clock period is specified by user with prescaling
208 * already taken into account.
210 *period_ps = counter->clock_period_ps;
214 switch (generic_clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK) {
215 case NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS:
217 case NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS:
218 clock_period_ps *= 2;
220 case NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS:
221 clock_period_ps *= 8;
226 *period_ps = clock_period_ps;
230 static void ni_tio_set_bits_transient(struct ni_gpct *counter,
231 enum ni_gpct_register reg,
232 unsigned int mask, unsigned int value,
233 unsigned int transient)
235 struct ni_gpct_device *counter_dev = counter->counter_dev;
238 if (reg < NITIO_NUM_REGS) {
239 spin_lock_irqsave(&counter_dev->regs_lock, flags);
240 counter_dev->regs[reg] &= ~mask;
241 counter_dev->regs[reg] |= (value & mask);
242 ni_tio_write(counter, counter_dev->regs[reg] | transient, reg);
244 spin_unlock_irqrestore(&counter_dev->regs_lock, flags);
249 * ni_tio_set_bits() - Safely write a counter register.
250 * @counter: struct ni_gpct counter.
251 * @reg: the register to write.
252 * @mask: the bits to change.
253 * @value: the new bits value.
255 * Used to write to, and update the software copy, a register whose bits may
256 * be twiddled in interrupt context, or whose software copy may be read in
259 void ni_tio_set_bits(struct ni_gpct *counter, enum ni_gpct_register reg,
260 unsigned int mask, unsigned int value)
262 ni_tio_set_bits_transient(counter, reg, mask, value, 0x0);
264 EXPORT_SYMBOL_GPL(ni_tio_set_bits);
267 * ni_tio_get_soft_copy() - Safely read the software copy of a counter register.
268 * @counter: struct ni_gpct counter.
269 * @reg: the register to read.
271 * Used to get the software copy of a register whose bits might be modified
272 * in interrupt context, or whose software copy might need to be read in
275 unsigned int ni_tio_get_soft_copy(const struct ni_gpct *counter,
276 enum ni_gpct_register reg)
278 struct ni_gpct_device *counter_dev = counter->counter_dev;
279 unsigned int value = 0;
282 if (reg < NITIO_NUM_REGS) {
283 spin_lock_irqsave(&counter_dev->regs_lock, flags);
284 value = counter_dev->regs[reg];
285 spin_unlock_irqrestore(&counter_dev->regs_lock, flags);
289 EXPORT_SYMBOL_GPL(ni_tio_get_soft_copy);
291 static unsigned int ni_tio_clock_src_modifiers(const struct ni_gpct *counter)
293 struct ni_gpct_device *counter_dev = counter->counter_dev;
294 unsigned int cidx = counter->counter_index;
295 unsigned int counting_mode_bits =
296 ni_tio_get_soft_copy(counter, NITIO_CNT_MODE_REG(cidx));
297 unsigned int bits = 0;
299 if (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
301 bits |= NI_GPCT_INVERT_CLOCK_SRC_BIT;
302 if (counting_mode_bits & GI_PRESCALE_X2(counter_dev->variant))
303 bits |= NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS;
304 if (counting_mode_bits & GI_PRESCALE_X8(counter_dev->variant))
305 bits |= NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS;
309 static int ni_m_series_clock_src_select(const struct ni_gpct *counter,
310 unsigned int *clk_src)
312 struct ni_gpct_device *counter_dev = counter->counter_dev;
313 unsigned int cidx = counter->counter_index;
314 unsigned int second_gate_reg = NITIO_GATE2_REG(cidx);
315 unsigned int clock_source = 0;
319 src = GI_BITS_TO_SRC(ni_tio_get_soft_copy(counter,
320 NITIO_INPUT_SEL_REG(cidx)));
323 case NI_M_TIMEBASE_1_CLK:
324 clock_source = NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS;
326 case NI_M_TIMEBASE_2_CLK:
327 clock_source = NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS;
329 case NI_M_TIMEBASE_3_CLK:
330 if (counter_dev->regs[second_gate_reg] & GI_SRC_SUBSEL)
332 NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS;
334 clock_source = NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS;
336 case NI_M_LOGIC_LOW_CLK:
337 clock_source = NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS;
339 case NI_M_NEXT_GATE_CLK:
340 if (counter_dev->regs[second_gate_reg] & GI_SRC_SUBSEL)
341 clock_source = NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS;
343 clock_source = NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS;
346 clock_source = NI_GPCT_PXI10_CLOCK_SRC_BITS;
348 case NI_M_NEXT_TC_CLK:
349 clock_source = NI_GPCT_NEXT_TC_CLOCK_SRC_BITS;
352 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
353 if (src == NI_M_RTSI_CLK(i)) {
354 clock_source = NI_GPCT_RTSI_CLOCK_SRC_BITS(i);
358 if (i <= NI_M_MAX_RTSI_CHAN)
360 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
361 if (src == NI_M_PFI_CLK(i)) {
362 clock_source = NI_GPCT_PFI_CLOCK_SRC_BITS(i);
366 if (i <= NI_M_MAX_PFI_CHAN)
370 clock_source |= ni_tio_clock_src_modifiers(counter);
371 *clk_src = clock_source;
375 static int ni_660x_clock_src_select(const struct ni_gpct *counter,
376 unsigned int *clk_src)
378 unsigned int clock_source = 0;
379 unsigned int cidx = counter->counter_index;
383 src = GI_BITS_TO_SRC(ni_tio_get_soft_copy(counter,
384 NITIO_INPUT_SEL_REG(cidx)));
387 case NI_660X_TIMEBASE_1_CLK:
388 clock_source = NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS;
390 case NI_660X_TIMEBASE_2_CLK:
391 clock_source = NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS;
393 case NI_660X_TIMEBASE_3_CLK:
394 clock_source = NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS;
396 case NI_660X_LOGIC_LOW_CLK:
397 clock_source = NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS;
399 case NI_660X_SRC_PIN_I_CLK:
400 clock_source = NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS;
402 case NI_660X_NEXT_GATE_CLK:
403 clock_source = NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS;
405 case NI_660X_NEXT_TC_CLK:
406 clock_source = NI_GPCT_NEXT_TC_CLOCK_SRC_BITS;
409 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
410 if (src == NI_660X_RTSI_CLK(i)) {
411 clock_source = NI_GPCT_RTSI_CLOCK_SRC_BITS(i);
415 if (i <= NI_660X_MAX_RTSI_CHAN)
417 for (i = 0; i <= NI_660X_MAX_SRC_PIN; ++i) {
418 if (src == NI_660X_SRC_PIN_CLK(i)) {
420 NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(i);
424 if (i <= NI_660X_MAX_SRC_PIN)
428 clock_source |= ni_tio_clock_src_modifiers(counter);
429 *clk_src = clock_source;
433 static int ni_tio_generic_clock_src_select(const struct ni_gpct *counter,
434 unsigned int *clk_src)
436 switch (counter->counter_dev->variant) {
437 case ni_gpct_variant_e_series:
438 case ni_gpct_variant_m_series:
440 return ni_m_series_clock_src_select(counter, clk_src);
441 case ni_gpct_variant_660x:
442 return ni_660x_clock_src_select(counter, clk_src);
446 static void ni_tio_set_sync_mode(struct ni_gpct *counter)
448 struct ni_gpct_device *counter_dev = counter->counter_dev;
449 unsigned int cidx = counter->counter_index;
450 static const u64 min_normal_sync_period_ps = 25000;
451 unsigned int mask = 0;
452 unsigned int bits = 0;
455 unsigned int clk_src = 0;
460 /* only m series and 660x variants have counting mode registers */
461 switch (counter_dev->variant) {
462 case ni_gpct_variant_e_series:
465 case ni_gpct_variant_m_series:
466 mask = GI_M_ALT_SYNC;
468 case ni_gpct_variant_660x:
469 mask = GI_660X_ALT_SYNC;
473 reg = NITIO_CNT_MODE_REG(cidx);
474 mode = ni_tio_get_soft_copy(counter, reg);
475 switch (mode & GI_CNT_MODE_MASK) {
476 case GI_CNT_MODE_QUADX1:
477 case GI_CNT_MODE_QUADX2:
478 case GI_CNT_MODE_QUADX4:
479 case GI_CNT_MODE_SYNC_SRC:
480 force_alt_sync = true;
483 force_alt_sync = false;
487 ret = ni_tio_generic_clock_src_select(counter, &clk_src);
490 ret = ni_tio_clock_period_ps(counter, clk_src, &ps);
494 * It's not clear what we should do if clock_period is unknown, so we
495 * are not using the alt sync bit in that case.
497 if (force_alt_sync || (ps && ps < min_normal_sync_period_ps))
500 ni_tio_set_bits(counter, reg, mask, bits);
503 static int ni_tio_set_counter_mode(struct ni_gpct *counter, unsigned int mode)
505 struct ni_gpct_device *counter_dev = counter->counter_dev;
506 unsigned int cidx = counter->counter_index;
507 unsigned int mode_reg_mask;
508 unsigned int mode_reg_values;
509 unsigned int input_select_bits = 0;
510 /* these bits map directly on to the mode register */
511 static const unsigned int mode_reg_direct_mask =
512 NI_GPCT_GATE_ON_BOTH_EDGES_BIT | NI_GPCT_EDGE_GATE_MODE_MASK |
513 NI_GPCT_STOP_MODE_MASK | NI_GPCT_OUTPUT_MODE_MASK |
514 NI_GPCT_HARDWARE_DISARM_MASK | NI_GPCT_LOADING_ON_TC_BIT |
515 NI_GPCT_LOADING_ON_GATE_BIT | NI_GPCT_LOAD_B_SELECT_BIT;
517 mode_reg_mask = mode_reg_direct_mask | GI_RELOAD_SRC_SWITCHING;
518 mode_reg_values = mode & mode_reg_direct_mask;
519 switch (mode & NI_GPCT_RELOAD_SOURCE_MASK) {
520 case NI_GPCT_RELOAD_SOURCE_FIXED_BITS:
522 case NI_GPCT_RELOAD_SOURCE_SWITCHING_BITS:
523 mode_reg_values |= GI_RELOAD_SRC_SWITCHING;
525 case NI_GPCT_RELOAD_SOURCE_GATE_SELECT_BITS:
526 input_select_bits |= GI_GATE_SEL_LOAD_SRC;
527 mode_reg_mask |= GI_GATING_MODE_MASK;
528 mode_reg_values |= GI_LEVEL_GATING;
533 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
534 mode_reg_mask, mode_reg_values);
536 if (ni_tio_counting_mode_registers_present(counter_dev)) {
537 unsigned int bits = 0;
539 bits |= GI_CNT_MODE(mode >> NI_GPCT_COUNTING_MODE_SHIFT);
540 bits |= GI_INDEX_PHASE((mode >> NI_GPCT_INDEX_PHASE_BITSHIFT));
541 if (mode & NI_GPCT_INDEX_ENABLE_BIT)
542 bits |= GI_INDEX_MODE;
543 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
544 GI_CNT_MODE_MASK | GI_INDEX_PHASE_MASK |
545 GI_INDEX_MODE, bits);
546 ni_tio_set_sync_mode(counter);
549 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx), GI_CNT_DIR_MASK,
550 GI_CNT_DIR(mode >> NI_GPCT_COUNTING_DIRECTION_SHIFT));
552 if (mode & NI_GPCT_OR_GATE_BIT)
553 input_select_bits |= GI_OR_GATE;
554 if (mode & NI_GPCT_INVERT_OUTPUT_BIT)
555 input_select_bits |= GI_OUTPUT_POL_INVERT;
556 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
557 GI_GATE_SEL_LOAD_SRC | GI_OR_GATE |
558 GI_OUTPUT_POL_INVERT, input_select_bits);
563 int ni_tio_arm(struct ni_gpct *counter, bool arm, unsigned int start_trigger)
565 struct ni_gpct_device *counter_dev = counter->counter_dev;
566 unsigned int cidx = counter->counter_index;
567 unsigned int transient_bits = 0;
570 unsigned int mask = 0;
571 unsigned int bits = 0;
573 /* only m series and 660x have counting mode registers */
574 switch (counter_dev->variant) {
575 case ni_gpct_variant_e_series:
578 case ni_gpct_variant_m_series:
579 mask = GI_M_HW_ARM_SEL_MASK;
581 case ni_gpct_variant_660x:
582 mask = GI_660X_HW_ARM_SEL_MASK;
586 switch (start_trigger) {
587 case NI_GPCT_ARM_IMMEDIATE:
588 transient_bits |= GI_ARM;
590 case NI_GPCT_ARM_PAIRED_IMMEDIATE:
591 transient_bits |= GI_ARM | GI_ARM_COPY;
595 * for m series and 660x, pass-through the least
596 * significant bits so we can figure out what select
599 if (mask && (start_trigger & NI_GPCT_ARM_UNKNOWN)) {
600 bits |= GI_HW_ARM_ENA |
601 (GI_HW_ARM_SEL(start_trigger) & mask);
609 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
610 GI_HW_ARM_ENA | mask, bits);
612 transient_bits |= GI_DISARM;
614 ni_tio_set_bits_transient(counter, NITIO_CMD_REG(cidx),
615 0, 0, transient_bits);
618 EXPORT_SYMBOL_GPL(ni_tio_arm);
620 static int ni_660x_clk_src(unsigned int clock_source, unsigned int *bits)
622 unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
623 unsigned int ni_660x_clock;
627 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
628 ni_660x_clock = NI_660X_TIMEBASE_1_CLK;
630 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
631 ni_660x_clock = NI_660X_TIMEBASE_2_CLK;
633 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
634 ni_660x_clock = NI_660X_TIMEBASE_3_CLK;
636 case NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS:
637 ni_660x_clock = NI_660X_LOGIC_LOW_CLK;
639 case NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS:
640 ni_660x_clock = NI_660X_SRC_PIN_I_CLK;
642 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
643 ni_660x_clock = NI_660X_NEXT_GATE_CLK;
645 case NI_GPCT_NEXT_TC_CLOCK_SRC_BITS:
646 ni_660x_clock = NI_660X_NEXT_TC_CLK;
649 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
650 if (clk_src == NI_GPCT_RTSI_CLOCK_SRC_BITS(i)) {
651 ni_660x_clock = NI_660X_RTSI_CLK(i);
655 if (i <= NI_660X_MAX_RTSI_CHAN)
657 for (i = 0; i <= NI_660X_MAX_SRC_PIN; ++i) {
658 if (clk_src == NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(i)) {
659 ni_660x_clock = NI_660X_SRC_PIN_CLK(i);
663 if (i <= NI_660X_MAX_SRC_PIN)
667 *bits = GI_SRC_SEL(ni_660x_clock);
671 static int ni_m_clk_src(unsigned int clock_source, unsigned int *bits)
673 unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
674 unsigned int ni_m_series_clock;
678 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
679 ni_m_series_clock = NI_M_TIMEBASE_1_CLK;
681 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
682 ni_m_series_clock = NI_M_TIMEBASE_2_CLK;
684 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
685 ni_m_series_clock = NI_M_TIMEBASE_3_CLK;
687 case NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS:
688 ni_m_series_clock = NI_M_LOGIC_LOW_CLK;
690 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
691 ni_m_series_clock = NI_M_NEXT_GATE_CLK;
693 case NI_GPCT_NEXT_TC_CLOCK_SRC_BITS:
694 ni_m_series_clock = NI_M_NEXT_TC_CLK;
696 case NI_GPCT_PXI10_CLOCK_SRC_BITS:
697 ni_m_series_clock = NI_M_PXI10_CLK;
699 case NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS:
700 ni_m_series_clock = NI_M_PXI_STAR_TRIGGER_CLK;
702 case NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS:
703 ni_m_series_clock = NI_M_ANALOG_TRIGGER_OUT_CLK;
706 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
707 if (clk_src == NI_GPCT_RTSI_CLOCK_SRC_BITS(i)) {
708 ni_m_series_clock = NI_M_RTSI_CLK(i);
712 if (i <= NI_M_MAX_RTSI_CHAN)
714 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
715 if (clk_src == NI_GPCT_PFI_CLOCK_SRC_BITS(i)) {
716 ni_m_series_clock = NI_M_PFI_CLK(i);
720 if (i <= NI_M_MAX_PFI_CHAN)
724 *bits = GI_SRC_SEL(ni_m_series_clock);
728 static void ni_tio_set_source_subselect(struct ni_gpct *counter,
729 unsigned int clock_source)
731 struct ni_gpct_device *counter_dev = counter->counter_dev;
732 unsigned int cidx = counter->counter_index;
733 unsigned int second_gate_reg = NITIO_GATE2_REG(cidx);
735 if (counter_dev->variant != ni_gpct_variant_m_series)
737 switch (clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK) {
738 /* Gi_Source_Subselect is zero */
739 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
740 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
741 counter_dev->regs[second_gate_reg] &= ~GI_SRC_SUBSEL;
743 /* Gi_Source_Subselect is one */
744 case NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS:
745 case NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS:
746 counter_dev->regs[second_gate_reg] |= GI_SRC_SUBSEL;
748 /* Gi_Source_Subselect doesn't matter */
752 ni_tio_write(counter, counter_dev->regs[second_gate_reg],
756 static int ni_tio_set_clock_src(struct ni_gpct *counter,
757 unsigned int clock_source,
758 unsigned int period_ns)
760 struct ni_gpct_device *counter_dev = counter->counter_dev;
761 unsigned int cidx = counter->counter_index;
762 unsigned int bits = 0;
765 switch (counter_dev->variant) {
766 case ni_gpct_variant_660x:
767 ret = ni_660x_clk_src(clock_source, &bits);
769 case ni_gpct_variant_e_series:
770 case ni_gpct_variant_m_series:
772 ret = ni_m_clk_src(clock_source, &bits);
776 struct comedi_device *dev = counter_dev->dev;
778 dev_err(dev->class_dev, "invalid clock source 0x%x\n",
783 if (clock_source & NI_GPCT_INVERT_CLOCK_SRC_BIT)
784 bits |= GI_SRC_POL_INVERT;
785 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
786 GI_SRC_SEL_MASK | GI_SRC_POL_INVERT, bits);
787 ni_tio_set_source_subselect(counter, clock_source);
789 if (ni_tio_counting_mode_registers_present(counter_dev)) {
791 switch (clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK) {
792 case NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS:
794 case NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS:
795 bits |= GI_PRESCALE_X2(counter_dev->variant);
797 case NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS:
798 bits |= GI_PRESCALE_X8(counter_dev->variant);
803 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
804 GI_PRESCALE_X2(counter_dev->variant) |
805 GI_PRESCALE_X8(counter_dev->variant), bits);
807 counter->clock_period_ps = period_ns * 1000;
808 ni_tio_set_sync_mode(counter);
812 static int ni_tio_get_clock_src(struct ni_gpct *counter,
813 unsigned int *clock_source,
814 unsigned int *period_ns)
819 ret = ni_tio_generic_clock_src_select(counter, clock_source);
822 ret = ni_tio_clock_period_ps(counter, *clock_source, &temp64);
825 do_div(temp64, 1000); /* ps to ns */
830 static int ni_660x_set_gate(struct ni_gpct *counter, unsigned int gate_source)
832 unsigned int chan = CR_CHAN(gate_source);
833 unsigned int cidx = counter->counter_index;
834 unsigned int gate_sel;
838 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
839 gate_sel = NI_660X_NEXT_SRC_GATE_SEL;
841 case NI_GPCT_NEXT_OUT_GATE_SELECT:
842 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
843 case NI_GPCT_SOURCE_PIN_i_GATE_SELECT:
844 case NI_GPCT_GATE_PIN_i_GATE_SELECT:
845 gate_sel = chan & 0x1f;
848 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
849 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
850 gate_sel = chan & 0x1f;
854 if (i <= NI_660X_MAX_RTSI_CHAN)
856 for (i = 0; i <= NI_660X_MAX_GATE_PIN; ++i) {
857 if (chan == NI_GPCT_GATE_PIN_GATE_SELECT(i)) {
858 gate_sel = chan & 0x1f;
862 if (i <= NI_660X_MAX_GATE_PIN)
866 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
867 GI_GATE_SEL_MASK, GI_GATE_SEL(gate_sel));
871 static int ni_m_set_gate(struct ni_gpct *counter, unsigned int gate_source)
873 unsigned int chan = CR_CHAN(gate_source);
874 unsigned int cidx = counter->counter_index;
875 unsigned int gate_sel;
879 case NI_GPCT_TIMESTAMP_MUX_GATE_SELECT:
880 case NI_GPCT_AI_START2_GATE_SELECT:
881 case NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT:
882 case NI_GPCT_NEXT_OUT_GATE_SELECT:
883 case NI_GPCT_AI_START1_GATE_SELECT:
884 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
885 case NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT:
886 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
887 gate_sel = chan & 0x1f;
890 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
891 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
892 gate_sel = chan & 0x1f;
896 if (i <= NI_M_MAX_RTSI_CHAN)
898 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
899 if (chan == NI_GPCT_PFI_GATE_SELECT(i)) {
900 gate_sel = chan & 0x1f;
904 if (i <= NI_M_MAX_PFI_CHAN)
908 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
909 GI_GATE_SEL_MASK, GI_GATE_SEL(gate_sel));
913 static int ni_660x_set_gate2(struct ni_gpct *counter, unsigned int gate_source)
915 struct ni_gpct_device *counter_dev = counter->counter_dev;
916 unsigned int cidx = counter->counter_index;
917 unsigned int chan = CR_CHAN(gate_source);
918 unsigned int gate2_reg = NITIO_GATE2_REG(cidx);
919 unsigned int gate2_sel;
923 case NI_GPCT_SOURCE_PIN_i_GATE_SELECT:
924 case NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT:
925 case NI_GPCT_SELECTED_GATE_GATE_SELECT:
926 case NI_GPCT_NEXT_OUT_GATE_SELECT:
927 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
928 gate2_sel = chan & 0x1f;
930 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
931 gate2_sel = NI_660X_NEXT_SRC_GATE2_SEL;
934 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
935 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
936 gate2_sel = chan & 0x1f;
940 if (i <= NI_660X_MAX_RTSI_CHAN)
942 for (i = 0; i <= NI_660X_MAX_UP_DOWN_PIN; ++i) {
943 if (chan == NI_GPCT_UP_DOWN_PIN_GATE_SELECT(i)) {
944 gate2_sel = chan & 0x1f;
948 if (i <= NI_660X_MAX_UP_DOWN_PIN)
952 counter_dev->regs[gate2_reg] |= GI_GATE2_MODE;
953 counter_dev->regs[gate2_reg] &= ~GI_GATE2_SEL_MASK;
954 counter_dev->regs[gate2_reg] |= GI_GATE2_SEL(gate2_sel);
955 ni_tio_write(counter, counter_dev->regs[gate2_reg], gate2_reg);
959 static int ni_m_set_gate2(struct ni_gpct *counter, unsigned int gate_source)
961 struct ni_gpct_device *counter_dev = counter->counter_dev;
962 unsigned int cidx = counter->counter_index;
963 unsigned int chan = CR_CHAN(gate_source);
964 unsigned int gate2_reg = NITIO_GATE2_REG(cidx);
965 unsigned int gate2_sel;
968 * FIXME: We don't know what the m-series second gate codes are,
969 * so we'll just pass the bits through for now.
973 gate2_sel = chan & 0x1f;
976 counter_dev->regs[gate2_reg] |= GI_GATE2_MODE;
977 counter_dev->regs[gate2_reg] &= ~GI_GATE2_SEL_MASK;
978 counter_dev->regs[gate2_reg] |= GI_GATE2_SEL(gate2_sel);
979 ni_tio_write(counter, counter_dev->regs[gate2_reg], gate2_reg);
983 int ni_tio_set_gate_src(struct ni_gpct *counter,
984 unsigned int gate, unsigned int src)
986 struct ni_gpct_device *counter_dev = counter->counter_dev;
987 unsigned int cidx = counter->counter_index;
988 unsigned int chan = CR_CHAN(src);
989 unsigned int gate2_reg = NITIO_GATE2_REG(cidx);
990 unsigned int mode = 0;
994 if (chan == NI_GPCT_DISABLED_GATE_SELECT) {
995 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
1000 if (src & CR_INVERT)
1001 mode |= GI_GATE_POL_INVERT;
1003 mode |= GI_RISING_EDGE_GATING;
1005 mode |= GI_LEVEL_GATING;
1006 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
1007 GI_GATE_POL_INVERT | GI_GATING_MODE_MASK,
1009 switch (counter_dev->variant) {
1010 case ni_gpct_variant_e_series:
1011 case ni_gpct_variant_m_series:
1013 return ni_m_set_gate(counter, src);
1014 case ni_gpct_variant_660x:
1015 return ni_660x_set_gate(counter, src);
1019 if (!ni_tio_has_gate2_registers(counter_dev))
1022 if (chan == NI_GPCT_DISABLED_GATE_SELECT) {
1023 counter_dev->regs[gate2_reg] &= ~GI_GATE2_MODE;
1024 ni_tio_write(counter, counter_dev->regs[gate2_reg],
1028 if (src & CR_INVERT)
1029 counter_dev->regs[gate2_reg] |= GI_GATE2_POL_INVERT;
1031 counter_dev->regs[gate2_reg] &= ~GI_GATE2_POL_INVERT;
1032 switch (counter_dev->variant) {
1033 case ni_gpct_variant_m_series:
1034 return ni_m_set_gate2(counter, src);
1035 case ni_gpct_variant_660x:
1036 return ni_660x_set_gate2(counter, src);
1046 EXPORT_SYMBOL_GPL(ni_tio_set_gate_src);
1048 static int ni_tio_set_other_src(struct ni_gpct *counter, unsigned int index,
1049 unsigned int source)
1051 struct ni_gpct_device *counter_dev = counter->counter_dev;
1052 unsigned int cidx = counter->counter_index;
1053 unsigned int abz_reg, shift, mask;
1055 if (counter_dev->variant != ni_gpct_variant_m_series)
1058 abz_reg = NITIO_ABZ_REG(cidx);
1060 case NI_GPCT_SOURCE_ENCODER_A:
1063 case NI_GPCT_SOURCE_ENCODER_B:
1066 case NI_GPCT_SOURCE_ENCODER_Z:
1072 mask = 0x1f << shift;
1074 source = 0x1f; /* Disable gate */
1076 counter_dev->regs[abz_reg] &= ~mask;
1077 counter_dev->regs[abz_reg] |= (source << shift) & mask;
1078 ni_tio_write(counter, counter_dev->regs[abz_reg], abz_reg);
1082 static int ni_660x_gate_to_generic_gate(unsigned int gate, unsigned int *src)
1084 unsigned int source;
1088 case NI_660X_SRC_PIN_I_GATE_SEL:
1089 source = NI_GPCT_SOURCE_PIN_i_GATE_SELECT;
1091 case NI_660X_GATE_PIN_I_GATE_SEL:
1092 source = NI_GPCT_GATE_PIN_i_GATE_SELECT;
1094 case NI_660X_NEXT_SRC_GATE_SEL:
1095 source = NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1097 case NI_660X_NEXT_OUT_GATE_SEL:
1098 source = NI_GPCT_NEXT_OUT_GATE_SELECT;
1100 case NI_660X_LOGIC_LOW_GATE_SEL:
1101 source = NI_GPCT_LOGIC_LOW_GATE_SELECT;
1104 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
1105 if (gate == NI_660X_RTSI_GATE_SEL(i)) {
1106 source = NI_GPCT_RTSI_GATE_SELECT(i);
1110 if (i <= NI_660X_MAX_RTSI_CHAN)
1112 for (i = 0; i <= NI_660X_MAX_GATE_PIN; ++i) {
1113 if (gate == NI_660X_PIN_GATE_SEL(i)) {
1114 source = NI_GPCT_GATE_PIN_GATE_SELECT(i);
1118 if (i <= NI_660X_MAX_GATE_PIN)
1126 static int ni_m_gate_to_generic_gate(unsigned int gate, unsigned int *src)
1128 unsigned int source;
1132 case NI_M_TIMESTAMP_MUX_GATE_SEL:
1133 source = NI_GPCT_TIMESTAMP_MUX_GATE_SELECT;
1135 case NI_M_AI_START2_GATE_SEL:
1136 source = NI_GPCT_AI_START2_GATE_SELECT;
1138 case NI_M_PXI_STAR_TRIGGER_GATE_SEL:
1139 source = NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT;
1141 case NI_M_NEXT_OUT_GATE_SEL:
1142 source = NI_GPCT_NEXT_OUT_GATE_SELECT;
1144 case NI_M_AI_START1_GATE_SEL:
1145 source = NI_GPCT_AI_START1_GATE_SELECT;
1147 case NI_M_NEXT_SRC_GATE_SEL:
1148 source = NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1150 case NI_M_ANALOG_TRIG_OUT_GATE_SEL:
1151 source = NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT;
1153 case NI_M_LOGIC_LOW_GATE_SEL:
1154 source = NI_GPCT_LOGIC_LOW_GATE_SELECT;
1157 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
1158 if (gate == NI_M_RTSI_GATE_SEL(i)) {
1159 source = NI_GPCT_RTSI_GATE_SELECT(i);
1163 if (i <= NI_M_MAX_RTSI_CHAN)
1165 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
1166 if (gate == NI_M_PFI_GATE_SEL(i)) {
1167 source = NI_GPCT_PFI_GATE_SELECT(i);
1171 if (i <= NI_M_MAX_PFI_CHAN)
1179 static int ni_660x_gate2_to_generic_gate(unsigned int gate, unsigned int *src)
1181 unsigned int source;
1185 case NI_660X_SRC_PIN_I_GATE2_SEL:
1186 source = NI_GPCT_SOURCE_PIN_i_GATE_SELECT;
1188 case NI_660X_UD_PIN_I_GATE2_SEL:
1189 source = NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT;
1191 case NI_660X_NEXT_SRC_GATE2_SEL:
1192 source = NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1194 case NI_660X_NEXT_OUT_GATE2_SEL:
1195 source = NI_GPCT_NEXT_OUT_GATE_SELECT;
1197 case NI_660X_SELECTED_GATE2_SEL:
1198 source = NI_GPCT_SELECTED_GATE_GATE_SELECT;
1200 case NI_660X_LOGIC_LOW_GATE2_SEL:
1201 source = NI_GPCT_LOGIC_LOW_GATE_SELECT;
1204 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
1205 if (gate == NI_660X_RTSI_GATE2_SEL(i)) {
1206 source = NI_GPCT_RTSI_GATE_SELECT(i);
1210 if (i <= NI_660X_MAX_RTSI_CHAN)
1212 for (i = 0; i <= NI_660X_MAX_UP_DOWN_PIN; ++i) {
1213 if (gate == NI_660X_UD_PIN_GATE2_SEL(i)) {
1214 source = NI_GPCT_UP_DOWN_PIN_GATE_SELECT(i);
1218 if (i <= NI_660X_MAX_UP_DOWN_PIN)
1226 static int ni_m_gate2_to_generic_gate(unsigned int gate, unsigned int *src)
1229 * FIXME: the second gate sources for the m series are undocumented,
1230 * so we just return the raw bits for now.
1236 static int ni_tio_get_gate_src(struct ni_gpct *counter, unsigned int gate_index,
1237 unsigned int *gate_source)
1239 struct ni_gpct_device *counter_dev = counter->counter_dev;
1240 unsigned int cidx = counter->counter_index;
1246 mode = ni_tio_get_soft_copy(counter, NITIO_MODE_REG(cidx));
1247 if (((mode & GI_GATING_MODE_MASK) == GI_GATING_DISABLED) ||
1249 !(counter_dev->regs[NITIO_GATE2_REG(cidx)] & GI_GATE2_MODE))) {
1250 *gate_source = NI_GPCT_DISABLED_GATE_SELECT;
1254 switch (gate_index) {
1256 reg = NITIO_INPUT_SEL_REG(cidx);
1257 gate = GI_BITS_TO_GATE(ni_tio_get_soft_copy(counter, reg));
1259 switch (counter_dev->variant) {
1260 case ni_gpct_variant_e_series:
1261 case ni_gpct_variant_m_series:
1263 ret = ni_m_gate_to_generic_gate(gate, gate_source);
1265 case ni_gpct_variant_660x:
1266 ret = ni_660x_gate_to_generic_gate(gate, gate_source);
1271 if (mode & GI_GATE_POL_INVERT)
1272 *gate_source |= CR_INVERT;
1273 if ((mode & GI_GATING_MODE_MASK) != GI_LEVEL_GATING)
1274 *gate_source |= CR_EDGE;
1277 reg = NITIO_GATE2_REG(cidx);
1278 gate = GI_BITS_TO_GATE2(counter_dev->regs[reg]);
1280 switch (counter_dev->variant) {
1281 case ni_gpct_variant_e_series:
1282 case ni_gpct_variant_m_series:
1284 ret = ni_m_gate2_to_generic_gate(gate, gate_source);
1286 case ni_gpct_variant_660x:
1287 ret = ni_660x_gate2_to_generic_gate(gate, gate_source);
1292 if (counter_dev->regs[reg] & GI_GATE2_POL_INVERT)
1293 *gate_source |= CR_INVERT;
1294 /* second gate can't have edge/level mode set independently */
1295 if ((mode & GI_GATING_MODE_MASK) != GI_LEVEL_GATING)
1296 *gate_source |= CR_EDGE;
1304 int ni_tio_insn_config(struct comedi_device *dev,
1305 struct comedi_subdevice *s,
1306 struct comedi_insn *insn,
1309 struct ni_gpct *counter = s->private;
1310 unsigned int cidx = counter->counter_index;
1311 unsigned int status;
1315 case INSN_CONFIG_SET_COUNTER_MODE:
1316 ret = ni_tio_set_counter_mode(counter, data[1]);
1318 case INSN_CONFIG_ARM:
1319 ret = ni_tio_arm(counter, true, data[1]);
1321 case INSN_CONFIG_DISARM:
1322 ret = ni_tio_arm(counter, false, 0);
1324 case INSN_CONFIG_GET_COUNTER_STATUS:
1326 status = ni_tio_read(counter, NITIO_SHARED_STATUS_REG(cidx));
1327 if (status & GI_ARMED(cidx)) {
1328 data[1] |= COMEDI_COUNTER_ARMED;
1329 if (status & GI_COUNTING(cidx))
1330 data[1] |= COMEDI_COUNTER_COUNTING;
1332 data[2] = COMEDI_COUNTER_ARMED | COMEDI_COUNTER_COUNTING;
1334 case INSN_CONFIG_SET_CLOCK_SRC:
1335 ret = ni_tio_set_clock_src(counter, data[1], data[2]);
1337 case INSN_CONFIG_GET_CLOCK_SRC:
1338 ret = ni_tio_get_clock_src(counter, &data[1], &data[2]);
1340 case INSN_CONFIG_SET_GATE_SRC:
1341 ret = ni_tio_set_gate_src(counter, data[1], data[2]);
1343 case INSN_CONFIG_GET_GATE_SRC:
1344 ret = ni_tio_get_gate_src(counter, data[1], &data[2]);
1346 case INSN_CONFIG_SET_OTHER_SRC:
1347 ret = ni_tio_set_other_src(counter, data[1], data[2]);
1349 case INSN_CONFIG_RESET:
1350 ni_tio_reset_count_and_disarm(counter);
1355 return ret ? ret : insn->n;
1357 EXPORT_SYMBOL_GPL(ni_tio_insn_config);
1359 static unsigned int ni_tio_read_sw_save_reg(struct comedi_device *dev,
1360 struct comedi_subdevice *s)
1362 struct ni_gpct *counter = s->private;
1363 unsigned int cidx = counter->counter_index;
1366 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx), GI_SAVE_TRACE, 0);
1367 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
1368 GI_SAVE_TRACE, GI_SAVE_TRACE);
1371 * The count doesn't get latched until the next clock edge, so it is
1372 * possible the count may change (once) while we are reading. Since
1373 * the read of the SW_Save_Reg isn't atomic (apparently even when it's
1374 * a 32 bit register according to 660x docs), we need to read twice
1375 * and make sure the reading hasn't changed. If it has, a third read
1376 * will be correct since the count value will definitely have latched
1379 val = ni_tio_read(counter, NITIO_SW_SAVE_REG(cidx));
1380 if (val != ni_tio_read(counter, NITIO_SW_SAVE_REG(cidx)))
1381 val = ni_tio_read(counter, NITIO_SW_SAVE_REG(cidx));
1386 int ni_tio_insn_read(struct comedi_device *dev,
1387 struct comedi_subdevice *s,
1388 struct comedi_insn *insn,
1391 struct ni_gpct *counter = s->private;
1392 struct ni_gpct_device *counter_dev = counter->counter_dev;
1393 unsigned int channel = CR_CHAN(insn->chanspec);
1394 unsigned int cidx = counter->counter_index;
1397 for (i = 0; i < insn->n; i++) {
1400 data[i] = ni_tio_read_sw_save_reg(dev, s);
1403 data[i] = counter_dev->regs[NITIO_LOADA_REG(cidx)];
1406 data[i] = counter_dev->regs[NITIO_LOADB_REG(cidx)];
1412 EXPORT_SYMBOL_GPL(ni_tio_insn_read);
1414 static unsigned int ni_tio_next_load_register(struct ni_gpct *counter)
1416 unsigned int cidx = counter->counter_index;
1417 unsigned int bits = ni_tio_read(counter, NITIO_SHARED_STATUS_REG(cidx));
1419 return (bits & GI_NEXT_LOAD_SRC(cidx))
1420 ? NITIO_LOADB_REG(cidx)
1421 : NITIO_LOADA_REG(cidx);
1424 int ni_tio_insn_write(struct comedi_device *dev,
1425 struct comedi_subdevice *s,
1426 struct comedi_insn *insn,
1429 struct ni_gpct *counter = s->private;
1430 struct ni_gpct_device *counter_dev = counter->counter_dev;
1431 unsigned int channel = CR_CHAN(insn->chanspec);
1432 unsigned int cidx = counter->counter_index;
1433 unsigned int load_reg;
1440 * Unsafe if counter is armed.
1441 * Should probably check status and return -EBUSY if armed.
1445 * Don't disturb load source select, just use whichever
1446 * load register is already selected.
1448 load_reg = ni_tio_next_load_register(counter);
1449 ni_tio_write(counter, data[0], load_reg);
1450 ni_tio_set_bits_transient(counter, NITIO_CMD_REG(cidx),
1452 /* restore load reg */
1453 ni_tio_write(counter, counter_dev->regs[load_reg], load_reg);
1456 counter_dev->regs[NITIO_LOADA_REG(cidx)] = data[0];
1457 ni_tio_write(counter, data[0], NITIO_LOADA_REG(cidx));
1460 counter_dev->regs[NITIO_LOADB_REG(cidx)] = data[0];
1461 ni_tio_write(counter, data[0], NITIO_LOADB_REG(cidx));
1468 EXPORT_SYMBOL_GPL(ni_tio_insn_write);
1470 void ni_tio_init_counter(struct ni_gpct *counter)
1472 struct ni_gpct_device *counter_dev = counter->counter_dev;
1473 unsigned int cidx = counter->counter_index;
1475 ni_tio_reset_count_and_disarm(counter);
1477 /* initialize counter registers */
1478 counter_dev->regs[NITIO_AUTO_INC_REG(cidx)] = 0x0;
1479 ni_tio_write(counter, 0x0, NITIO_AUTO_INC_REG(cidx));
1481 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
1484 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx), ~0, 0);
1486 counter_dev->regs[NITIO_LOADA_REG(cidx)] = 0x0;
1487 ni_tio_write(counter, 0x0, NITIO_LOADA_REG(cidx));
1489 counter_dev->regs[NITIO_LOADB_REG(cidx)] = 0x0;
1490 ni_tio_write(counter, 0x0, NITIO_LOADB_REG(cidx));
1492 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx), ~0, 0);
1494 if (ni_tio_counting_mode_registers_present(counter_dev))
1495 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx), ~0, 0);
1497 if (ni_tio_has_gate2_registers(counter_dev)) {
1498 counter_dev->regs[NITIO_GATE2_REG(cidx)] = 0x0;
1499 ni_tio_write(counter, 0x0, NITIO_GATE2_REG(cidx));
1502 ni_tio_set_bits(counter, NITIO_DMA_CFG_REG(cidx), ~0, 0x0);
1504 ni_tio_set_bits(counter, NITIO_INT_ENA_REG(cidx), ~0, 0x0);
1506 EXPORT_SYMBOL_GPL(ni_tio_init_counter);
1508 struct ni_gpct_device *
1509 ni_gpct_device_construct(struct comedi_device *dev,
1510 void (*write)(struct ni_gpct *counter,
1512 enum ni_gpct_register reg),
1513 unsigned int (*read)(struct ni_gpct *counter,
1514 enum ni_gpct_register reg),
1515 enum ni_gpct_variant variant,
1516 unsigned int num_counters)
1518 struct ni_gpct_device *counter_dev;
1519 struct ni_gpct *counter;
1522 if (num_counters == 0)
1525 counter_dev = kzalloc(sizeof(*counter_dev), GFP_KERNEL);
1529 counter_dev->dev = dev;
1530 counter_dev->write = write;
1531 counter_dev->read = read;
1532 counter_dev->variant = variant;
1534 spin_lock_init(&counter_dev->regs_lock);
1536 counter_dev->counters = kcalloc(num_counters, sizeof(*counter),
1538 if (!counter_dev->counters) {
1543 for (i = 0; i < num_counters; ++i) {
1544 counter = &counter_dev->counters[i];
1545 counter->counter_dev = counter_dev;
1546 spin_lock_init(&counter->lock);
1548 counter_dev->num_counters = num_counters;
1552 EXPORT_SYMBOL_GPL(ni_gpct_device_construct);
1554 void ni_gpct_device_destroy(struct ni_gpct_device *counter_dev)
1558 kfree(counter_dev->counters);
1561 EXPORT_SYMBOL_GPL(ni_gpct_device_destroy);
1563 static int __init ni_tio_init_module(void)
1567 module_init(ni_tio_init_module);
1569 static void __exit ni_tio_cleanup_module(void)
1572 module_exit(ni_tio_cleanup_module);
1574 MODULE_AUTHOR("Comedi <comedi@comedi.org>");
1575 MODULE_DESCRIPTION("Comedi support for NI general-purpose counters");
1576 MODULE_LICENSE("GPL");