1 // SPDX-License-Identifier: GPL-2.0+
3 * Support for NI general purpose counters
5 * Copyright (C) 2006 Frank Mori Hess <fmhess@users.sourceforge.net>
10 * Description: National Instruments general purpose counters
11 * Author: J.P. Mellor <jpmellor@rose-hulman.edu>,
12 * Herman.Bruyninckx@mech.kuleuven.ac.be,
13 * Wim.Meeussen@mech.kuleuven.ac.be,
14 * Klaas.Gadeyne@mech.kuleuven.ac.be,
15 * Frank Mori Hess <fmhess@users.sourceforge.net>
16 * Updated: Thu Nov 16 09:50:32 EST 2006
19 * This module is not used directly by end-users. Rather, it
20 * is used by other drivers (for example ni_660x and ni_pcimio)
21 * to provide support for NI's general purpose counters. It was
22 * originally based on the counter code from ni_660x.c and
26 * DAQ 660x Register-Level Programmer Manual (NI 370505A-01)
27 * DAQ 6601/6602 User Manual (NI 322137B-01)
28 * 340934b.pdf DAQ-STC reference manual
30 * TODO: Support use of both banks X and Y
33 #include <linux/module.h>
34 #include <linux/slab.h>
36 #include "ni_tio_internal.h"
39 * clock sources for ni e and m series boards,
40 * get bits with GI_SRC_SEL()
42 #define NI_M_TIMEBASE_1_CLK 0x0 /* 20MHz */
43 #define NI_M_PFI_CLK(x) (((x) < 10) ? (1 + (x)) : (0xb + (x)))
44 #define NI_M_RTSI_CLK(x) (((x) == 7) ? 0x1b : (0xb + (x)))
45 #define NI_M_TIMEBASE_2_CLK 0x12 /* 100KHz */
46 #define NI_M_NEXT_TC_CLK 0x13
47 #define NI_M_NEXT_GATE_CLK 0x14 /* Gi_Src_SubSelect=0 */
48 #define NI_M_PXI_STAR_TRIGGER_CLK 0x14 /* Gi_Src_SubSelect=1 */
49 #define NI_M_PXI10_CLK 0x1d
50 #define NI_M_TIMEBASE_3_CLK 0x1e /* 80MHz, Gi_Src_SubSelect=0 */
51 #define NI_M_ANALOG_TRIGGER_OUT_CLK 0x1e /* Gi_Src_SubSelect=1 */
52 #define NI_M_LOGIC_LOW_CLK 0x1f
53 #define NI_M_MAX_PFI_CHAN 15
54 #define NI_M_MAX_RTSI_CHAN 7
57 * clock sources for ni_660x boards,
58 * get bits with GI_SRC_SEL()
60 #define NI_660X_TIMEBASE_1_CLK 0x0 /* 20MHz */
61 #define NI_660X_SRC_PIN_I_CLK 0x1
62 #define NI_660X_SRC_PIN_CLK(x) (0x2 + (x))
63 #define NI_660X_NEXT_GATE_CLK 0xa
64 #define NI_660X_RTSI_CLK(x) (0xb + (x))
65 #define NI_660X_TIMEBASE_2_CLK 0x12 /* 100KHz */
66 #define NI_660X_NEXT_TC_CLK 0x13
67 #define NI_660X_TIMEBASE_3_CLK 0x1e /* 80MHz */
68 #define NI_660X_LOGIC_LOW_CLK 0x1f
69 #define NI_660X_MAX_SRC_PIN 7
70 #define NI_660X_MAX_RTSI_CHAN 6
72 /* ni m series gate_select */
73 #define NI_M_TIMESTAMP_MUX_GATE_SEL 0x0
74 #define NI_M_PFI_GATE_SEL(x) (((x) < 10) ? (1 + (x)) : (0xb + (x)))
75 #define NI_M_RTSI_GATE_SEL(x) (((x) == 7) ? 0x1b : (0xb + (x)))
76 #define NI_M_AI_START2_GATE_SEL 0x12
77 #define NI_M_PXI_STAR_TRIGGER_GATE_SEL 0x13
78 #define NI_M_NEXT_OUT_GATE_SEL 0x14
79 #define NI_M_AI_START1_GATE_SEL 0x1c
80 #define NI_M_NEXT_SRC_GATE_SEL 0x1d
81 #define NI_M_ANALOG_TRIG_OUT_GATE_SEL 0x1e
82 #define NI_M_LOGIC_LOW_GATE_SEL 0x1f
84 /* ni_660x gate select */
85 #define NI_660X_SRC_PIN_I_GATE_SEL 0x0
86 #define NI_660X_GATE_PIN_I_GATE_SEL 0x1
87 #define NI_660X_PIN_GATE_SEL(x) (0x2 + (x))
88 #define NI_660X_NEXT_SRC_GATE_SEL 0xa
89 #define NI_660X_RTSI_GATE_SEL(x) (0xb + (x))
90 #define NI_660X_NEXT_OUT_GATE_SEL 0x14
91 #define NI_660X_LOGIC_LOW_GATE_SEL 0x1f
92 #define NI_660X_MAX_GATE_PIN 7
94 /* ni_660x second gate select */
95 #define NI_660X_SRC_PIN_I_GATE2_SEL 0x0
96 #define NI_660X_UD_PIN_I_GATE2_SEL 0x1
97 #define NI_660X_UD_PIN_GATE2_SEL(x) (0x2 + (x))
98 #define NI_660X_NEXT_SRC_GATE2_SEL 0xa
99 #define NI_660X_RTSI_GATE2_SEL(x) (0xb + (x))
100 #define NI_660X_NEXT_OUT_GATE2_SEL 0x14
101 #define NI_660X_SELECTED_GATE2_SEL 0x1e
102 #define NI_660X_LOGIC_LOW_GATE2_SEL 0x1f
103 #define NI_660X_MAX_UP_DOWN_PIN 7
105 static inline unsigned int GI_PRESCALE_X2(enum ni_gpct_variant variant)
108 case ni_gpct_variant_e_series:
111 case ni_gpct_variant_m_series:
112 return GI_M_PRESCALE_X2;
113 case ni_gpct_variant_660x:
114 return GI_660X_PRESCALE_X2;
118 static inline unsigned int GI_PRESCALE_X8(enum ni_gpct_variant variant)
121 case ni_gpct_variant_e_series:
124 case ni_gpct_variant_m_series:
125 return GI_M_PRESCALE_X8;
126 case ni_gpct_variant_660x:
127 return GI_660X_PRESCALE_X8;
131 static bool ni_tio_has_gate2_registers(const struct ni_gpct_device *counter_dev)
133 switch (counter_dev->variant) {
134 case ni_gpct_variant_e_series:
137 case ni_gpct_variant_m_series:
138 case ni_gpct_variant_660x:
144 * ni_tio_write() - Write a TIO register using the driver provided callback.
145 * @counter: struct ni_gpct counter.
146 * @value: the value to write
147 * @reg: the register to write.
149 void ni_tio_write(struct ni_gpct *counter, unsigned int value,
150 enum ni_gpct_register reg)
152 if (reg < NITIO_NUM_REGS)
153 counter->counter_dev->write(counter, value, reg);
155 EXPORT_SYMBOL_GPL(ni_tio_write);
158 * ni_tio_read() - Read a TIO register using the driver provided callback.
159 * @counter: struct ni_gpct counter.
160 * @reg: the register to read.
162 unsigned int ni_tio_read(struct ni_gpct *counter, enum ni_gpct_register reg)
164 if (reg < NITIO_NUM_REGS)
165 return counter->counter_dev->read(counter, reg);
168 EXPORT_SYMBOL_GPL(ni_tio_read);
170 static void ni_tio_reset_count_and_disarm(struct ni_gpct *counter)
172 unsigned int cidx = counter->counter_index;
174 ni_tio_write(counter, GI_RESET(cidx), NITIO_RESET_REG(cidx));
177 static int ni_tio_clock_period_ps(const struct ni_gpct *counter,
178 unsigned int generic_clock_source,
183 switch (generic_clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK) {
184 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
185 clock_period_ps = 50000;
187 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
188 clock_period_ps = 10000000;
190 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
191 clock_period_ps = 12500;
193 case NI_GPCT_PXI10_CLOCK_SRC_BITS:
194 clock_period_ps = 100000;
198 * clock period is specified by user with prescaling
199 * already taken into account.
201 *period_ps = counter->clock_period_ps;
205 switch (generic_clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK) {
206 case NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS:
208 case NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS:
209 clock_period_ps *= 2;
211 case NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS:
212 clock_period_ps *= 8;
217 *period_ps = clock_period_ps;
221 static void ni_tio_set_bits_transient(struct ni_gpct *counter,
222 enum ni_gpct_register reg,
223 unsigned int mask, unsigned int value,
224 unsigned int transient)
226 struct ni_gpct_device *counter_dev = counter->counter_dev;
229 if (reg < NITIO_NUM_REGS) {
230 spin_lock_irqsave(&counter_dev->regs_lock, flags);
231 counter_dev->regs[reg] &= ~mask;
232 counter_dev->regs[reg] |= (value & mask);
233 ni_tio_write(counter, counter_dev->regs[reg] | transient, reg);
235 spin_unlock_irqrestore(&counter_dev->regs_lock, flags);
240 * ni_tio_set_bits() - Safely write a counter register.
241 * @counter: struct ni_gpct counter.
242 * @reg: the register to write.
243 * @mask: the bits to change.
244 * @value: the new bits value.
246 * Used to write to, and update the software copy, a register whose bits may
247 * be twiddled in interrupt context, or whose software copy may be read in
250 void ni_tio_set_bits(struct ni_gpct *counter, enum ni_gpct_register reg,
251 unsigned int mask, unsigned int value)
253 ni_tio_set_bits_transient(counter, reg, mask, value, 0x0);
255 EXPORT_SYMBOL_GPL(ni_tio_set_bits);
258 * ni_tio_get_soft_copy() - Safely read the software copy of a counter register.
259 * @counter: struct ni_gpct counter.
260 * @reg: the register to read.
262 * Used to get the software copy of a register whose bits might be modified
263 * in interrupt context, or whose software copy might need to be read in
266 unsigned int ni_tio_get_soft_copy(const struct ni_gpct *counter,
267 enum ni_gpct_register reg)
269 struct ni_gpct_device *counter_dev = counter->counter_dev;
270 unsigned int value = 0;
273 if (reg < NITIO_NUM_REGS) {
274 spin_lock_irqsave(&counter_dev->regs_lock, flags);
275 value = counter_dev->regs[reg];
276 spin_unlock_irqrestore(&counter_dev->regs_lock, flags);
280 EXPORT_SYMBOL_GPL(ni_tio_get_soft_copy);
282 static unsigned int ni_tio_clock_src_modifiers(const struct ni_gpct *counter)
284 struct ni_gpct_device *counter_dev = counter->counter_dev;
285 unsigned int cidx = counter->counter_index;
286 unsigned int counting_mode_bits =
287 ni_tio_get_soft_copy(counter, NITIO_CNT_MODE_REG(cidx));
288 unsigned int bits = 0;
290 if (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
292 bits |= NI_GPCT_INVERT_CLOCK_SRC_BIT;
293 if (counting_mode_bits & GI_PRESCALE_X2(counter_dev->variant))
294 bits |= NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS;
295 if (counting_mode_bits & GI_PRESCALE_X8(counter_dev->variant))
296 bits |= NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS;
300 static int ni_m_series_clock_src_select(const struct ni_gpct *counter,
301 unsigned int *clk_src)
303 struct ni_gpct_device *counter_dev = counter->counter_dev;
304 unsigned int cidx = counter->counter_index;
305 unsigned int second_gate_reg = NITIO_GATE2_REG(cidx);
306 unsigned int clock_source = 0;
310 src = GI_BITS_TO_SRC(ni_tio_get_soft_copy(counter,
311 NITIO_INPUT_SEL_REG(cidx)));
314 case NI_M_TIMEBASE_1_CLK:
315 clock_source = NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS;
317 case NI_M_TIMEBASE_2_CLK:
318 clock_source = NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS;
320 case NI_M_TIMEBASE_3_CLK:
321 if (counter_dev->regs[second_gate_reg] & GI_SRC_SUBSEL)
323 NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS;
325 clock_source = NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS;
327 case NI_M_LOGIC_LOW_CLK:
328 clock_source = NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS;
330 case NI_M_NEXT_GATE_CLK:
331 if (counter_dev->regs[second_gate_reg] & GI_SRC_SUBSEL)
332 clock_source = NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS;
334 clock_source = NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS;
337 clock_source = NI_GPCT_PXI10_CLOCK_SRC_BITS;
339 case NI_M_NEXT_TC_CLK:
340 clock_source = NI_GPCT_NEXT_TC_CLOCK_SRC_BITS;
343 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
344 if (src == NI_M_RTSI_CLK(i)) {
345 clock_source = NI_GPCT_RTSI_CLOCK_SRC_BITS(i);
349 if (i <= NI_M_MAX_RTSI_CHAN)
351 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
352 if (src == NI_M_PFI_CLK(i)) {
353 clock_source = NI_GPCT_PFI_CLOCK_SRC_BITS(i);
357 if (i <= NI_M_MAX_PFI_CHAN)
361 clock_source |= ni_tio_clock_src_modifiers(counter);
362 *clk_src = clock_source;
366 static int ni_660x_clock_src_select(const struct ni_gpct *counter,
367 unsigned int *clk_src)
369 unsigned int clock_source = 0;
370 unsigned int cidx = counter->counter_index;
374 src = GI_BITS_TO_SRC(ni_tio_get_soft_copy(counter,
375 NITIO_INPUT_SEL_REG(cidx)));
378 case NI_660X_TIMEBASE_1_CLK:
379 clock_source = NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS;
381 case NI_660X_TIMEBASE_2_CLK:
382 clock_source = NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS;
384 case NI_660X_TIMEBASE_3_CLK:
385 clock_source = NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS;
387 case NI_660X_LOGIC_LOW_CLK:
388 clock_source = NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS;
390 case NI_660X_SRC_PIN_I_CLK:
391 clock_source = NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS;
393 case NI_660X_NEXT_GATE_CLK:
394 clock_source = NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS;
396 case NI_660X_NEXT_TC_CLK:
397 clock_source = NI_GPCT_NEXT_TC_CLOCK_SRC_BITS;
400 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
401 if (src == NI_660X_RTSI_CLK(i)) {
402 clock_source = NI_GPCT_RTSI_CLOCK_SRC_BITS(i);
406 if (i <= NI_660X_MAX_RTSI_CHAN)
408 for (i = 0; i <= NI_660X_MAX_SRC_PIN; ++i) {
409 if (src == NI_660X_SRC_PIN_CLK(i)) {
411 NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(i);
415 if (i <= NI_660X_MAX_SRC_PIN)
419 clock_source |= ni_tio_clock_src_modifiers(counter);
420 *clk_src = clock_source;
424 static int ni_tio_generic_clock_src_select(const struct ni_gpct *counter,
425 unsigned int *clk_src)
427 switch (counter->counter_dev->variant) {
428 case ni_gpct_variant_e_series:
429 case ni_gpct_variant_m_series:
431 return ni_m_series_clock_src_select(counter, clk_src);
432 case ni_gpct_variant_660x:
433 return ni_660x_clock_src_select(counter, clk_src);
437 static void ni_tio_set_sync_mode(struct ni_gpct *counter)
439 struct ni_gpct_device *counter_dev = counter->counter_dev;
440 unsigned int cidx = counter->counter_index;
441 static const u64 min_normal_sync_period_ps = 25000;
442 unsigned int mask = 0;
443 unsigned int bits = 0;
446 unsigned int clk_src = 0;
451 /* only m series and 660x variants have counting mode registers */
452 switch (counter_dev->variant) {
453 case ni_gpct_variant_e_series:
456 case ni_gpct_variant_m_series:
457 mask = GI_M_ALT_SYNC;
459 case ni_gpct_variant_660x:
460 mask = GI_660X_ALT_SYNC;
464 reg = NITIO_CNT_MODE_REG(cidx);
465 mode = ni_tio_get_soft_copy(counter, reg);
466 switch (mode & GI_CNT_MODE_MASK) {
467 case GI_CNT_MODE_QUADX1:
468 case GI_CNT_MODE_QUADX2:
469 case GI_CNT_MODE_QUADX4:
470 case GI_CNT_MODE_SYNC_SRC:
471 force_alt_sync = true;
474 force_alt_sync = false;
478 ret = ni_tio_generic_clock_src_select(counter, &clk_src);
481 ret = ni_tio_clock_period_ps(counter, clk_src, &ps);
485 * It's not clear what we should do if clock_period is unknown, so we
486 * are not using the alt sync bit in that case.
488 if (force_alt_sync || (ps && ps < min_normal_sync_period_ps))
491 ni_tio_set_bits(counter, reg, mask, bits);
494 static int ni_tio_set_counter_mode(struct ni_gpct *counter, unsigned int mode)
496 struct ni_gpct_device *counter_dev = counter->counter_dev;
497 unsigned int cidx = counter->counter_index;
498 unsigned int mode_reg_mask;
499 unsigned int mode_reg_values;
500 unsigned int input_select_bits = 0;
501 /* these bits map directly on to the mode register */
502 static const unsigned int mode_reg_direct_mask =
503 NI_GPCT_GATE_ON_BOTH_EDGES_BIT | NI_GPCT_EDGE_GATE_MODE_MASK |
504 NI_GPCT_STOP_MODE_MASK | NI_GPCT_OUTPUT_MODE_MASK |
505 NI_GPCT_HARDWARE_DISARM_MASK | NI_GPCT_LOADING_ON_TC_BIT |
506 NI_GPCT_LOADING_ON_GATE_BIT | NI_GPCT_LOAD_B_SELECT_BIT;
508 mode_reg_mask = mode_reg_direct_mask | GI_RELOAD_SRC_SWITCHING;
509 mode_reg_values = mode & mode_reg_direct_mask;
510 switch (mode & NI_GPCT_RELOAD_SOURCE_MASK) {
511 case NI_GPCT_RELOAD_SOURCE_FIXED_BITS:
513 case NI_GPCT_RELOAD_SOURCE_SWITCHING_BITS:
514 mode_reg_values |= GI_RELOAD_SRC_SWITCHING;
516 case NI_GPCT_RELOAD_SOURCE_GATE_SELECT_BITS:
517 input_select_bits |= GI_GATE_SEL_LOAD_SRC;
518 mode_reg_mask |= GI_GATING_MODE_MASK;
519 mode_reg_values |= GI_LEVEL_GATING;
524 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
525 mode_reg_mask, mode_reg_values);
527 if (ni_tio_counting_mode_registers_present(counter_dev)) {
528 unsigned int bits = 0;
530 bits |= GI_CNT_MODE(mode >> NI_GPCT_COUNTING_MODE_SHIFT);
531 bits |= GI_INDEX_PHASE((mode >> NI_GPCT_INDEX_PHASE_BITSHIFT));
532 if (mode & NI_GPCT_INDEX_ENABLE_BIT)
533 bits |= GI_INDEX_MODE;
534 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
535 GI_CNT_MODE_MASK | GI_INDEX_PHASE_MASK |
536 GI_INDEX_MODE, bits);
537 ni_tio_set_sync_mode(counter);
540 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx), GI_CNT_DIR_MASK,
541 GI_CNT_DIR(mode >> NI_GPCT_COUNTING_DIRECTION_SHIFT));
543 if (mode & NI_GPCT_OR_GATE_BIT)
544 input_select_bits |= GI_OR_GATE;
545 if (mode & NI_GPCT_INVERT_OUTPUT_BIT)
546 input_select_bits |= GI_OUTPUT_POL_INVERT;
547 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
548 GI_GATE_SEL_LOAD_SRC | GI_OR_GATE |
549 GI_OUTPUT_POL_INVERT, input_select_bits);
554 int ni_tio_arm(struct ni_gpct *counter, bool arm, unsigned int start_trigger)
556 struct ni_gpct_device *counter_dev = counter->counter_dev;
557 unsigned int cidx = counter->counter_index;
558 unsigned int transient_bits = 0;
561 unsigned int mask = 0;
562 unsigned int bits = 0;
564 /* only m series and 660x have counting mode registers */
565 switch (counter_dev->variant) {
566 case ni_gpct_variant_e_series:
569 case ni_gpct_variant_m_series:
570 mask = GI_M_HW_ARM_SEL_MASK;
572 case ni_gpct_variant_660x:
573 mask = GI_660X_HW_ARM_SEL_MASK;
577 switch (start_trigger) {
578 case NI_GPCT_ARM_IMMEDIATE:
579 transient_bits |= GI_ARM;
581 case NI_GPCT_ARM_PAIRED_IMMEDIATE:
582 transient_bits |= GI_ARM | GI_ARM_COPY;
586 * for m series and 660x, pass-through the least
587 * significant bits so we can figure out what select
590 if (mask && (start_trigger & NI_GPCT_ARM_UNKNOWN)) {
591 bits |= GI_HW_ARM_ENA |
592 (GI_HW_ARM_SEL(start_trigger) & mask);
600 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
601 GI_HW_ARM_ENA | mask, bits);
603 transient_bits |= GI_DISARM;
605 ni_tio_set_bits_transient(counter, NITIO_CMD_REG(cidx),
606 0, 0, transient_bits);
609 EXPORT_SYMBOL_GPL(ni_tio_arm);
611 static int ni_660x_clk_src(unsigned int clock_source, unsigned int *bits)
613 unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
614 unsigned int ni_660x_clock;
618 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
619 ni_660x_clock = NI_660X_TIMEBASE_1_CLK;
621 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
622 ni_660x_clock = NI_660X_TIMEBASE_2_CLK;
624 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
625 ni_660x_clock = NI_660X_TIMEBASE_3_CLK;
627 case NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS:
628 ni_660x_clock = NI_660X_LOGIC_LOW_CLK;
630 case NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS:
631 ni_660x_clock = NI_660X_SRC_PIN_I_CLK;
633 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
634 ni_660x_clock = NI_660X_NEXT_GATE_CLK;
636 case NI_GPCT_NEXT_TC_CLOCK_SRC_BITS:
637 ni_660x_clock = NI_660X_NEXT_TC_CLK;
640 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
641 if (clk_src == NI_GPCT_RTSI_CLOCK_SRC_BITS(i)) {
642 ni_660x_clock = NI_660X_RTSI_CLK(i);
646 if (i <= NI_660X_MAX_RTSI_CHAN)
648 for (i = 0; i <= NI_660X_MAX_SRC_PIN; ++i) {
649 if (clk_src == NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(i)) {
650 ni_660x_clock = NI_660X_SRC_PIN_CLK(i);
654 if (i <= NI_660X_MAX_SRC_PIN)
658 *bits = GI_SRC_SEL(ni_660x_clock);
662 static int ni_m_clk_src(unsigned int clock_source, unsigned int *bits)
664 unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
665 unsigned int ni_m_series_clock;
669 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
670 ni_m_series_clock = NI_M_TIMEBASE_1_CLK;
672 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
673 ni_m_series_clock = NI_M_TIMEBASE_2_CLK;
675 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
676 ni_m_series_clock = NI_M_TIMEBASE_3_CLK;
678 case NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS:
679 ni_m_series_clock = NI_M_LOGIC_LOW_CLK;
681 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
682 ni_m_series_clock = NI_M_NEXT_GATE_CLK;
684 case NI_GPCT_NEXT_TC_CLOCK_SRC_BITS:
685 ni_m_series_clock = NI_M_NEXT_TC_CLK;
687 case NI_GPCT_PXI10_CLOCK_SRC_BITS:
688 ni_m_series_clock = NI_M_PXI10_CLK;
690 case NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS:
691 ni_m_series_clock = NI_M_PXI_STAR_TRIGGER_CLK;
693 case NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS:
694 ni_m_series_clock = NI_M_ANALOG_TRIGGER_OUT_CLK;
697 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
698 if (clk_src == NI_GPCT_RTSI_CLOCK_SRC_BITS(i)) {
699 ni_m_series_clock = NI_M_RTSI_CLK(i);
703 if (i <= NI_M_MAX_RTSI_CHAN)
705 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
706 if (clk_src == NI_GPCT_PFI_CLOCK_SRC_BITS(i)) {
707 ni_m_series_clock = NI_M_PFI_CLK(i);
711 if (i <= NI_M_MAX_PFI_CHAN)
715 *bits = GI_SRC_SEL(ni_m_series_clock);
719 static void ni_tio_set_source_subselect(struct ni_gpct *counter,
720 unsigned int clock_source)
722 struct ni_gpct_device *counter_dev = counter->counter_dev;
723 unsigned int cidx = counter->counter_index;
724 unsigned int second_gate_reg = NITIO_GATE2_REG(cidx);
726 if (counter_dev->variant != ni_gpct_variant_m_series)
728 switch (clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK) {
729 /* Gi_Source_Subselect is zero */
730 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
731 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
732 counter_dev->regs[second_gate_reg] &= ~GI_SRC_SUBSEL;
734 /* Gi_Source_Subselect is one */
735 case NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS:
736 case NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS:
737 counter_dev->regs[second_gate_reg] |= GI_SRC_SUBSEL;
739 /* Gi_Source_Subselect doesn't matter */
743 ni_tio_write(counter, counter_dev->regs[second_gate_reg],
747 static int ni_tio_set_clock_src(struct ni_gpct *counter,
748 unsigned int clock_source,
749 unsigned int period_ns)
751 struct ni_gpct_device *counter_dev = counter->counter_dev;
752 unsigned int cidx = counter->counter_index;
753 unsigned int bits = 0;
756 switch (counter_dev->variant) {
757 case ni_gpct_variant_660x:
758 ret = ni_660x_clk_src(clock_source, &bits);
760 case ni_gpct_variant_e_series:
761 case ni_gpct_variant_m_series:
763 ret = ni_m_clk_src(clock_source, &bits);
767 struct comedi_device *dev = counter_dev->dev;
769 dev_err(dev->class_dev, "invalid clock source 0x%x\n",
774 if (clock_source & NI_GPCT_INVERT_CLOCK_SRC_BIT)
775 bits |= GI_SRC_POL_INVERT;
776 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
777 GI_SRC_SEL_MASK | GI_SRC_POL_INVERT, bits);
778 ni_tio_set_source_subselect(counter, clock_source);
780 if (ni_tio_counting_mode_registers_present(counter_dev)) {
782 switch (clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK) {
783 case NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS:
785 case NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS:
786 bits |= GI_PRESCALE_X2(counter_dev->variant);
788 case NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS:
789 bits |= GI_PRESCALE_X8(counter_dev->variant);
794 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
795 GI_PRESCALE_X2(counter_dev->variant) |
796 GI_PRESCALE_X8(counter_dev->variant), bits);
798 counter->clock_period_ps = period_ns * 1000;
799 ni_tio_set_sync_mode(counter);
803 static int ni_tio_get_clock_src(struct ni_gpct *counter,
804 unsigned int *clock_source,
805 unsigned int *period_ns)
810 ret = ni_tio_generic_clock_src_select(counter, clock_source);
813 ret = ni_tio_clock_period_ps(counter, *clock_source, &temp64);
816 do_div(temp64, 1000); /* ps to ns */
821 static inline void ni_tio_set_gate_raw(struct ni_gpct *counter,
822 unsigned int gate_source)
824 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(counter->counter_index),
825 GI_GATE_SEL_MASK, GI_GATE_SEL(gate_source));
828 static inline void ni_tio_set_gate2_raw(struct ni_gpct *counter,
829 unsigned int gate_source)
831 ni_tio_set_bits(counter, NITIO_GATE2_REG(counter->counter_index),
832 GI_GATE2_SEL_MASK, GI_GATE2_SEL(gate_source));
835 /* Set the mode bits for gate. */
836 static inline void ni_tio_set_gate_mode(struct ni_gpct *counter,
839 unsigned int mode_bits = 0;
841 if (CR_CHAN(src) & NI_GPCT_DISABLED_GATE_SELECT) {
843 * Allowing bitwise comparison here to allow non-zero raw
844 * register value to be used for channel when disabling.
846 mode_bits = GI_GATING_DISABLED;
849 mode_bits |= GI_GATE_POL_INVERT;
851 mode_bits |= GI_RISING_EDGE_GATING;
853 mode_bits |= GI_LEVEL_GATING;
855 ni_tio_set_bits(counter, NITIO_MODE_REG(counter->counter_index),
856 GI_GATE_POL_INVERT | GI_GATING_MODE_MASK,
861 * Set the mode bits for gate2.
863 * Previously, the code this function represents did not actually write anything
864 * to the register. Rather, writing to this register was reserved for the code
865 * ni ni_tio_set_gate2_raw.
867 static inline void ni_tio_set_gate2_mode(struct ni_gpct *counter,
871 * The GI_GATE2_MODE bit was previously set in the code that also sets
873 * We'll set mode bits _after_ source bits now, and thus, this function
874 * will effectively enable the second gate after all bits are set.
876 unsigned int mode_bits = GI_GATE2_MODE;
878 if (CR_CHAN(src) & NI_GPCT_DISABLED_GATE_SELECT)
880 * Allowing bitwise comparison here to allow non-zero raw
881 * register value to be used for channel when disabling.
883 mode_bits = GI_GATING_DISABLED;
885 mode_bits |= GI_GATE2_POL_INVERT;
887 ni_tio_set_bits(counter, NITIO_GATE2_REG(counter->counter_index),
888 GI_GATE2_POL_INVERT | GI_GATE2_MODE, mode_bits);
891 static int ni_660x_set_gate(struct ni_gpct *counter, unsigned int gate_source)
893 unsigned int chan = CR_CHAN(gate_source);
894 unsigned int gate_sel;
898 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
899 gate_sel = NI_660X_NEXT_SRC_GATE_SEL;
901 case NI_GPCT_NEXT_OUT_GATE_SELECT:
902 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
903 case NI_GPCT_SOURCE_PIN_i_GATE_SELECT:
904 case NI_GPCT_GATE_PIN_i_GATE_SELECT:
905 gate_sel = chan & 0x1f;
908 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
909 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
910 gate_sel = chan & 0x1f;
914 if (i <= NI_660X_MAX_RTSI_CHAN)
916 for (i = 0; i <= NI_660X_MAX_GATE_PIN; ++i) {
917 if (chan == NI_GPCT_GATE_PIN_GATE_SELECT(i)) {
918 gate_sel = chan & 0x1f;
922 if (i <= NI_660X_MAX_GATE_PIN)
926 ni_tio_set_gate_raw(counter, gate_sel);
930 static int ni_m_set_gate(struct ni_gpct *counter, unsigned int gate_source)
932 unsigned int chan = CR_CHAN(gate_source);
933 unsigned int gate_sel;
937 case NI_GPCT_TIMESTAMP_MUX_GATE_SELECT:
938 case NI_GPCT_AI_START2_GATE_SELECT:
939 case NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT:
940 case NI_GPCT_NEXT_OUT_GATE_SELECT:
941 case NI_GPCT_AI_START1_GATE_SELECT:
942 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
943 case NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT:
944 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
945 gate_sel = chan & 0x1f;
948 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
949 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
950 gate_sel = chan & 0x1f;
954 if (i <= NI_M_MAX_RTSI_CHAN)
956 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
957 if (chan == NI_GPCT_PFI_GATE_SELECT(i)) {
958 gate_sel = chan & 0x1f;
962 if (i <= NI_M_MAX_PFI_CHAN)
966 ni_tio_set_gate_raw(counter, gate_sel);
970 static int ni_660x_set_gate2(struct ni_gpct *counter, unsigned int gate_source)
972 unsigned int chan = CR_CHAN(gate_source);
973 unsigned int gate2_sel;
977 case NI_GPCT_SOURCE_PIN_i_GATE_SELECT:
978 case NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT:
979 case NI_GPCT_SELECTED_GATE_GATE_SELECT:
980 case NI_GPCT_NEXT_OUT_GATE_SELECT:
981 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
982 gate2_sel = chan & 0x1f;
984 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
985 gate2_sel = NI_660X_NEXT_SRC_GATE2_SEL;
988 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
989 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
990 gate2_sel = chan & 0x1f;
994 if (i <= NI_660X_MAX_RTSI_CHAN)
996 for (i = 0; i <= NI_660X_MAX_UP_DOWN_PIN; ++i) {
997 if (chan == NI_GPCT_UP_DOWN_PIN_GATE_SELECT(i)) {
998 gate2_sel = chan & 0x1f;
1002 if (i <= NI_660X_MAX_UP_DOWN_PIN)
1006 ni_tio_set_gate2_raw(counter, gate2_sel);
1010 static int ni_m_set_gate2(struct ni_gpct *counter, unsigned int gate_source)
1013 * FIXME: We don't know what the m-series second gate codes are,
1014 * so we'll just pass the bits through for now.
1016 ni_tio_set_gate2_raw(counter, gate_source);
1020 int ni_tio_set_gate_src_raw(struct ni_gpct *counter,
1021 unsigned int gate, unsigned int src)
1023 struct ni_gpct_device *counter_dev = counter->counter_dev;
1027 /* 1. start by disabling gate */
1028 ni_tio_set_gate_mode(counter, NI_GPCT_DISABLED_GATE_SELECT);
1029 /* 2. set the requested gate source */
1030 ni_tio_set_gate_raw(counter, src);
1031 /* 3. reenable & set mode to starts things back up */
1032 ni_tio_set_gate_mode(counter, src);
1035 if (!ni_tio_has_gate2_registers(counter_dev))
1038 /* 1. start by disabling gate */
1039 ni_tio_set_gate2_mode(counter, NI_GPCT_DISABLED_GATE_SELECT);
1040 /* 2. set the requested gate source */
1041 ni_tio_set_gate2_raw(counter, src);
1042 /* 3. reenable & set mode to starts things back up */
1043 ni_tio_set_gate2_mode(counter, src);
1050 EXPORT_SYMBOL_GPL(ni_tio_set_gate_src_raw);
1052 int ni_tio_set_gate_src(struct ni_gpct *counter,
1053 unsigned int gate, unsigned int src)
1055 struct ni_gpct_device *counter_dev = counter->counter_dev;
1057 * mask off disable flag. This high bit still passes CR_CHAN.
1058 * Doing this allows one to both set the gate as disabled, but also
1059 * change the route value of the gate.
1061 int chan = CR_CHAN(src) & (~NI_GPCT_DISABLED_GATE_SELECT);
1066 /* 1. start by disabling gate */
1067 ni_tio_set_gate_mode(counter, NI_GPCT_DISABLED_GATE_SELECT);
1068 /* 2. set the requested gate source */
1069 switch (counter_dev->variant) {
1070 case ni_gpct_variant_e_series:
1071 case ni_gpct_variant_m_series:
1072 ret = ni_m_set_gate(counter, chan);
1074 case ni_gpct_variant_660x:
1075 ret = ni_660x_set_gate(counter, chan);
1082 /* 3. reenable & set mode to starts things back up */
1083 ni_tio_set_gate_mode(counter, src);
1086 if (!ni_tio_has_gate2_registers(counter_dev))
1089 /* 1. start by disabling gate */
1090 ni_tio_set_gate2_mode(counter, NI_GPCT_DISABLED_GATE_SELECT);
1091 /* 2. set the requested gate source */
1092 switch (counter_dev->variant) {
1093 case ni_gpct_variant_m_series:
1094 ret = ni_m_set_gate2(counter, chan);
1096 case ni_gpct_variant_660x:
1097 ret = ni_660x_set_gate2(counter, chan);
1104 /* 3. reenable & set mode to starts things back up */
1105 ni_tio_set_gate2_mode(counter, src);
1112 EXPORT_SYMBOL_GPL(ni_tio_set_gate_src);
1114 static int ni_tio_set_other_src(struct ni_gpct *counter, unsigned int index,
1115 unsigned int source)
1117 struct ni_gpct_device *counter_dev = counter->counter_dev;
1118 unsigned int cidx = counter->counter_index;
1119 unsigned int abz_reg, shift, mask;
1121 if (counter_dev->variant != ni_gpct_variant_m_series)
1124 abz_reg = NITIO_ABZ_REG(cidx);
1126 /* allow for new device-global names */
1127 if (index == NI_GPCT_SOURCE_ENCODER_A ||
1128 (index >= NI_CtrA(0) && index <= NI_CtrA(-1))) {
1130 } else if (index == NI_GPCT_SOURCE_ENCODER_B ||
1131 (index >= NI_CtrB(0) && index <= NI_CtrB(-1))) {
1133 } else if (index == NI_GPCT_SOURCE_ENCODER_Z ||
1134 (index >= NI_CtrZ(0) && index <= NI_CtrZ(-1))) {
1140 mask = 0x1f << shift;
1142 source = 0x1f; /* Disable gate */
1144 counter_dev->regs[abz_reg] &= ~mask;
1145 counter_dev->regs[abz_reg] |= (source << shift) & mask;
1146 ni_tio_write(counter, counter_dev->regs[abz_reg], abz_reg);
1150 static int ni_tio_get_other_src(struct ni_gpct *counter, unsigned int index,
1151 unsigned int *source)
1153 struct ni_gpct_device *counter_dev = counter->counter_dev;
1154 unsigned int cidx = counter->counter_index;
1155 unsigned int abz_reg, shift, mask;
1157 if (counter_dev->variant != ni_gpct_variant_m_series)
1158 /* A,B,Z only valid for m-series */
1161 abz_reg = NITIO_ABZ_REG(cidx);
1163 /* allow for new device-global names */
1164 if (index == NI_GPCT_SOURCE_ENCODER_A ||
1165 (index >= NI_CtrA(0) && index <= NI_CtrA(-1))) {
1167 } else if (index == NI_GPCT_SOURCE_ENCODER_B ||
1168 (index >= NI_CtrB(0) && index <= NI_CtrB(-1))) {
1170 } else if (index == NI_GPCT_SOURCE_ENCODER_Z ||
1171 (index >= NI_CtrZ(0) && index <= NI_CtrZ(-1))) {
1179 *source = (ni_tio_get_soft_copy(counter, abz_reg) >> shift) & mask;
1183 static int ni_660x_gate_to_generic_gate(unsigned int gate, unsigned int *src)
1185 unsigned int source;
1189 case NI_660X_SRC_PIN_I_GATE_SEL:
1190 source = NI_GPCT_SOURCE_PIN_i_GATE_SELECT;
1192 case NI_660X_GATE_PIN_I_GATE_SEL:
1193 source = NI_GPCT_GATE_PIN_i_GATE_SELECT;
1195 case NI_660X_NEXT_SRC_GATE_SEL:
1196 source = NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1198 case NI_660X_NEXT_OUT_GATE_SEL:
1199 source = NI_GPCT_NEXT_OUT_GATE_SELECT;
1201 case NI_660X_LOGIC_LOW_GATE_SEL:
1202 source = NI_GPCT_LOGIC_LOW_GATE_SELECT;
1205 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
1206 if (gate == NI_660X_RTSI_GATE_SEL(i)) {
1207 source = NI_GPCT_RTSI_GATE_SELECT(i);
1211 if (i <= NI_660X_MAX_RTSI_CHAN)
1213 for (i = 0; i <= NI_660X_MAX_GATE_PIN; ++i) {
1214 if (gate == NI_660X_PIN_GATE_SEL(i)) {
1215 source = NI_GPCT_GATE_PIN_GATE_SELECT(i);
1219 if (i <= NI_660X_MAX_GATE_PIN)
1227 static int ni_m_gate_to_generic_gate(unsigned int gate, unsigned int *src)
1229 unsigned int source;
1233 case NI_M_TIMESTAMP_MUX_GATE_SEL:
1234 source = NI_GPCT_TIMESTAMP_MUX_GATE_SELECT;
1236 case NI_M_AI_START2_GATE_SEL:
1237 source = NI_GPCT_AI_START2_GATE_SELECT;
1239 case NI_M_PXI_STAR_TRIGGER_GATE_SEL:
1240 source = NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT;
1242 case NI_M_NEXT_OUT_GATE_SEL:
1243 source = NI_GPCT_NEXT_OUT_GATE_SELECT;
1245 case NI_M_AI_START1_GATE_SEL:
1246 source = NI_GPCT_AI_START1_GATE_SELECT;
1248 case NI_M_NEXT_SRC_GATE_SEL:
1249 source = NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1251 case NI_M_ANALOG_TRIG_OUT_GATE_SEL:
1252 source = NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT;
1254 case NI_M_LOGIC_LOW_GATE_SEL:
1255 source = NI_GPCT_LOGIC_LOW_GATE_SELECT;
1258 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
1259 if (gate == NI_M_RTSI_GATE_SEL(i)) {
1260 source = NI_GPCT_RTSI_GATE_SELECT(i);
1264 if (i <= NI_M_MAX_RTSI_CHAN)
1266 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
1267 if (gate == NI_M_PFI_GATE_SEL(i)) {
1268 source = NI_GPCT_PFI_GATE_SELECT(i);
1272 if (i <= NI_M_MAX_PFI_CHAN)
1280 static int ni_660x_gate2_to_generic_gate(unsigned int gate, unsigned int *src)
1282 unsigned int source;
1286 case NI_660X_SRC_PIN_I_GATE2_SEL:
1287 source = NI_GPCT_SOURCE_PIN_i_GATE_SELECT;
1289 case NI_660X_UD_PIN_I_GATE2_SEL:
1290 source = NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT;
1292 case NI_660X_NEXT_SRC_GATE2_SEL:
1293 source = NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1295 case NI_660X_NEXT_OUT_GATE2_SEL:
1296 source = NI_GPCT_NEXT_OUT_GATE_SELECT;
1298 case NI_660X_SELECTED_GATE2_SEL:
1299 source = NI_GPCT_SELECTED_GATE_GATE_SELECT;
1301 case NI_660X_LOGIC_LOW_GATE2_SEL:
1302 source = NI_GPCT_LOGIC_LOW_GATE_SELECT;
1305 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
1306 if (gate == NI_660X_RTSI_GATE2_SEL(i)) {
1307 source = NI_GPCT_RTSI_GATE_SELECT(i);
1311 if (i <= NI_660X_MAX_RTSI_CHAN)
1313 for (i = 0; i <= NI_660X_MAX_UP_DOWN_PIN; ++i) {
1314 if (gate == NI_660X_UD_PIN_GATE2_SEL(i)) {
1315 source = NI_GPCT_UP_DOWN_PIN_GATE_SELECT(i);
1319 if (i <= NI_660X_MAX_UP_DOWN_PIN)
1327 static int ni_m_gate2_to_generic_gate(unsigned int gate, unsigned int *src)
1330 * FIXME: the second gate sources for the m series are undocumented,
1331 * so we just return the raw bits for now.
1337 static inline unsigned int ni_tio_get_gate_mode(struct ni_gpct *counter)
1339 unsigned int mode = ni_tio_get_soft_copy(
1340 counter, NITIO_MODE_REG(counter->counter_index));
1341 unsigned int ret = 0;
1343 if ((mode & GI_GATING_MODE_MASK) == GI_GATING_DISABLED)
1344 ret |= NI_GPCT_DISABLED_GATE_SELECT;
1345 if (mode & GI_GATE_POL_INVERT)
1347 if ((mode & GI_GATING_MODE_MASK) != GI_LEVEL_GATING)
1353 static inline unsigned int ni_tio_get_gate2_mode(struct ni_gpct *counter)
1355 unsigned int mode = ni_tio_get_soft_copy(
1356 counter, NITIO_GATE2_REG(counter->counter_index));
1357 unsigned int ret = 0;
1359 if (!(mode & GI_GATE2_MODE))
1360 ret |= NI_GPCT_DISABLED_GATE_SELECT;
1361 if (mode & GI_GATE2_POL_INVERT)
1367 static inline unsigned int ni_tio_get_gate_val(struct ni_gpct *counter)
1369 return GI_BITS_TO_GATE(ni_tio_get_soft_copy(counter,
1370 NITIO_INPUT_SEL_REG(counter->counter_index)));
1373 static inline unsigned int ni_tio_get_gate2_val(struct ni_gpct *counter)
1375 return GI_BITS_TO_GATE2(ni_tio_get_soft_copy(counter,
1376 NITIO_GATE2_REG(counter->counter_index)));
1379 static int ni_tio_get_gate_src(struct ni_gpct *counter, unsigned int gate_index,
1380 unsigned int *gate_source)
1385 switch (gate_index) {
1387 gate = ni_tio_get_gate_val(counter);
1388 switch (counter->counter_dev->variant) {
1389 case ni_gpct_variant_e_series:
1390 case ni_gpct_variant_m_series:
1392 ret = ni_m_gate_to_generic_gate(gate, gate_source);
1394 case ni_gpct_variant_660x:
1395 ret = ni_660x_gate_to_generic_gate(gate, gate_source);
1400 *gate_source |= ni_tio_get_gate_mode(counter);
1403 gate = ni_tio_get_gate2_val(counter);
1404 switch (counter->counter_dev->variant) {
1405 case ni_gpct_variant_e_series:
1406 case ni_gpct_variant_m_series:
1408 ret = ni_m_gate2_to_generic_gate(gate, gate_source);
1410 case ni_gpct_variant_660x:
1411 ret = ni_660x_gate2_to_generic_gate(gate, gate_source);
1416 *gate_source |= ni_tio_get_gate2_mode(counter);
1424 static int ni_tio_get_gate_src_raw(struct ni_gpct *counter,
1425 unsigned int gate_index,
1426 unsigned int *gate_source)
1428 switch (gate_index) {
1430 *gate_source = ni_tio_get_gate_mode(counter)
1431 | ni_tio_get_gate_val(counter);
1434 *gate_source = ni_tio_get_gate2_mode(counter)
1435 | ni_tio_get_gate2_val(counter);
1443 int ni_tio_insn_config(struct comedi_device *dev,
1444 struct comedi_subdevice *s,
1445 struct comedi_insn *insn,
1448 struct ni_gpct *counter = s->private;
1449 unsigned int cidx = counter->counter_index;
1450 unsigned int status;
1454 case INSN_CONFIG_SET_COUNTER_MODE:
1455 ret = ni_tio_set_counter_mode(counter, data[1]);
1457 case INSN_CONFIG_ARM:
1458 ret = ni_tio_arm(counter, true, data[1]);
1460 case INSN_CONFIG_DISARM:
1461 ret = ni_tio_arm(counter, false, 0);
1463 case INSN_CONFIG_GET_COUNTER_STATUS:
1465 status = ni_tio_read(counter, NITIO_SHARED_STATUS_REG(cidx));
1466 if (status & GI_ARMED(cidx)) {
1467 data[1] |= COMEDI_COUNTER_ARMED;
1468 if (status & GI_COUNTING(cidx))
1469 data[1] |= COMEDI_COUNTER_COUNTING;
1471 data[2] = COMEDI_COUNTER_ARMED | COMEDI_COUNTER_COUNTING;
1473 case INSN_CONFIG_SET_CLOCK_SRC:
1474 ret = ni_tio_set_clock_src(counter, data[1], data[2]);
1476 case INSN_CONFIG_GET_CLOCK_SRC:
1477 ret = ni_tio_get_clock_src(counter, &data[1], &data[2]);
1479 case INSN_CONFIG_SET_GATE_SRC:
1480 ret = ni_tio_set_gate_src(counter, data[1], data[2]);
1482 case INSN_CONFIG_GET_GATE_SRC:
1483 ret = ni_tio_get_gate_src(counter, data[1], &data[2]);
1485 case INSN_CONFIG_SET_OTHER_SRC:
1486 ret = ni_tio_set_other_src(counter, data[1], data[2]);
1488 case INSN_CONFIG_RESET:
1489 ni_tio_reset_count_and_disarm(counter);
1494 return ret ? ret : insn->n;
1496 EXPORT_SYMBOL_GPL(ni_tio_insn_config);
1499 * Retrieves the register value of the current source of the output selector for
1500 * the given destination.
1502 * If the terminal for the destination is not already configured as an output,
1503 * this function returns -EINVAL as error.
1505 * Return: the register value of the destination output selector;
1506 * -EINVAL if terminal is not configured for output.
1508 int ni_tio_get_routing(struct ni_gpct_device *counter_dev, unsigned int dest)
1510 /* we need to know the actual counter below... */
1511 int ctr_index = (dest - NI_COUNTER_NAMES_BASE) % NI_MAX_COUNTERS;
1512 struct ni_gpct *counter = &counter_dev->counters[ctr_index];
1516 if (dest >= NI_CtrA(0) && dest <= NI_CtrZ(-1)) {
1517 ret = ni_tio_get_other_src(counter, dest, ®);
1518 } else if (dest >= NI_CtrGate(0) && dest <= NI_CtrGate(-1)) {
1519 ret = ni_tio_get_gate_src_raw(counter, 0, ®);
1520 } else if (dest >= NI_CtrAux(0) && dest <= NI_CtrAux(-1)) {
1521 ret = ni_tio_get_gate_src_raw(counter, 1, ®);
1523 * This case is not possible through this interface. A user must use
1524 * INSN_CONFIG_SET_CLOCK_SRC instead.
1525 * } else if (dest >= NI_CtrSource(0) && dest <= NI_CtrSource(-1)) {
1526 * ret = ni_tio_set_clock_src(counter, ®, &period_ns);
1535 EXPORT_SYMBOL_GPL(ni_tio_get_routing);
1538 * Sets the register value of the selector MUX for the given destination.
1539 * @counter_dev:Pointer to general counter device.
1540 * @destination:Device-global identifier of route destination.
1542 * The first several bits of this value should store the desired
1543 * value to write to the register. All other bits are for
1544 * transmitting information that modify the mode of the particular
1545 * destination/gate. These mode bits might include a bitwise or of
1546 * CR_INVERT and CR_EDGE. Note that the calling function should
1547 * have already validated the correctness of this value.
1549 int ni_tio_set_routing(struct ni_gpct_device *counter_dev, unsigned int dest,
1552 /* we need to know the actual counter below... */
1553 int ctr_index = (dest - NI_COUNTER_NAMES_BASE) % NI_MAX_COUNTERS;
1554 struct ni_gpct *counter = &counter_dev->counters[ctr_index];
1557 if (dest >= NI_CtrA(0) && dest <= NI_CtrZ(-1)) {
1558 ret = ni_tio_set_other_src(counter, dest, reg);
1559 } else if (dest >= NI_CtrGate(0) && dest <= NI_CtrGate(-1)) {
1560 ret = ni_tio_set_gate_src_raw(counter, 0, reg);
1561 } else if (dest >= NI_CtrAux(0) && dest <= NI_CtrAux(-1)) {
1562 ret = ni_tio_set_gate_src_raw(counter, 1, reg);
1564 * This case is not possible through this interface. A user must use
1565 * INSN_CONFIG_SET_CLOCK_SRC instead.
1566 * } else if (dest >= NI_CtrSource(0) && dest <= NI_CtrSource(-1)) {
1567 * ret = ni_tio_set_clock_src(counter, reg, period_ns);
1575 EXPORT_SYMBOL_GPL(ni_tio_set_routing);
1578 * Sets the given destination MUX to its default value or disable it.
1580 * Return: 0 if successful; -EINVAL if terminal is unknown.
1582 int ni_tio_unset_routing(struct ni_gpct_device *counter_dev, unsigned int dest)
1584 if (dest >= NI_GATES_NAMES_BASE && dest <= NI_GATES_NAMES_MAX)
1585 /* Disable gate (via mode bits) and set to default 0-value */
1586 return ni_tio_set_routing(counter_dev, dest,
1587 NI_GPCT_DISABLED_GATE_SELECT);
1589 * This case is not possible through this interface. A user must use
1590 * INSN_CONFIG_SET_CLOCK_SRC instead.
1591 * if (dest >= NI_CtrSource(0) && dest <= NI_CtrSource(-1))
1592 * return ni_tio_set_clock_src(counter, reg, period_ns);
1597 EXPORT_SYMBOL_GPL(ni_tio_unset_routing);
1599 static unsigned int ni_tio_read_sw_save_reg(struct comedi_device *dev,
1600 struct comedi_subdevice *s)
1602 struct ni_gpct *counter = s->private;
1603 unsigned int cidx = counter->counter_index;
1606 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx), GI_SAVE_TRACE, 0);
1607 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
1608 GI_SAVE_TRACE, GI_SAVE_TRACE);
1611 * The count doesn't get latched until the next clock edge, so it is
1612 * possible the count may change (once) while we are reading. Since
1613 * the read of the SW_Save_Reg isn't atomic (apparently even when it's
1614 * a 32 bit register according to 660x docs), we need to read twice
1615 * and make sure the reading hasn't changed. If it has, a third read
1616 * will be correct since the count value will definitely have latched
1619 val = ni_tio_read(counter, NITIO_SW_SAVE_REG(cidx));
1620 if (val != ni_tio_read(counter, NITIO_SW_SAVE_REG(cidx)))
1621 val = ni_tio_read(counter, NITIO_SW_SAVE_REG(cidx));
1626 int ni_tio_insn_read(struct comedi_device *dev,
1627 struct comedi_subdevice *s,
1628 struct comedi_insn *insn,
1631 struct ni_gpct *counter = s->private;
1632 struct ni_gpct_device *counter_dev = counter->counter_dev;
1633 unsigned int channel = CR_CHAN(insn->chanspec);
1634 unsigned int cidx = counter->counter_index;
1637 for (i = 0; i < insn->n; i++) {
1640 data[i] = ni_tio_read_sw_save_reg(dev, s);
1643 data[i] = counter_dev->regs[NITIO_LOADA_REG(cidx)];
1646 data[i] = counter_dev->regs[NITIO_LOADB_REG(cidx)];
1652 EXPORT_SYMBOL_GPL(ni_tio_insn_read);
1654 static unsigned int ni_tio_next_load_register(struct ni_gpct *counter)
1656 unsigned int cidx = counter->counter_index;
1657 unsigned int bits = ni_tio_read(counter, NITIO_SHARED_STATUS_REG(cidx));
1659 return (bits & GI_NEXT_LOAD_SRC(cidx))
1660 ? NITIO_LOADB_REG(cidx)
1661 : NITIO_LOADA_REG(cidx);
1664 int ni_tio_insn_write(struct comedi_device *dev,
1665 struct comedi_subdevice *s,
1666 struct comedi_insn *insn,
1669 struct ni_gpct *counter = s->private;
1670 struct ni_gpct_device *counter_dev = counter->counter_dev;
1671 unsigned int channel = CR_CHAN(insn->chanspec);
1672 unsigned int cidx = counter->counter_index;
1673 unsigned int load_reg;
1680 * Unsafe if counter is armed.
1681 * Should probably check status and return -EBUSY if armed.
1685 * Don't disturb load source select, just use whichever
1686 * load register is already selected.
1688 load_reg = ni_tio_next_load_register(counter);
1689 ni_tio_write(counter, data[0], load_reg);
1690 ni_tio_set_bits_transient(counter, NITIO_CMD_REG(cidx),
1692 /* restore load reg */
1693 ni_tio_write(counter, counter_dev->regs[load_reg], load_reg);
1696 counter_dev->regs[NITIO_LOADA_REG(cidx)] = data[0];
1697 ni_tio_write(counter, data[0], NITIO_LOADA_REG(cidx));
1700 counter_dev->regs[NITIO_LOADB_REG(cidx)] = data[0];
1701 ni_tio_write(counter, data[0], NITIO_LOADB_REG(cidx));
1708 EXPORT_SYMBOL_GPL(ni_tio_insn_write);
1710 void ni_tio_init_counter(struct ni_gpct *counter)
1712 struct ni_gpct_device *counter_dev = counter->counter_dev;
1713 unsigned int cidx = counter->counter_index;
1715 ni_tio_reset_count_and_disarm(counter);
1717 /* initialize counter registers */
1718 counter_dev->regs[NITIO_AUTO_INC_REG(cidx)] = 0x0;
1719 ni_tio_write(counter, 0x0, NITIO_AUTO_INC_REG(cidx));
1721 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
1724 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx), ~0, 0);
1726 counter_dev->regs[NITIO_LOADA_REG(cidx)] = 0x0;
1727 ni_tio_write(counter, 0x0, NITIO_LOADA_REG(cidx));
1729 counter_dev->regs[NITIO_LOADB_REG(cidx)] = 0x0;
1730 ni_tio_write(counter, 0x0, NITIO_LOADB_REG(cidx));
1732 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx), ~0, 0);
1734 if (ni_tio_counting_mode_registers_present(counter_dev))
1735 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx), ~0, 0);
1737 if (ni_tio_has_gate2_registers(counter_dev)) {
1738 counter_dev->regs[NITIO_GATE2_REG(cidx)] = 0x0;
1739 ni_tio_write(counter, 0x0, NITIO_GATE2_REG(cidx));
1742 ni_tio_set_bits(counter, NITIO_DMA_CFG_REG(cidx), ~0, 0x0);
1744 ni_tio_set_bits(counter, NITIO_INT_ENA_REG(cidx), ~0, 0x0);
1746 EXPORT_SYMBOL_GPL(ni_tio_init_counter);
1748 struct ni_gpct_device *
1749 ni_gpct_device_construct(struct comedi_device *dev,
1750 void (*write)(struct ni_gpct *counter,
1752 enum ni_gpct_register reg),
1753 unsigned int (*read)(struct ni_gpct *counter,
1754 enum ni_gpct_register reg),
1755 enum ni_gpct_variant variant,
1756 unsigned int num_counters,
1757 unsigned int counters_per_chip,
1758 const struct ni_route_tables *routing_tables)
1760 struct ni_gpct_device *counter_dev;
1761 struct ni_gpct *counter;
1764 if (num_counters == 0 || counters_per_chip == 0)
1767 counter_dev = kzalloc(sizeof(*counter_dev), GFP_KERNEL);
1771 counter_dev->dev = dev;
1772 counter_dev->write = write;
1773 counter_dev->read = read;
1774 counter_dev->variant = variant;
1775 counter_dev->routing_tables = routing_tables;
1777 spin_lock_init(&counter_dev->regs_lock);
1779 counter_dev->counters = kcalloc(num_counters, sizeof(*counter),
1781 if (!counter_dev->counters) {
1786 for (i = 0; i < num_counters; ++i) {
1787 counter = &counter_dev->counters[i];
1788 counter->counter_dev = counter_dev;
1789 counter->chip_index = i / counters_per_chip;
1790 counter->counter_index = i % counters_per_chip;
1791 spin_lock_init(&counter->lock);
1793 counter_dev->num_counters = num_counters;
1794 counter_dev->counters_per_chip = counters_per_chip;
1798 EXPORT_SYMBOL_GPL(ni_gpct_device_construct);
1800 void ni_gpct_device_destroy(struct ni_gpct_device *counter_dev)
1804 kfree(counter_dev->counters);
1807 EXPORT_SYMBOL_GPL(ni_gpct_device_destroy);
1809 static int __init ni_tio_init_module(void)
1813 module_init(ni_tio_init_module);
1815 static void __exit ni_tio_cleanup_module(void)
1818 module_exit(ni_tio_cleanup_module);
1820 MODULE_AUTHOR("Comedi <comedi@comedi.org>");
1821 MODULE_DESCRIPTION("Comedi support for NI general-purpose counters");
1822 MODULE_LICENSE("GPL");