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;
227 unsigned int chip = counter->chip_index;
230 if (reg < NITIO_NUM_REGS && chip < counter_dev->num_chips) {
231 unsigned int *regs = counter_dev->regs[chip];
233 spin_lock_irqsave(&counter_dev->regs_lock, flags);
235 regs[reg] |= (value & mask);
236 ni_tio_write(counter, regs[reg] | transient, reg);
238 spin_unlock_irqrestore(&counter_dev->regs_lock, flags);
243 * ni_tio_set_bits() - Safely write a counter register.
244 * @counter: struct ni_gpct counter.
245 * @reg: the register to write.
246 * @mask: the bits to change.
247 * @value: the new bits value.
249 * Used to write to, and update the software copy, a register whose bits may
250 * be twiddled in interrupt context, or whose software copy may be read in
253 void ni_tio_set_bits(struct ni_gpct *counter, enum ni_gpct_register reg,
254 unsigned int mask, unsigned int value)
256 ni_tio_set_bits_transient(counter, reg, mask, value, 0x0);
258 EXPORT_SYMBOL_GPL(ni_tio_set_bits);
261 * ni_tio_get_soft_copy() - Safely read the software copy of a counter register.
262 * @counter: struct ni_gpct counter.
263 * @reg: the register to read.
265 * Used to get the software copy of a register whose bits might be modified
266 * in interrupt context, or whose software copy might need to be read in
269 unsigned int ni_tio_get_soft_copy(const struct ni_gpct *counter,
270 enum ni_gpct_register reg)
272 struct ni_gpct_device *counter_dev = counter->counter_dev;
273 unsigned int chip = counter->chip_index;
274 unsigned int value = 0;
277 if (reg < NITIO_NUM_REGS && chip < counter_dev->num_chips) {
278 spin_lock_irqsave(&counter_dev->regs_lock, flags);
279 value = counter_dev->regs[chip][reg];
280 spin_unlock_irqrestore(&counter_dev->regs_lock, flags);
284 EXPORT_SYMBOL_GPL(ni_tio_get_soft_copy);
286 static unsigned int ni_tio_clock_src_modifiers(const struct ni_gpct *counter)
288 struct ni_gpct_device *counter_dev = counter->counter_dev;
289 unsigned int cidx = counter->counter_index;
290 unsigned int counting_mode_bits =
291 ni_tio_get_soft_copy(counter, NITIO_CNT_MODE_REG(cidx));
292 unsigned int bits = 0;
294 if (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
296 bits |= NI_GPCT_INVERT_CLOCK_SRC_BIT;
297 if (counting_mode_bits & GI_PRESCALE_X2(counter_dev->variant))
298 bits |= NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS;
299 if (counting_mode_bits & GI_PRESCALE_X8(counter_dev->variant))
300 bits |= NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS;
304 static int ni_m_series_clock_src_select(const struct ni_gpct *counter,
305 unsigned int *clk_src)
307 struct ni_gpct_device *counter_dev = counter->counter_dev;
308 unsigned int cidx = counter->counter_index;
309 unsigned int chip = counter->chip_index;
310 unsigned int second_gate_reg = NITIO_GATE2_REG(cidx);
311 unsigned int clock_source = 0;
315 src = GI_BITS_TO_SRC(ni_tio_get_soft_copy(counter,
316 NITIO_INPUT_SEL_REG(cidx)));
319 case NI_M_TIMEBASE_1_CLK:
320 clock_source = NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS;
322 case NI_M_TIMEBASE_2_CLK:
323 clock_source = NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS;
325 case NI_M_TIMEBASE_3_CLK:
326 if (counter_dev->regs[chip][second_gate_reg] & GI_SRC_SUBSEL)
328 NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS;
330 clock_source = NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS;
332 case NI_M_LOGIC_LOW_CLK:
333 clock_source = NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS;
335 case NI_M_NEXT_GATE_CLK:
336 if (counter_dev->regs[chip][second_gate_reg] & GI_SRC_SUBSEL)
337 clock_source = NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS;
339 clock_source = NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS;
342 clock_source = NI_GPCT_PXI10_CLOCK_SRC_BITS;
344 case NI_M_NEXT_TC_CLK:
345 clock_source = NI_GPCT_NEXT_TC_CLOCK_SRC_BITS;
348 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
349 if (src == NI_M_RTSI_CLK(i)) {
350 clock_source = NI_GPCT_RTSI_CLOCK_SRC_BITS(i);
354 if (i <= NI_M_MAX_RTSI_CHAN)
356 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
357 if (src == NI_M_PFI_CLK(i)) {
358 clock_source = NI_GPCT_PFI_CLOCK_SRC_BITS(i);
362 if (i <= NI_M_MAX_PFI_CHAN)
366 clock_source |= ni_tio_clock_src_modifiers(counter);
367 *clk_src = clock_source;
371 static int ni_660x_clock_src_select(const struct ni_gpct *counter,
372 unsigned int *clk_src)
374 unsigned int clock_source = 0;
375 unsigned int cidx = counter->counter_index;
379 src = GI_BITS_TO_SRC(ni_tio_get_soft_copy(counter,
380 NITIO_INPUT_SEL_REG(cidx)));
383 case NI_660X_TIMEBASE_1_CLK:
384 clock_source = NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS;
386 case NI_660X_TIMEBASE_2_CLK:
387 clock_source = NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS;
389 case NI_660X_TIMEBASE_3_CLK:
390 clock_source = NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS;
392 case NI_660X_LOGIC_LOW_CLK:
393 clock_source = NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS;
395 case NI_660X_SRC_PIN_I_CLK:
396 clock_source = NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS;
398 case NI_660X_NEXT_GATE_CLK:
399 clock_source = NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS;
401 case NI_660X_NEXT_TC_CLK:
402 clock_source = NI_GPCT_NEXT_TC_CLOCK_SRC_BITS;
405 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
406 if (src == NI_660X_RTSI_CLK(i)) {
407 clock_source = NI_GPCT_RTSI_CLOCK_SRC_BITS(i);
411 if (i <= NI_660X_MAX_RTSI_CHAN)
413 for (i = 0; i <= NI_660X_MAX_SRC_PIN; ++i) {
414 if (src == NI_660X_SRC_PIN_CLK(i)) {
416 NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(i);
420 if (i <= NI_660X_MAX_SRC_PIN)
424 clock_source |= ni_tio_clock_src_modifiers(counter);
425 *clk_src = clock_source;
429 static int ni_tio_generic_clock_src_select(const struct ni_gpct *counter,
430 unsigned int *clk_src)
432 switch (counter->counter_dev->variant) {
433 case ni_gpct_variant_e_series:
434 case ni_gpct_variant_m_series:
436 return ni_m_series_clock_src_select(counter, clk_src);
437 case ni_gpct_variant_660x:
438 return ni_660x_clock_src_select(counter, clk_src);
442 static void ni_tio_set_sync_mode(struct ni_gpct *counter)
444 struct ni_gpct_device *counter_dev = counter->counter_dev;
445 unsigned int cidx = counter->counter_index;
446 static const u64 min_normal_sync_period_ps = 25000;
447 unsigned int mask = 0;
448 unsigned int bits = 0;
451 unsigned int clk_src = 0;
456 /* only m series and 660x variants have counting mode registers */
457 switch (counter_dev->variant) {
458 case ni_gpct_variant_e_series:
461 case ni_gpct_variant_m_series:
462 mask = GI_M_ALT_SYNC;
464 case ni_gpct_variant_660x:
465 mask = GI_660X_ALT_SYNC;
469 reg = NITIO_CNT_MODE_REG(cidx);
470 mode = ni_tio_get_soft_copy(counter, reg);
471 switch (mode & GI_CNT_MODE_MASK) {
472 case GI_CNT_MODE_QUADX1:
473 case GI_CNT_MODE_QUADX2:
474 case GI_CNT_MODE_QUADX4:
475 case GI_CNT_MODE_SYNC_SRC:
476 force_alt_sync = true;
479 force_alt_sync = false;
483 ret = ni_tio_generic_clock_src_select(counter, &clk_src);
486 ret = ni_tio_clock_period_ps(counter, clk_src, &ps);
490 * It's not clear what we should do if clock_period is unknown, so we
491 * are not using the alt sync bit in that case.
493 if (force_alt_sync || (ps && ps < min_normal_sync_period_ps))
496 ni_tio_set_bits(counter, reg, mask, bits);
499 static int ni_tio_set_counter_mode(struct ni_gpct *counter, unsigned int mode)
501 struct ni_gpct_device *counter_dev = counter->counter_dev;
502 unsigned int cidx = counter->counter_index;
503 unsigned int mode_reg_mask;
504 unsigned int mode_reg_values;
505 unsigned int input_select_bits = 0;
506 /* these bits map directly on to the mode register */
507 static const unsigned int mode_reg_direct_mask =
508 NI_GPCT_GATE_ON_BOTH_EDGES_BIT | NI_GPCT_EDGE_GATE_MODE_MASK |
509 NI_GPCT_STOP_MODE_MASK | NI_GPCT_OUTPUT_MODE_MASK |
510 NI_GPCT_HARDWARE_DISARM_MASK | NI_GPCT_LOADING_ON_TC_BIT |
511 NI_GPCT_LOADING_ON_GATE_BIT | NI_GPCT_LOAD_B_SELECT_BIT;
513 mode_reg_mask = mode_reg_direct_mask | GI_RELOAD_SRC_SWITCHING;
514 mode_reg_values = mode & mode_reg_direct_mask;
515 switch (mode & NI_GPCT_RELOAD_SOURCE_MASK) {
516 case NI_GPCT_RELOAD_SOURCE_FIXED_BITS:
518 case NI_GPCT_RELOAD_SOURCE_SWITCHING_BITS:
519 mode_reg_values |= GI_RELOAD_SRC_SWITCHING;
521 case NI_GPCT_RELOAD_SOURCE_GATE_SELECT_BITS:
522 input_select_bits |= GI_GATE_SEL_LOAD_SRC;
523 mode_reg_mask |= GI_GATING_MODE_MASK;
524 mode_reg_values |= GI_LEVEL_GATING;
529 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
530 mode_reg_mask, mode_reg_values);
532 if (ni_tio_counting_mode_registers_present(counter_dev)) {
533 unsigned int bits = 0;
535 bits |= GI_CNT_MODE(mode >> NI_GPCT_COUNTING_MODE_SHIFT);
536 bits |= GI_INDEX_PHASE((mode >> NI_GPCT_INDEX_PHASE_BITSHIFT));
537 if (mode & NI_GPCT_INDEX_ENABLE_BIT)
538 bits |= GI_INDEX_MODE;
539 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
540 GI_CNT_MODE_MASK | GI_INDEX_PHASE_MASK |
541 GI_INDEX_MODE, bits);
542 ni_tio_set_sync_mode(counter);
545 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx), GI_CNT_DIR_MASK,
546 GI_CNT_DIR(mode >> NI_GPCT_COUNTING_DIRECTION_SHIFT));
548 if (mode & NI_GPCT_OR_GATE_BIT)
549 input_select_bits |= GI_OR_GATE;
550 if (mode & NI_GPCT_INVERT_OUTPUT_BIT)
551 input_select_bits |= GI_OUTPUT_POL_INVERT;
552 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
553 GI_GATE_SEL_LOAD_SRC | GI_OR_GATE |
554 GI_OUTPUT_POL_INVERT, input_select_bits);
559 int ni_tio_arm(struct ni_gpct *counter, bool arm, unsigned int start_trigger)
561 struct ni_gpct_device *counter_dev = counter->counter_dev;
562 unsigned int cidx = counter->counter_index;
563 unsigned int transient_bits = 0;
566 unsigned int mask = 0;
567 unsigned int bits = 0;
569 /* only m series and 660x have counting mode registers */
570 switch (counter_dev->variant) {
571 case ni_gpct_variant_e_series:
574 case ni_gpct_variant_m_series:
575 mask = GI_M_HW_ARM_SEL_MASK;
577 case ni_gpct_variant_660x:
578 mask = GI_660X_HW_ARM_SEL_MASK;
582 switch (start_trigger) {
583 case NI_GPCT_ARM_IMMEDIATE:
584 transient_bits |= GI_ARM;
586 case NI_GPCT_ARM_PAIRED_IMMEDIATE:
587 transient_bits |= GI_ARM | GI_ARM_COPY;
591 * for m series and 660x, pass-through the least
592 * significant bits so we can figure out what select
595 if (mask && (start_trigger & NI_GPCT_ARM_UNKNOWN)) {
596 bits |= GI_HW_ARM_ENA |
597 (GI_HW_ARM_SEL(start_trigger) & mask);
605 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
606 GI_HW_ARM_ENA | mask, bits);
608 transient_bits |= GI_DISARM;
610 ni_tio_set_bits_transient(counter, NITIO_CMD_REG(cidx),
611 0, 0, transient_bits);
614 EXPORT_SYMBOL_GPL(ni_tio_arm);
616 static int ni_660x_clk_src(unsigned int clock_source, unsigned int *bits)
618 unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
619 unsigned int ni_660x_clock;
623 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
624 ni_660x_clock = NI_660X_TIMEBASE_1_CLK;
626 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
627 ni_660x_clock = NI_660X_TIMEBASE_2_CLK;
629 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
630 ni_660x_clock = NI_660X_TIMEBASE_3_CLK;
632 case NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS:
633 ni_660x_clock = NI_660X_LOGIC_LOW_CLK;
635 case NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS:
636 ni_660x_clock = NI_660X_SRC_PIN_I_CLK;
638 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
639 ni_660x_clock = NI_660X_NEXT_GATE_CLK;
641 case NI_GPCT_NEXT_TC_CLOCK_SRC_BITS:
642 ni_660x_clock = NI_660X_NEXT_TC_CLK;
645 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
646 if (clk_src == NI_GPCT_RTSI_CLOCK_SRC_BITS(i)) {
647 ni_660x_clock = NI_660X_RTSI_CLK(i);
651 if (i <= NI_660X_MAX_RTSI_CHAN)
653 for (i = 0; i <= NI_660X_MAX_SRC_PIN; ++i) {
654 if (clk_src == NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(i)) {
655 ni_660x_clock = NI_660X_SRC_PIN_CLK(i);
659 if (i <= NI_660X_MAX_SRC_PIN)
663 *bits = GI_SRC_SEL(ni_660x_clock);
667 static int ni_m_clk_src(unsigned int clock_source, unsigned int *bits)
669 unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
670 unsigned int ni_m_series_clock;
674 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
675 ni_m_series_clock = NI_M_TIMEBASE_1_CLK;
677 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
678 ni_m_series_clock = NI_M_TIMEBASE_2_CLK;
680 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
681 ni_m_series_clock = NI_M_TIMEBASE_3_CLK;
683 case NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS:
684 ni_m_series_clock = NI_M_LOGIC_LOW_CLK;
686 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
687 ni_m_series_clock = NI_M_NEXT_GATE_CLK;
689 case NI_GPCT_NEXT_TC_CLOCK_SRC_BITS:
690 ni_m_series_clock = NI_M_NEXT_TC_CLK;
692 case NI_GPCT_PXI10_CLOCK_SRC_BITS:
693 ni_m_series_clock = NI_M_PXI10_CLK;
695 case NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS:
696 ni_m_series_clock = NI_M_PXI_STAR_TRIGGER_CLK;
698 case NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS:
699 ni_m_series_clock = NI_M_ANALOG_TRIGGER_OUT_CLK;
702 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
703 if (clk_src == NI_GPCT_RTSI_CLOCK_SRC_BITS(i)) {
704 ni_m_series_clock = NI_M_RTSI_CLK(i);
708 if (i <= NI_M_MAX_RTSI_CHAN)
710 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
711 if (clk_src == NI_GPCT_PFI_CLOCK_SRC_BITS(i)) {
712 ni_m_series_clock = NI_M_PFI_CLK(i);
716 if (i <= NI_M_MAX_PFI_CHAN)
720 *bits = GI_SRC_SEL(ni_m_series_clock);
724 static void ni_tio_set_source_subselect(struct ni_gpct *counter,
725 unsigned int clock_source)
727 struct ni_gpct_device *counter_dev = counter->counter_dev;
728 unsigned int cidx = counter->counter_index;
729 unsigned int chip = counter->chip_index;
730 unsigned int second_gate_reg = NITIO_GATE2_REG(cidx);
732 if (counter_dev->variant != ni_gpct_variant_m_series)
734 switch (clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK) {
735 /* Gi_Source_Subselect is zero */
736 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
737 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
738 counter_dev->regs[chip][second_gate_reg] &= ~GI_SRC_SUBSEL;
740 /* Gi_Source_Subselect is one */
741 case NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS:
742 case NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS:
743 counter_dev->regs[chip][second_gate_reg] |= GI_SRC_SUBSEL;
745 /* Gi_Source_Subselect doesn't matter */
749 ni_tio_write(counter, counter_dev->regs[chip][second_gate_reg],
753 static int ni_tio_set_clock_src(struct ni_gpct *counter,
754 unsigned int clock_source,
755 unsigned int period_ns)
757 struct ni_gpct_device *counter_dev = counter->counter_dev;
758 unsigned int cidx = counter->counter_index;
759 unsigned int bits = 0;
762 switch (counter_dev->variant) {
763 case ni_gpct_variant_660x:
764 ret = ni_660x_clk_src(clock_source, &bits);
766 case ni_gpct_variant_e_series:
767 case ni_gpct_variant_m_series:
769 ret = ni_m_clk_src(clock_source, &bits);
773 struct comedi_device *dev = counter_dev->dev;
775 dev_err(dev->class_dev, "invalid clock source 0x%x\n",
780 if (clock_source & NI_GPCT_INVERT_CLOCK_SRC_BIT)
781 bits |= GI_SRC_POL_INVERT;
782 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
783 GI_SRC_SEL_MASK | GI_SRC_POL_INVERT, bits);
784 ni_tio_set_source_subselect(counter, clock_source);
786 if (ni_tio_counting_mode_registers_present(counter_dev)) {
788 switch (clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK) {
789 case NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS:
791 case NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS:
792 bits |= GI_PRESCALE_X2(counter_dev->variant);
794 case NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS:
795 bits |= GI_PRESCALE_X8(counter_dev->variant);
800 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
801 GI_PRESCALE_X2(counter_dev->variant) |
802 GI_PRESCALE_X8(counter_dev->variant), bits);
804 counter->clock_period_ps = period_ns * 1000;
805 ni_tio_set_sync_mode(counter);
809 static int ni_tio_get_clock_src(struct ni_gpct *counter,
810 unsigned int *clock_source,
811 unsigned int *period_ns)
816 ret = ni_tio_generic_clock_src_select(counter, clock_source);
819 ret = ni_tio_clock_period_ps(counter, *clock_source, &temp64);
822 do_div(temp64, 1000); /* ps to ns */
827 static inline void ni_tio_set_gate_raw(struct ni_gpct *counter,
828 unsigned int gate_source)
830 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(counter->counter_index),
831 GI_GATE_SEL_MASK, GI_GATE_SEL(gate_source));
834 static inline void ni_tio_set_gate2_raw(struct ni_gpct *counter,
835 unsigned int gate_source)
837 ni_tio_set_bits(counter, NITIO_GATE2_REG(counter->counter_index),
838 GI_GATE2_SEL_MASK, GI_GATE2_SEL(gate_source));
841 /* Set the mode bits for gate. */
842 static inline void ni_tio_set_gate_mode(struct ni_gpct *counter,
845 unsigned int mode_bits = 0;
847 if (CR_CHAN(src) & NI_GPCT_DISABLED_GATE_SELECT) {
849 * Allowing bitwise comparison here to allow non-zero raw
850 * register value to be used for channel when disabling.
852 mode_bits = GI_GATING_DISABLED;
855 mode_bits |= GI_GATE_POL_INVERT;
857 mode_bits |= GI_RISING_EDGE_GATING;
859 mode_bits |= GI_LEVEL_GATING;
861 ni_tio_set_bits(counter, NITIO_MODE_REG(counter->counter_index),
862 GI_GATE_POL_INVERT | GI_GATING_MODE_MASK,
867 * Set the mode bits for gate2.
869 * Previously, the code this function represents did not actually write anything
870 * to the register. Rather, writing to this register was reserved for the code
871 * ni ni_tio_set_gate2_raw.
873 static inline void ni_tio_set_gate2_mode(struct ni_gpct *counter,
877 * The GI_GATE2_MODE bit was previously set in the code that also sets
879 * We'll set mode bits _after_ source bits now, and thus, this function
880 * will effectively enable the second gate after all bits are set.
882 unsigned int mode_bits = GI_GATE2_MODE;
884 if (CR_CHAN(src) & NI_GPCT_DISABLED_GATE_SELECT)
886 * Allowing bitwise comparison here to allow non-zero raw
887 * register value to be used for channel when disabling.
889 mode_bits = GI_GATING_DISABLED;
891 mode_bits |= GI_GATE2_POL_INVERT;
893 ni_tio_set_bits(counter, NITIO_GATE2_REG(counter->counter_index),
894 GI_GATE2_POL_INVERT | GI_GATE2_MODE, mode_bits);
897 static int ni_660x_set_gate(struct ni_gpct *counter, unsigned int gate_source)
899 unsigned int chan = CR_CHAN(gate_source);
900 unsigned int gate_sel;
904 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
905 gate_sel = NI_660X_NEXT_SRC_GATE_SEL;
907 case NI_GPCT_NEXT_OUT_GATE_SELECT:
908 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
909 case NI_GPCT_SOURCE_PIN_i_GATE_SELECT:
910 case NI_GPCT_GATE_PIN_i_GATE_SELECT:
911 gate_sel = chan & 0x1f;
914 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
915 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
916 gate_sel = chan & 0x1f;
920 if (i <= NI_660X_MAX_RTSI_CHAN)
922 for (i = 0; i <= NI_660X_MAX_GATE_PIN; ++i) {
923 if (chan == NI_GPCT_GATE_PIN_GATE_SELECT(i)) {
924 gate_sel = chan & 0x1f;
928 if (i <= NI_660X_MAX_GATE_PIN)
932 ni_tio_set_gate_raw(counter, gate_sel);
936 static int ni_m_set_gate(struct ni_gpct *counter, unsigned int gate_source)
938 unsigned int chan = CR_CHAN(gate_source);
939 unsigned int gate_sel;
943 case NI_GPCT_TIMESTAMP_MUX_GATE_SELECT:
944 case NI_GPCT_AI_START2_GATE_SELECT:
945 case NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT:
946 case NI_GPCT_NEXT_OUT_GATE_SELECT:
947 case NI_GPCT_AI_START1_GATE_SELECT:
948 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
949 case NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT:
950 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
951 gate_sel = chan & 0x1f;
954 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
955 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
956 gate_sel = chan & 0x1f;
960 if (i <= NI_M_MAX_RTSI_CHAN)
962 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
963 if (chan == NI_GPCT_PFI_GATE_SELECT(i)) {
964 gate_sel = chan & 0x1f;
968 if (i <= NI_M_MAX_PFI_CHAN)
972 ni_tio_set_gate_raw(counter, gate_sel);
976 static int ni_660x_set_gate2(struct ni_gpct *counter, unsigned int gate_source)
978 unsigned int chan = CR_CHAN(gate_source);
979 unsigned int gate2_sel;
983 case NI_GPCT_SOURCE_PIN_i_GATE_SELECT:
984 case NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT:
985 case NI_GPCT_SELECTED_GATE_GATE_SELECT:
986 case NI_GPCT_NEXT_OUT_GATE_SELECT:
987 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
988 gate2_sel = chan & 0x1f;
990 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
991 gate2_sel = NI_660X_NEXT_SRC_GATE2_SEL;
994 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
995 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
996 gate2_sel = chan & 0x1f;
1000 if (i <= NI_660X_MAX_RTSI_CHAN)
1002 for (i = 0; i <= NI_660X_MAX_UP_DOWN_PIN; ++i) {
1003 if (chan == NI_GPCT_UP_DOWN_PIN_GATE_SELECT(i)) {
1004 gate2_sel = chan & 0x1f;
1008 if (i <= NI_660X_MAX_UP_DOWN_PIN)
1012 ni_tio_set_gate2_raw(counter, gate2_sel);
1016 static int ni_m_set_gate2(struct ni_gpct *counter, unsigned int gate_source)
1019 * FIXME: We don't know what the m-series second gate codes are,
1020 * so we'll just pass the bits through for now.
1022 ni_tio_set_gate2_raw(counter, gate_source);
1026 int ni_tio_set_gate_src_raw(struct ni_gpct *counter,
1027 unsigned int gate, unsigned int src)
1029 struct ni_gpct_device *counter_dev = counter->counter_dev;
1033 /* 1. start by disabling gate */
1034 ni_tio_set_gate_mode(counter, NI_GPCT_DISABLED_GATE_SELECT);
1035 /* 2. set the requested gate source */
1036 ni_tio_set_gate_raw(counter, src);
1037 /* 3. reenable & set mode to starts things back up */
1038 ni_tio_set_gate_mode(counter, src);
1041 if (!ni_tio_has_gate2_registers(counter_dev))
1044 /* 1. start by disabling gate */
1045 ni_tio_set_gate2_mode(counter, NI_GPCT_DISABLED_GATE_SELECT);
1046 /* 2. set the requested gate source */
1047 ni_tio_set_gate2_raw(counter, src);
1048 /* 3. reenable & set mode to starts things back up */
1049 ni_tio_set_gate2_mode(counter, src);
1056 EXPORT_SYMBOL_GPL(ni_tio_set_gate_src_raw);
1058 int ni_tio_set_gate_src(struct ni_gpct *counter,
1059 unsigned int gate, unsigned int src)
1061 struct ni_gpct_device *counter_dev = counter->counter_dev;
1063 * mask off disable flag. This high bit still passes CR_CHAN.
1064 * Doing this allows one to both set the gate as disabled, but also
1065 * change the route value of the gate.
1067 int chan = CR_CHAN(src) & (~NI_GPCT_DISABLED_GATE_SELECT);
1072 /* 1. start by disabling gate */
1073 ni_tio_set_gate_mode(counter, NI_GPCT_DISABLED_GATE_SELECT);
1074 /* 2. set the requested gate source */
1075 switch (counter_dev->variant) {
1076 case ni_gpct_variant_e_series:
1077 case ni_gpct_variant_m_series:
1078 ret = ni_m_set_gate(counter, chan);
1080 case ni_gpct_variant_660x:
1081 ret = ni_660x_set_gate(counter, chan);
1088 /* 3. reenable & set mode to starts things back up */
1089 ni_tio_set_gate_mode(counter, src);
1092 if (!ni_tio_has_gate2_registers(counter_dev))
1095 /* 1. start by disabling gate */
1096 ni_tio_set_gate2_mode(counter, NI_GPCT_DISABLED_GATE_SELECT);
1097 /* 2. set the requested gate source */
1098 switch (counter_dev->variant) {
1099 case ni_gpct_variant_m_series:
1100 ret = ni_m_set_gate2(counter, chan);
1102 case ni_gpct_variant_660x:
1103 ret = ni_660x_set_gate2(counter, chan);
1110 /* 3. reenable & set mode to starts things back up */
1111 ni_tio_set_gate2_mode(counter, src);
1118 EXPORT_SYMBOL_GPL(ni_tio_set_gate_src);
1120 static int ni_tio_set_other_src(struct ni_gpct *counter, unsigned int index,
1121 unsigned int source)
1123 struct ni_gpct_device *counter_dev = counter->counter_dev;
1124 unsigned int cidx = counter->counter_index;
1125 unsigned int chip = counter->chip_index;
1126 unsigned int abz_reg, shift, mask;
1128 if (counter_dev->variant != ni_gpct_variant_m_series)
1131 abz_reg = NITIO_ABZ_REG(cidx);
1133 /* allow for new device-global names */
1134 if (index == NI_GPCT_SOURCE_ENCODER_A ||
1135 (index >= NI_CtrA(0) && index <= NI_CtrA(-1))) {
1137 } else if (index == NI_GPCT_SOURCE_ENCODER_B ||
1138 (index >= NI_CtrB(0) && index <= NI_CtrB(-1))) {
1140 } else if (index == NI_GPCT_SOURCE_ENCODER_Z ||
1141 (index >= NI_CtrZ(0) && index <= NI_CtrZ(-1))) {
1147 mask = 0x1f << shift;
1149 source = 0x1f; /* Disable gate */
1151 counter_dev->regs[chip][abz_reg] &= ~mask;
1152 counter_dev->regs[chip][abz_reg] |= (source << shift) & mask;
1153 ni_tio_write(counter, counter_dev->regs[chip][abz_reg], abz_reg);
1157 static int ni_tio_get_other_src(struct ni_gpct *counter, unsigned int index,
1158 unsigned int *source)
1160 struct ni_gpct_device *counter_dev = counter->counter_dev;
1161 unsigned int cidx = counter->counter_index;
1162 unsigned int abz_reg, shift, mask;
1164 if (counter_dev->variant != ni_gpct_variant_m_series)
1165 /* A,B,Z only valid for m-series */
1168 abz_reg = NITIO_ABZ_REG(cidx);
1170 /* allow for new device-global names */
1171 if (index == NI_GPCT_SOURCE_ENCODER_A ||
1172 (index >= NI_CtrA(0) && index <= NI_CtrA(-1))) {
1174 } else if (index == NI_GPCT_SOURCE_ENCODER_B ||
1175 (index >= NI_CtrB(0) && index <= NI_CtrB(-1))) {
1177 } else if (index == NI_GPCT_SOURCE_ENCODER_Z ||
1178 (index >= NI_CtrZ(0) && index <= NI_CtrZ(-1))) {
1186 *source = (ni_tio_get_soft_copy(counter, abz_reg) >> shift) & mask;
1190 static int ni_660x_gate_to_generic_gate(unsigned int gate, unsigned int *src)
1192 unsigned int source;
1196 case NI_660X_SRC_PIN_I_GATE_SEL:
1197 source = NI_GPCT_SOURCE_PIN_i_GATE_SELECT;
1199 case NI_660X_GATE_PIN_I_GATE_SEL:
1200 source = NI_GPCT_GATE_PIN_i_GATE_SELECT;
1202 case NI_660X_NEXT_SRC_GATE_SEL:
1203 source = NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1205 case NI_660X_NEXT_OUT_GATE_SEL:
1206 source = NI_GPCT_NEXT_OUT_GATE_SELECT;
1208 case NI_660X_LOGIC_LOW_GATE_SEL:
1209 source = NI_GPCT_LOGIC_LOW_GATE_SELECT;
1212 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
1213 if (gate == NI_660X_RTSI_GATE_SEL(i)) {
1214 source = NI_GPCT_RTSI_GATE_SELECT(i);
1218 if (i <= NI_660X_MAX_RTSI_CHAN)
1220 for (i = 0; i <= NI_660X_MAX_GATE_PIN; ++i) {
1221 if (gate == NI_660X_PIN_GATE_SEL(i)) {
1222 source = NI_GPCT_GATE_PIN_GATE_SELECT(i);
1226 if (i <= NI_660X_MAX_GATE_PIN)
1234 static int ni_m_gate_to_generic_gate(unsigned int gate, unsigned int *src)
1236 unsigned int source;
1240 case NI_M_TIMESTAMP_MUX_GATE_SEL:
1241 source = NI_GPCT_TIMESTAMP_MUX_GATE_SELECT;
1243 case NI_M_AI_START2_GATE_SEL:
1244 source = NI_GPCT_AI_START2_GATE_SELECT;
1246 case NI_M_PXI_STAR_TRIGGER_GATE_SEL:
1247 source = NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT;
1249 case NI_M_NEXT_OUT_GATE_SEL:
1250 source = NI_GPCT_NEXT_OUT_GATE_SELECT;
1252 case NI_M_AI_START1_GATE_SEL:
1253 source = NI_GPCT_AI_START1_GATE_SELECT;
1255 case NI_M_NEXT_SRC_GATE_SEL:
1256 source = NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1258 case NI_M_ANALOG_TRIG_OUT_GATE_SEL:
1259 source = NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT;
1261 case NI_M_LOGIC_LOW_GATE_SEL:
1262 source = NI_GPCT_LOGIC_LOW_GATE_SELECT;
1265 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
1266 if (gate == NI_M_RTSI_GATE_SEL(i)) {
1267 source = NI_GPCT_RTSI_GATE_SELECT(i);
1271 if (i <= NI_M_MAX_RTSI_CHAN)
1273 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
1274 if (gate == NI_M_PFI_GATE_SEL(i)) {
1275 source = NI_GPCT_PFI_GATE_SELECT(i);
1279 if (i <= NI_M_MAX_PFI_CHAN)
1287 static int ni_660x_gate2_to_generic_gate(unsigned int gate, unsigned int *src)
1289 unsigned int source;
1293 case NI_660X_SRC_PIN_I_GATE2_SEL:
1294 source = NI_GPCT_SOURCE_PIN_i_GATE_SELECT;
1296 case NI_660X_UD_PIN_I_GATE2_SEL:
1297 source = NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT;
1299 case NI_660X_NEXT_SRC_GATE2_SEL:
1300 source = NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1302 case NI_660X_NEXT_OUT_GATE2_SEL:
1303 source = NI_GPCT_NEXT_OUT_GATE_SELECT;
1305 case NI_660X_SELECTED_GATE2_SEL:
1306 source = NI_GPCT_SELECTED_GATE_GATE_SELECT;
1308 case NI_660X_LOGIC_LOW_GATE2_SEL:
1309 source = NI_GPCT_LOGIC_LOW_GATE_SELECT;
1312 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
1313 if (gate == NI_660X_RTSI_GATE2_SEL(i)) {
1314 source = NI_GPCT_RTSI_GATE_SELECT(i);
1318 if (i <= NI_660X_MAX_RTSI_CHAN)
1320 for (i = 0; i <= NI_660X_MAX_UP_DOWN_PIN; ++i) {
1321 if (gate == NI_660X_UD_PIN_GATE2_SEL(i)) {
1322 source = NI_GPCT_UP_DOWN_PIN_GATE_SELECT(i);
1326 if (i <= NI_660X_MAX_UP_DOWN_PIN)
1334 static int ni_m_gate2_to_generic_gate(unsigned int gate, unsigned int *src)
1337 * FIXME: the second gate sources for the m series are undocumented,
1338 * so we just return the raw bits for now.
1344 static inline unsigned int ni_tio_get_gate_mode(struct ni_gpct *counter)
1346 unsigned int mode = ni_tio_get_soft_copy(
1347 counter, NITIO_MODE_REG(counter->counter_index));
1348 unsigned int ret = 0;
1350 if ((mode & GI_GATING_MODE_MASK) == GI_GATING_DISABLED)
1351 ret |= NI_GPCT_DISABLED_GATE_SELECT;
1352 if (mode & GI_GATE_POL_INVERT)
1354 if ((mode & GI_GATING_MODE_MASK) != GI_LEVEL_GATING)
1360 static inline unsigned int ni_tio_get_gate2_mode(struct ni_gpct *counter)
1362 unsigned int mode = ni_tio_get_soft_copy(
1363 counter, NITIO_GATE2_REG(counter->counter_index));
1364 unsigned int ret = 0;
1366 if (!(mode & GI_GATE2_MODE))
1367 ret |= NI_GPCT_DISABLED_GATE_SELECT;
1368 if (mode & GI_GATE2_POL_INVERT)
1374 static inline unsigned int ni_tio_get_gate_val(struct ni_gpct *counter)
1376 return GI_BITS_TO_GATE(ni_tio_get_soft_copy(counter,
1377 NITIO_INPUT_SEL_REG(counter->counter_index)));
1380 static inline unsigned int ni_tio_get_gate2_val(struct ni_gpct *counter)
1382 return GI_BITS_TO_GATE2(ni_tio_get_soft_copy(counter,
1383 NITIO_GATE2_REG(counter->counter_index)));
1386 static int ni_tio_get_gate_src(struct ni_gpct *counter, unsigned int gate_index,
1387 unsigned int *gate_source)
1392 switch (gate_index) {
1394 gate = ni_tio_get_gate_val(counter);
1395 switch (counter->counter_dev->variant) {
1396 case ni_gpct_variant_e_series:
1397 case ni_gpct_variant_m_series:
1399 ret = ni_m_gate_to_generic_gate(gate, gate_source);
1401 case ni_gpct_variant_660x:
1402 ret = ni_660x_gate_to_generic_gate(gate, gate_source);
1407 *gate_source |= ni_tio_get_gate_mode(counter);
1410 gate = ni_tio_get_gate2_val(counter);
1411 switch (counter->counter_dev->variant) {
1412 case ni_gpct_variant_e_series:
1413 case ni_gpct_variant_m_series:
1415 ret = ni_m_gate2_to_generic_gate(gate, gate_source);
1417 case ni_gpct_variant_660x:
1418 ret = ni_660x_gate2_to_generic_gate(gate, gate_source);
1423 *gate_source |= ni_tio_get_gate2_mode(counter);
1431 static int ni_tio_get_gate_src_raw(struct ni_gpct *counter,
1432 unsigned int gate_index,
1433 unsigned int *gate_source)
1435 switch (gate_index) {
1437 *gate_source = ni_tio_get_gate_mode(counter)
1438 | ni_tio_get_gate_val(counter);
1441 *gate_source = ni_tio_get_gate2_mode(counter)
1442 | ni_tio_get_gate2_val(counter);
1450 int ni_tio_insn_config(struct comedi_device *dev,
1451 struct comedi_subdevice *s,
1452 struct comedi_insn *insn,
1455 struct ni_gpct *counter = s->private;
1456 unsigned int cidx = counter->counter_index;
1457 unsigned int status;
1461 case INSN_CONFIG_SET_COUNTER_MODE:
1462 ret = ni_tio_set_counter_mode(counter, data[1]);
1464 case INSN_CONFIG_ARM:
1465 ret = ni_tio_arm(counter, true, data[1]);
1467 case INSN_CONFIG_DISARM:
1468 ret = ni_tio_arm(counter, false, 0);
1470 case INSN_CONFIG_GET_COUNTER_STATUS:
1472 status = ni_tio_read(counter, NITIO_SHARED_STATUS_REG(cidx));
1473 if (status & GI_ARMED(cidx)) {
1474 data[1] |= COMEDI_COUNTER_ARMED;
1475 if (status & GI_COUNTING(cidx))
1476 data[1] |= COMEDI_COUNTER_COUNTING;
1478 data[2] = COMEDI_COUNTER_ARMED | COMEDI_COUNTER_COUNTING;
1480 case INSN_CONFIG_SET_CLOCK_SRC:
1481 ret = ni_tio_set_clock_src(counter, data[1], data[2]);
1483 case INSN_CONFIG_GET_CLOCK_SRC:
1484 ret = ni_tio_get_clock_src(counter, &data[1], &data[2]);
1486 case INSN_CONFIG_SET_GATE_SRC:
1487 ret = ni_tio_set_gate_src(counter, data[1], data[2]);
1489 case INSN_CONFIG_GET_GATE_SRC:
1490 ret = ni_tio_get_gate_src(counter, data[1], &data[2]);
1492 case INSN_CONFIG_SET_OTHER_SRC:
1493 ret = ni_tio_set_other_src(counter, data[1], data[2]);
1495 case INSN_CONFIG_RESET:
1496 ni_tio_reset_count_and_disarm(counter);
1501 return ret ? ret : insn->n;
1503 EXPORT_SYMBOL_GPL(ni_tio_insn_config);
1506 * Retrieves the register value of the current source of the output selector for
1507 * the given destination.
1509 * If the terminal for the destination is not already configured as an output,
1510 * this function returns -EINVAL as error.
1512 * Return: the register value of the destination output selector;
1513 * -EINVAL if terminal is not configured for output.
1515 int ni_tio_get_routing(struct ni_gpct_device *counter_dev, unsigned int dest)
1517 /* we need to know the actual counter below... */
1518 int ctr_index = (dest - NI_COUNTER_NAMES_BASE) % NI_MAX_COUNTERS;
1519 struct ni_gpct *counter = &counter_dev->counters[ctr_index];
1523 if (dest >= NI_CtrA(0) && dest <= NI_CtrZ(-1)) {
1524 ret = ni_tio_get_other_src(counter, dest, ®);
1525 } else if (dest >= NI_CtrGate(0) && dest <= NI_CtrGate(-1)) {
1526 ret = ni_tio_get_gate_src_raw(counter, 0, ®);
1527 } else if (dest >= NI_CtrAux(0) && dest <= NI_CtrAux(-1)) {
1528 ret = ni_tio_get_gate_src_raw(counter, 1, ®);
1530 * This case is not possible through this interface. A user must use
1531 * INSN_CONFIG_SET_CLOCK_SRC instead.
1532 * } else if (dest >= NI_CtrSource(0) && dest <= NI_CtrSource(-1)) {
1533 * ret = ni_tio_set_clock_src(counter, ®, &period_ns);
1542 EXPORT_SYMBOL_GPL(ni_tio_get_routing);
1545 * Sets the register value of the selector MUX for the given destination.
1546 * @counter_dev:Pointer to general counter device.
1547 * @destination:Device-global identifier of route destination.
1549 * The first several bits of this value should store the desired
1550 * value to write to the register. All other bits are for
1551 * transmitting information that modify the mode of the particular
1552 * destination/gate. These mode bits might include a bitwise or of
1553 * CR_INVERT and CR_EDGE. Note that the calling function should
1554 * have already validated the correctness of this value.
1556 int ni_tio_set_routing(struct ni_gpct_device *counter_dev, unsigned int dest,
1559 /* we need to know the actual counter below... */
1560 int ctr_index = (dest - NI_COUNTER_NAMES_BASE) % NI_MAX_COUNTERS;
1561 struct ni_gpct *counter = &counter_dev->counters[ctr_index];
1564 if (dest >= NI_CtrA(0) && dest <= NI_CtrZ(-1)) {
1565 ret = ni_tio_set_other_src(counter, dest, reg);
1566 } else if (dest >= NI_CtrGate(0) && dest <= NI_CtrGate(-1)) {
1567 ret = ni_tio_set_gate_src_raw(counter, 0, reg);
1568 } else if (dest >= NI_CtrAux(0) && dest <= NI_CtrAux(-1)) {
1569 ret = ni_tio_set_gate_src_raw(counter, 1, reg);
1571 * This case is not possible through this interface. A user must use
1572 * INSN_CONFIG_SET_CLOCK_SRC instead.
1573 * } else if (dest >= NI_CtrSource(0) && dest <= NI_CtrSource(-1)) {
1574 * ret = ni_tio_set_clock_src(counter, reg, period_ns);
1582 EXPORT_SYMBOL_GPL(ni_tio_set_routing);
1585 * Sets the given destination MUX to its default value or disable it.
1587 * Return: 0 if successful; -EINVAL if terminal is unknown.
1589 int ni_tio_unset_routing(struct ni_gpct_device *counter_dev, unsigned int dest)
1591 if (dest >= NI_GATES_NAMES_BASE && dest <= NI_GATES_NAMES_MAX)
1592 /* Disable gate (via mode bits) and set to default 0-value */
1593 return ni_tio_set_routing(counter_dev, dest,
1594 NI_GPCT_DISABLED_GATE_SELECT);
1596 * This case is not possible through this interface. A user must use
1597 * INSN_CONFIG_SET_CLOCK_SRC instead.
1598 * if (dest >= NI_CtrSource(0) && dest <= NI_CtrSource(-1))
1599 * return ni_tio_set_clock_src(counter, reg, period_ns);
1604 EXPORT_SYMBOL_GPL(ni_tio_unset_routing);
1606 static unsigned int ni_tio_read_sw_save_reg(struct comedi_device *dev,
1607 struct comedi_subdevice *s)
1609 struct ni_gpct *counter = s->private;
1610 unsigned int cidx = counter->counter_index;
1613 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx), GI_SAVE_TRACE, 0);
1614 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
1615 GI_SAVE_TRACE, GI_SAVE_TRACE);
1618 * The count doesn't get latched until the next clock edge, so it is
1619 * possible the count may change (once) while we are reading. Since
1620 * the read of the SW_Save_Reg isn't atomic (apparently even when it's
1621 * a 32 bit register according to 660x docs), we need to read twice
1622 * and make sure the reading hasn't changed. If it has, a third read
1623 * will be correct since the count value will definitely have latched
1626 val = ni_tio_read(counter, NITIO_SW_SAVE_REG(cidx));
1627 if (val != ni_tio_read(counter, NITIO_SW_SAVE_REG(cidx)))
1628 val = ni_tio_read(counter, NITIO_SW_SAVE_REG(cidx));
1633 int ni_tio_insn_read(struct comedi_device *dev,
1634 struct comedi_subdevice *s,
1635 struct comedi_insn *insn,
1638 struct ni_gpct *counter = s->private;
1639 struct ni_gpct_device *counter_dev = counter->counter_dev;
1640 unsigned int channel = CR_CHAN(insn->chanspec);
1641 unsigned int cidx = counter->counter_index;
1642 unsigned int chip = counter->chip_index;
1645 for (i = 0; i < insn->n; i++) {
1648 data[i] = ni_tio_read_sw_save_reg(dev, s);
1652 counter_dev->regs[chip][NITIO_LOADA_REG(cidx)];
1656 counter_dev->regs[chip][NITIO_LOADB_REG(cidx)];
1662 EXPORT_SYMBOL_GPL(ni_tio_insn_read);
1664 static unsigned int ni_tio_next_load_register(struct ni_gpct *counter)
1666 unsigned int cidx = counter->counter_index;
1667 unsigned int bits = ni_tio_read(counter, NITIO_SHARED_STATUS_REG(cidx));
1669 return (bits & GI_NEXT_LOAD_SRC(cidx))
1670 ? NITIO_LOADB_REG(cidx)
1671 : NITIO_LOADA_REG(cidx);
1674 int ni_tio_insn_write(struct comedi_device *dev,
1675 struct comedi_subdevice *s,
1676 struct comedi_insn *insn,
1679 struct ni_gpct *counter = s->private;
1680 struct ni_gpct_device *counter_dev = counter->counter_dev;
1681 unsigned int channel = CR_CHAN(insn->chanspec);
1682 unsigned int cidx = counter->counter_index;
1683 unsigned int chip = counter->chip_index;
1684 unsigned int load_reg;
1691 * Unsafe if counter is armed.
1692 * Should probably check status and return -EBUSY if armed.
1696 * Don't disturb load source select, just use whichever
1697 * load register is already selected.
1699 load_reg = ni_tio_next_load_register(counter);
1700 ni_tio_write(counter, data[0], load_reg);
1701 ni_tio_set_bits_transient(counter, NITIO_CMD_REG(cidx),
1703 /* restore load reg */
1704 ni_tio_write(counter, counter_dev->regs[chip][load_reg],
1708 counter_dev->regs[chip][NITIO_LOADA_REG(cidx)] = data[0];
1709 ni_tio_write(counter, data[0], NITIO_LOADA_REG(cidx));
1712 counter_dev->regs[chip][NITIO_LOADB_REG(cidx)] = data[0];
1713 ni_tio_write(counter, data[0], NITIO_LOADB_REG(cidx));
1720 EXPORT_SYMBOL_GPL(ni_tio_insn_write);
1722 void ni_tio_init_counter(struct ni_gpct *counter)
1724 struct ni_gpct_device *counter_dev = counter->counter_dev;
1725 unsigned int cidx = counter->counter_index;
1726 unsigned int chip = counter->chip_index;
1728 ni_tio_reset_count_and_disarm(counter);
1730 /* initialize counter registers */
1731 counter_dev->regs[chip][NITIO_AUTO_INC_REG(cidx)] = 0x0;
1732 ni_tio_write(counter, 0x0, NITIO_AUTO_INC_REG(cidx));
1734 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
1737 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx), ~0, 0);
1739 counter_dev->regs[chip][NITIO_LOADA_REG(cidx)] = 0x0;
1740 ni_tio_write(counter, 0x0, NITIO_LOADA_REG(cidx));
1742 counter_dev->regs[chip][NITIO_LOADB_REG(cidx)] = 0x0;
1743 ni_tio_write(counter, 0x0, NITIO_LOADB_REG(cidx));
1745 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx), ~0, 0);
1747 if (ni_tio_counting_mode_registers_present(counter_dev))
1748 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx), ~0, 0);
1750 if (ni_tio_has_gate2_registers(counter_dev)) {
1751 counter_dev->regs[chip][NITIO_GATE2_REG(cidx)] = 0x0;
1752 ni_tio_write(counter, 0x0, NITIO_GATE2_REG(cidx));
1755 ni_tio_set_bits(counter, NITIO_DMA_CFG_REG(cidx), ~0, 0x0);
1757 ni_tio_set_bits(counter, NITIO_INT_ENA_REG(cidx), ~0, 0x0);
1759 EXPORT_SYMBOL_GPL(ni_tio_init_counter);
1761 struct ni_gpct_device *
1762 ni_gpct_device_construct(struct comedi_device *dev,
1763 void (*write)(struct ni_gpct *counter,
1765 enum ni_gpct_register reg),
1766 unsigned int (*read)(struct ni_gpct *counter,
1767 enum ni_gpct_register reg),
1768 enum ni_gpct_variant variant,
1769 unsigned int num_counters,
1770 unsigned int counters_per_chip,
1771 const struct ni_route_tables *routing_tables)
1773 struct ni_gpct_device *counter_dev;
1774 struct ni_gpct *counter;
1777 if (num_counters == 0 || counters_per_chip == 0)
1780 counter_dev = kzalloc(sizeof(*counter_dev), GFP_KERNEL);
1784 counter_dev->dev = dev;
1785 counter_dev->write = write;
1786 counter_dev->read = read;
1787 counter_dev->variant = variant;
1788 counter_dev->routing_tables = routing_tables;
1790 spin_lock_init(&counter_dev->regs_lock);
1792 counter_dev->num_counters = num_counters;
1793 counter_dev->num_chips = DIV_ROUND_UP(num_counters, counters_per_chip);
1795 counter_dev->counters = kcalloc(num_counters, sizeof(*counter),
1797 counter_dev->regs = kcalloc(counter_dev->num_chips,
1798 sizeof(*counter_dev->regs), GFP_KERNEL);
1799 if (!counter_dev->regs || !counter_dev->counters) {
1800 kfree(counter_dev->regs);
1801 kfree(counter_dev->counters);
1806 for (i = 0; i < num_counters; ++i) {
1807 counter = &counter_dev->counters[i];
1808 counter->counter_dev = counter_dev;
1809 counter->chip_index = i / counters_per_chip;
1810 counter->counter_index = i % counters_per_chip;
1811 spin_lock_init(&counter->lock);
1816 EXPORT_SYMBOL_GPL(ni_gpct_device_construct);
1818 void ni_gpct_device_destroy(struct ni_gpct_device *counter_dev)
1822 kfree(counter_dev->regs);
1823 kfree(counter_dev->counters);
1826 EXPORT_SYMBOL_GPL(ni_gpct_device_destroy);
1828 static int __init ni_tio_init_module(void)
1832 module_init(ni_tio_init_module);
1834 static void __exit ni_tio_cleanup_module(void)
1837 module_exit(ni_tio_cleanup_module);
1839 MODULE_AUTHOR("Comedi <comedi@comedi.org>");
1840 MODULE_DESCRIPTION("Comedi support for NI general-purpose counters");
1841 MODULE_LICENSE("GPL");