2 comedi/drivers/ni_tio.c
3 Support for NI general purpose counters
5 Copyright (C) 2006 Frank Mori Hess <fmhess@users.sourceforge.net>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
20 Description: National Instruments general purpose counters
22 Author: J.P. Mellor <jpmellor@rose-hulman.edu>,
23 Herman.Bruyninckx@mech.kuleuven.ac.be,
24 Wim.Meeussen@mech.kuleuven.ac.be,
25 Klaas.Gadeyne@mech.kuleuven.ac.be,
26 Frank Mori Hess <fmhess@users.sourceforge.net>
27 Updated: Thu Nov 16 09:50:32 EST 2006
30 This module is not used directly by end-users. Rather, it
31 is used by other drivers (for example ni_660x and ni_pcimio)
32 to provide support for NI's general purpose counters. It was
33 originally based on the counter code from ni_660x.c and
37 DAQ 660x Register-Level Programmer Manual (NI 370505A-01)
38 DAQ 6601/6602 User Manual (NI 322137B-01)
39 340934b.pdf DAQ-STC reference manual
44 Support use of both banks X and Y
47 #include <linux/module.h>
48 #include <linux/slab.h>
50 #include "ni_tio_internal.h"
53 * clock sources for ni e and m series boards,
54 * get bits with Gi_Source_Select_Bits()
56 #define NI_M_TIMEBASE_1_CLK 0x0 /* 20MHz */
57 #define NI_M_PFI_CLK(x) (((x) < 10) ? (1 + (x)) : (0xb + (x)))
58 #define NI_M_RTSI_CLK(x) (((x) == 7) ? 0x1b : (0xb + (x)))
59 #define NI_M_TIMEBASE_2_CLK 0x12 /* 100KHz */
60 #define NI_M_NEXT_TC_CLK 0x13
61 #define NI_M_NEXT_GATE_CLK 0x14 /* Gi_Src_SubSelect=0 */
62 #define NI_M_PXI_STAR_TRIGGER_CLK 0x14 /* Gi_Src_SubSelect=1 */
63 #define NI_M_PXI10_CLK 0x1d
64 #define NI_M_TIMEBASE_3_CLK 0x1e /* 80MHz, Gi_Src_SubSelect=0 */
65 #define NI_M_ANALOG_TRIGGER_OUT_CLK 0x1e /* Gi_Src_SubSelect=1 */
66 #define NI_M_LOGIC_LOW_CLK 0x1f
67 #define NI_M_MAX_PFI_CHAN 15
68 #define NI_M_MAX_RTSI_CHAN 7
71 * clock sources for ni_660x boards,
72 * get bits with Gi_Source_Select_Bits()
74 #define NI_660X_TIMEBASE_1_CLK 0x0 /* 20MHz */
75 #define NI_660X_SRC_PIN_I_CLK 0x1
76 #define NI_660X_SRC_PIN_CLK(x) (0x2 + (x))
77 #define NI_660X_NEXT_GATE_CLK 0xa
78 #define NI_660X_RTSI_CLK(x) (0xb + (x))
79 #define NI_660X_TIMEBASE_2_CLK 0x12 /* 100KHz */
80 #define NI_660X_NEXT_TC_CLK 0x13
81 #define NI_660X_TIMEBASE_3_CLK 0x1e /* 80MHz */
82 #define NI_660X_LOGIC_LOW_CLK 0x1f
83 #define NI_660X_MAX_SRC_PIN 7
84 #define NI_660X_MAX_RTSI_CHAN 6
86 /* ni m series gate_select */
87 #define NI_M_TIMESTAMP_MUX_GATE_SEL 0x0
88 #define NI_M_PFI_GATE_SEL(x) (((x) < 10) ? (1 + (x)) : (0xb + (x)))
89 #define NI_M_RTSI_GATE_SEL(x) (((x) == 7) ? 0x1b : (0xb + (x)))
90 #define NI_M_AI_START2_GATE_SEL 0x12
91 #define NI_M_PXI_STAR_TRIGGER_GATE_SEL 0x13
92 #define NI_M_NEXT_OUT_GATE_SEL 0x14
93 #define NI_M_AI_START1_GATE_SEL 0x1c
94 #define NI_M_NEXT_SRC_GATE_SEL 0x1d
95 #define NI_M_ANALOG_TRIG_OUT_GATE_SEL 0x1e
96 #define NI_M_LOGIC_LOW_GATE_SEL 0x1f
98 /* ni_660x gate select */
99 #define NI_660X_SRC_PIN_I_GATE_SEL 0x0
100 #define NI_660X_GATE_PIN_I_GATE_SEL 0x1
101 #define NI_660X_PIN_GATE_SEL(x) (0x2 + (x))
102 #define NI_660X_NEXT_SRC_GATE_SEL 0xa
103 #define NI_660X_RTSI_GATE_SEL(x) (0xb + (x))
104 #define NI_660X_NEXT_OUT_GATE_SEL 0x14
105 #define NI_660X_LOGIC_LOW_GATE_SEL 0x1f
106 #define NI_660X_MAX_GATE_PIN 7
108 /* ni_660x second gate select */
109 #define NI_660X_SRC_PIN_I_GATE2_SEL 0x0
110 #define NI_660X_UD_PIN_I_GATE2_SEL 0x1
111 #define NI_660X_UD_PIN_GATE2_SEL(x) (0x2 + (x))
112 #define NI_660X_NEXT_SRC_GATE2_SEL 0xa
113 #define NI_660X_RTSI_GATE2_SEL(x) (0xb + (x))
114 #define NI_660X_NEXT_OUT_GATE2_SEL 0x14
115 #define NI_660X_SELECTED_GATE2_SEL 0x1e
116 #define NI_660X_LOGIC_LOW_GATE2_SEL 0x1f
117 #define NI_660X_MAX_UP_DOWN_PIN 7
119 static uint64_t ni_tio_clock_period_ps(const struct ni_gpct *counter,
120 unsigned generic_clock_source);
121 static unsigned ni_tio_generic_clock_src_select(const struct ni_gpct *counter);
123 static inline enum Gi_Counting_Mode_Reg_Bits
124 Gi_Alternate_Sync_Bit(enum ni_gpct_variant variant)
127 case ni_gpct_variant_e_series:
130 case ni_gpct_variant_m_series:
131 return Gi_M_Series_Alternate_Sync_Bit;
132 case ni_gpct_variant_660x:
133 return Gi_660x_Alternate_Sync_Bit;
137 static inline enum Gi_Counting_Mode_Reg_Bits
138 Gi_Prescale_X2_Bit(enum ni_gpct_variant variant)
141 case ni_gpct_variant_e_series:
144 case ni_gpct_variant_m_series:
145 return Gi_M_Series_Prescale_X2_Bit;
146 case ni_gpct_variant_660x:
147 return Gi_660x_Prescale_X2_Bit;
151 static inline enum Gi_Counting_Mode_Reg_Bits
152 Gi_Prescale_X8_Bit(enum ni_gpct_variant variant)
155 case ni_gpct_variant_e_series:
158 case ni_gpct_variant_m_series:
159 return Gi_M_Series_Prescale_X8_Bit;
160 case ni_gpct_variant_660x:
161 return Gi_660x_Prescale_X8_Bit;
165 static inline enum Gi_Counting_Mode_Reg_Bits
166 Gi_HW_Arm_Select_Mask(enum ni_gpct_variant variant)
169 case ni_gpct_variant_e_series:
172 case ni_gpct_variant_m_series:
173 return Gi_M_Series_HW_Arm_Select_Mask;
174 case ni_gpct_variant_660x:
175 return Gi_660x_HW_Arm_Select_Mask;
179 static inline unsigned Gi_Source_Select_Bits(unsigned source)
181 return (source << Gi_Source_Select_Shift) & Gi_Source_Select_Mask;
184 static inline unsigned Gi_Gate_Select_Bits(unsigned gate_select)
186 return (gate_select << Gi_Gate_Select_Shift) & Gi_Gate_Select_Mask;
190 ni_tio_second_gate_registers_present(const struct ni_gpct_device *counter_dev)
192 switch (counter_dev->variant) {
193 case ni_gpct_variant_e_series:
196 case ni_gpct_variant_m_series:
197 case ni_gpct_variant_660x:
202 static void ni_tio_reset_count_and_disarm(struct ni_gpct *counter)
204 unsigned cidx = counter->counter_index;
206 write_register(counter, Gi_Reset_Bit(cidx), NITIO_RESET_REG(cidx));
209 static unsigned int ni_tio_counter_status(struct ni_gpct *counter)
211 unsigned cidx = counter->counter_index;
212 const unsigned bits = read_register(counter,
213 NITIO_SHARED_STATUS_REG(cidx));
214 unsigned int status = 0;
216 if (bits & Gi_Armed_Bit(cidx)) {
217 status |= COMEDI_COUNTER_ARMED;
218 if (bits & Gi_Counting_Bit(cidx))
219 status |= COMEDI_COUNTER_COUNTING;
224 static void ni_tio_set_sync_mode(struct ni_gpct *counter, int force_alt_sync)
226 struct ni_gpct_device *counter_dev = counter->counter_dev;
227 unsigned cidx = counter->counter_index;
228 const unsigned counting_mode_reg = NITIO_CNT_MODE_REG(cidx);
229 static const uint64_t min_normal_sync_period_ps = 25000;
230 const uint64_t clock_period_ps = ni_tio_clock_period_ps(counter,
231 ni_tio_generic_clock_src_select
234 if (ni_tio_counting_mode_registers_present(counter_dev) == 0)
237 switch (ni_tio_get_soft_copy(counter, counting_mode_reg) & Gi_Counting_Mode_Mask) {
238 case Gi_Counting_Mode_QuadratureX1_Bits:
239 case Gi_Counting_Mode_QuadratureX2_Bits:
240 case Gi_Counting_Mode_QuadratureX4_Bits:
241 case Gi_Counting_Mode_Sync_Source_Bits:
248 * It's not clear what we should do if clock_period is unknown, so we
249 * are not using the alt sync bit in that case, but allow the caller
250 * to decide by using the force_alt_sync parameter.
252 if (force_alt_sync ||
253 (clock_period_ps && clock_period_ps < min_normal_sync_period_ps)) {
254 ni_tio_set_bits(counter, counting_mode_reg,
255 Gi_Alternate_Sync_Bit(counter_dev->variant),
256 Gi_Alternate_Sync_Bit(counter_dev->variant));
258 ni_tio_set_bits(counter, counting_mode_reg,
259 Gi_Alternate_Sync_Bit(counter_dev->variant),
264 static int ni_tio_set_counter_mode(struct ni_gpct *counter, unsigned mode)
266 struct ni_gpct_device *counter_dev = counter->counter_dev;
267 unsigned cidx = counter->counter_index;
268 unsigned mode_reg_mask;
269 unsigned mode_reg_values;
270 unsigned input_select_bits = 0;
271 /* these bits map directly on to the mode register */
272 static const unsigned mode_reg_direct_mask =
273 NI_GPCT_GATE_ON_BOTH_EDGES_BIT | NI_GPCT_EDGE_GATE_MODE_MASK |
274 NI_GPCT_STOP_MODE_MASK | NI_GPCT_OUTPUT_MODE_MASK |
275 NI_GPCT_HARDWARE_DISARM_MASK | NI_GPCT_LOADING_ON_TC_BIT |
276 NI_GPCT_LOADING_ON_GATE_BIT | NI_GPCT_LOAD_B_SELECT_BIT;
278 mode_reg_mask = mode_reg_direct_mask | Gi_Reload_Source_Switching_Bit;
279 mode_reg_values = mode & mode_reg_direct_mask;
280 switch (mode & NI_GPCT_RELOAD_SOURCE_MASK) {
281 case NI_GPCT_RELOAD_SOURCE_FIXED_BITS:
283 case NI_GPCT_RELOAD_SOURCE_SWITCHING_BITS:
284 mode_reg_values |= Gi_Reload_Source_Switching_Bit;
286 case NI_GPCT_RELOAD_SOURCE_GATE_SELECT_BITS:
287 input_select_bits |= Gi_Gate_Select_Load_Source_Bit;
288 mode_reg_mask |= Gi_Gating_Mode_Mask;
289 mode_reg_values |= Gi_Level_Gating_Bits;
294 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
295 mode_reg_mask, mode_reg_values);
297 if (ni_tio_counting_mode_registers_present(counter_dev)) {
298 unsigned counting_mode_bits = 0;
300 counting_mode_bits |=
301 (mode >> NI_GPCT_COUNTING_MODE_SHIFT) &
302 Gi_Counting_Mode_Mask;
303 counting_mode_bits |=
304 ((mode >> NI_GPCT_INDEX_PHASE_BITSHIFT) <<
305 Gi_Index_Phase_Bitshift) & Gi_Index_Phase_Mask;
306 if (mode & NI_GPCT_INDEX_ENABLE_BIT)
307 counting_mode_bits |= Gi_Index_Mode_Bit;
308 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
309 Gi_Counting_Mode_Mask | Gi_Index_Phase_Mask |
310 Gi_Index_Mode_Bit, counting_mode_bits);
311 ni_tio_set_sync_mode(counter, 0);
314 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
316 (mode >> NI_GPCT_COUNTING_DIRECTION_SHIFT) <<
319 if (mode & NI_GPCT_OR_GATE_BIT)
320 input_select_bits |= Gi_Or_Gate_Bit;
321 if (mode & NI_GPCT_INVERT_OUTPUT_BIT)
322 input_select_bits |= Gi_Output_Polarity_Bit;
323 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
324 Gi_Gate_Select_Load_Source_Bit | Gi_Or_Gate_Bit |
325 Gi_Output_Polarity_Bit, input_select_bits);
330 int ni_tio_arm(struct ni_gpct *counter, int arm, unsigned start_trigger)
332 struct ni_gpct_device *counter_dev = counter->counter_dev;
333 unsigned cidx = counter->counter_index;
334 unsigned command_transient_bits = 0;
337 switch (start_trigger) {
338 case NI_GPCT_ARM_IMMEDIATE:
339 command_transient_bits |= Gi_Arm_Bit;
341 case NI_GPCT_ARM_PAIRED_IMMEDIATE:
342 command_transient_bits |= Gi_Arm_Bit | Gi_Arm_Copy_Bit;
347 if (ni_tio_counting_mode_registers_present(counter_dev)) {
348 unsigned counting_mode_bits = 0;
350 switch (start_trigger) {
351 case NI_GPCT_ARM_IMMEDIATE:
352 case NI_GPCT_ARM_PAIRED_IMMEDIATE:
355 if (start_trigger & NI_GPCT_ARM_UNKNOWN) {
357 * pass-through the least significant
358 * bits so we can figure out what
361 unsigned hw_arm_select_bits =
363 Gi_HW_Arm_Select_Shift) &
364 Gi_HW_Arm_Select_Mask
365 (counter_dev->variant);
367 counting_mode_bits |=
368 Gi_HW_Arm_Enable_Bit |
375 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
376 Gi_HW_Arm_Select_Mask
377 (counter_dev->variant) |
378 Gi_HW_Arm_Enable_Bit,
382 command_transient_bits |= Gi_Disarm_Bit;
384 ni_tio_set_bits_transient(counter, NITIO_CMD_REG(cidx),
385 0, 0, command_transient_bits);
388 EXPORT_SYMBOL_GPL(ni_tio_arm);
390 static unsigned ni_660x_source_select_bits(unsigned int clock_source)
392 unsigned ni_660x_clock;
394 const unsigned clock_select_bits =
395 clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
397 switch (clock_select_bits) {
398 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
399 ni_660x_clock = NI_660X_TIMEBASE_1_CLK;
401 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
402 ni_660x_clock = NI_660X_TIMEBASE_2_CLK;
404 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
405 ni_660x_clock = NI_660X_TIMEBASE_3_CLK;
407 case NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS:
408 ni_660x_clock = NI_660X_LOGIC_LOW_CLK;
410 case NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS:
411 ni_660x_clock = NI_660X_SRC_PIN_I_CLK;
413 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
414 ni_660x_clock = NI_660X_NEXT_GATE_CLK;
416 case NI_GPCT_NEXT_TC_CLOCK_SRC_BITS:
417 ni_660x_clock = NI_660X_NEXT_TC_CLK;
420 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
421 if (clock_select_bits == NI_GPCT_RTSI_CLOCK_SRC_BITS(i)) {
422 ni_660x_clock = NI_660X_RTSI_CLK(i);
426 if (i <= NI_660X_MAX_RTSI_CHAN)
428 for (i = 0; i <= NI_660X_MAX_SRC_PIN; ++i) {
429 if (clock_select_bits ==
430 NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(i)) {
431 ni_660x_clock = NI_660X_SRC_PIN_CLK(i);
435 if (i <= NI_660X_MAX_SRC_PIN)
441 return Gi_Source_Select_Bits(ni_660x_clock);
444 static unsigned ni_m_series_source_select_bits(unsigned int clock_source)
446 unsigned ni_m_series_clock;
448 const unsigned clock_select_bits =
449 clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
450 switch (clock_select_bits) {
451 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
452 ni_m_series_clock = NI_M_TIMEBASE_1_CLK;
454 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
455 ni_m_series_clock = NI_M_TIMEBASE_2_CLK;
457 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
458 ni_m_series_clock = NI_M_TIMEBASE_3_CLK;
460 case NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS:
461 ni_m_series_clock = NI_M_LOGIC_LOW_CLK;
463 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
464 ni_m_series_clock = NI_M_NEXT_GATE_CLK;
466 case NI_GPCT_NEXT_TC_CLOCK_SRC_BITS:
467 ni_m_series_clock = NI_M_NEXT_TC_CLK;
469 case NI_GPCT_PXI10_CLOCK_SRC_BITS:
470 ni_m_series_clock = NI_M_PXI10_CLK;
472 case NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS:
473 ni_m_series_clock = NI_M_PXI_STAR_TRIGGER_CLK;
475 case NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS:
476 ni_m_series_clock = NI_M_ANALOG_TRIGGER_OUT_CLK;
479 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
480 if (clock_select_bits == NI_GPCT_RTSI_CLOCK_SRC_BITS(i)) {
481 ni_m_series_clock = NI_M_RTSI_CLK(i);
485 if (i <= NI_M_MAX_RTSI_CHAN)
487 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
488 if (clock_select_bits == NI_GPCT_PFI_CLOCK_SRC_BITS(i)) {
489 ni_m_series_clock = NI_M_PFI_CLK(i);
493 if (i <= NI_M_MAX_PFI_CHAN)
495 printk(KERN_ERR "invalid clock source 0x%lx\n",
496 (unsigned long)clock_source);
498 ni_m_series_clock = 0;
501 return Gi_Source_Select_Bits(ni_m_series_clock);
504 static void ni_tio_set_source_subselect(struct ni_gpct *counter,
505 unsigned int clock_source)
507 struct ni_gpct_device *counter_dev = counter->counter_dev;
508 unsigned cidx = counter->counter_index;
509 const unsigned second_gate_reg = NITIO_GATE2_REG(cidx);
511 if (counter_dev->variant != ni_gpct_variant_m_series)
513 switch (clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK) {
514 /* Gi_Source_Subselect is zero */
515 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
516 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
517 counter_dev->regs[second_gate_reg] &= ~Gi_Source_Subselect_Bit;
519 /* Gi_Source_Subselect is one */
520 case NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS:
521 case NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS:
522 counter_dev->regs[second_gate_reg] |= Gi_Source_Subselect_Bit;
524 /* Gi_Source_Subselect doesn't matter */
528 write_register(counter, counter_dev->regs[second_gate_reg],
532 static int ni_tio_set_clock_src(struct ni_gpct *counter,
533 unsigned int clock_source,
534 unsigned int period_ns)
536 struct ni_gpct_device *counter_dev = counter->counter_dev;
537 unsigned cidx = counter->counter_index;
538 unsigned input_select_bits = 0;
539 static const uint64_t pico_per_nano = 1000;
541 /*FIXME: validate clock source */
542 switch (counter_dev->variant) {
543 case ni_gpct_variant_660x:
544 input_select_bits |= ni_660x_source_select_bits(clock_source);
546 case ni_gpct_variant_e_series:
547 case ni_gpct_variant_m_series:
550 ni_m_series_source_select_bits(clock_source);
553 if (clock_source & NI_GPCT_INVERT_CLOCK_SRC_BIT)
554 input_select_bits |= Gi_Source_Polarity_Bit;
555 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
556 Gi_Source_Select_Mask | Gi_Source_Polarity_Bit,
558 ni_tio_set_source_subselect(counter, clock_source);
559 if (ni_tio_counting_mode_registers_present(counter_dev)) {
560 const unsigned prescaling_mode =
561 clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK;
562 unsigned counting_mode_bits = 0;
564 switch (prescaling_mode) {
565 case NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS:
567 case NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS:
568 counting_mode_bits |=
569 Gi_Prescale_X2_Bit(counter_dev->variant);
571 case NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS:
572 counting_mode_bits |=
573 Gi_Prescale_X8_Bit(counter_dev->variant);
578 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
579 Gi_Prescale_X2_Bit(counter_dev->variant) |
580 Gi_Prescale_X8_Bit(counter_dev->variant),
583 counter->clock_period_ps = pico_per_nano * period_ns;
584 ni_tio_set_sync_mode(counter, 0);
588 static unsigned ni_tio_clock_src_modifiers(const struct ni_gpct *counter)
590 struct ni_gpct_device *counter_dev = counter->counter_dev;
591 unsigned cidx = counter->counter_index;
592 const unsigned counting_mode_bits =
593 ni_tio_get_soft_copy(counter, NITIO_CNT_MODE_REG(cidx));
596 if (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
597 Gi_Source_Polarity_Bit)
598 bits |= NI_GPCT_INVERT_CLOCK_SRC_BIT;
599 if (counting_mode_bits & Gi_Prescale_X2_Bit(counter_dev->variant))
600 bits |= NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS;
601 if (counting_mode_bits & Gi_Prescale_X8_Bit(counter_dev->variant))
602 bits |= NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS;
606 static unsigned ni_m_series_clock_src_select(const struct ni_gpct *counter)
608 struct ni_gpct_device *counter_dev = counter->counter_dev;
609 unsigned cidx = counter->counter_index;
610 const unsigned second_gate_reg = NITIO_GATE2_REG(cidx);
611 unsigned clock_source = 0;
613 const unsigned input_select =
614 (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
615 Gi_Source_Select_Mask) >> Gi_Source_Select_Shift;
617 switch (input_select) {
618 case NI_M_TIMEBASE_1_CLK:
619 clock_source = NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS;
621 case NI_M_TIMEBASE_2_CLK:
622 clock_source = NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS;
624 case NI_M_TIMEBASE_3_CLK:
625 if (counter_dev->regs[second_gate_reg] &
626 Gi_Source_Subselect_Bit)
628 NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS;
630 clock_source = NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS;
632 case NI_M_LOGIC_LOW_CLK:
633 clock_source = NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS;
635 case NI_M_NEXT_GATE_CLK:
636 if (counter_dev->regs[second_gate_reg] &
637 Gi_Source_Subselect_Bit)
638 clock_source = NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS;
640 clock_source = NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS;
643 clock_source = NI_GPCT_PXI10_CLOCK_SRC_BITS;
645 case NI_M_NEXT_TC_CLK:
646 clock_source = NI_GPCT_NEXT_TC_CLOCK_SRC_BITS;
649 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
650 if (input_select == NI_M_RTSI_CLK(i)) {
651 clock_source = NI_GPCT_RTSI_CLOCK_SRC_BITS(i);
655 if (i <= NI_M_MAX_RTSI_CHAN)
657 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
658 if (input_select == NI_M_PFI_CLK(i)) {
659 clock_source = NI_GPCT_PFI_CLOCK_SRC_BITS(i);
663 if (i <= NI_M_MAX_PFI_CHAN)
668 clock_source |= ni_tio_clock_src_modifiers(counter);
672 static unsigned ni_660x_clock_src_select(const struct ni_gpct *counter)
674 unsigned clock_source = 0;
675 unsigned cidx = counter->counter_index;
676 const unsigned input_select =
677 (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
678 Gi_Source_Select_Mask) >> Gi_Source_Select_Shift;
681 switch (input_select) {
682 case NI_660X_TIMEBASE_1_CLK:
683 clock_source = NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS;
685 case NI_660X_TIMEBASE_2_CLK:
686 clock_source = NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS;
688 case NI_660X_TIMEBASE_3_CLK:
689 clock_source = NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS;
691 case NI_660X_LOGIC_LOW_CLK:
692 clock_source = NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS;
694 case NI_660X_SRC_PIN_I_CLK:
695 clock_source = NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS;
697 case NI_660X_NEXT_GATE_CLK:
698 clock_source = NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS;
700 case NI_660X_NEXT_TC_CLK:
701 clock_source = NI_GPCT_NEXT_TC_CLOCK_SRC_BITS;
704 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
705 if (input_select == NI_660X_RTSI_CLK(i)) {
706 clock_source = NI_GPCT_RTSI_CLOCK_SRC_BITS(i);
710 if (i <= NI_660X_MAX_RTSI_CHAN)
712 for (i = 0; i <= NI_660X_MAX_SRC_PIN; ++i) {
713 if (input_select == NI_660X_SRC_PIN_CLK(i)) {
715 NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(i);
719 if (i <= NI_660X_MAX_SRC_PIN)
724 clock_source |= ni_tio_clock_src_modifiers(counter);
728 static unsigned ni_tio_generic_clock_src_select(const struct ni_gpct *counter)
730 switch (counter->counter_dev->variant) {
731 case ni_gpct_variant_e_series:
732 case ni_gpct_variant_m_series:
734 return ni_m_series_clock_src_select(counter);
735 case ni_gpct_variant_660x:
736 return ni_660x_clock_src_select(counter);
740 static uint64_t ni_tio_clock_period_ps(const struct ni_gpct *counter,
741 unsigned generic_clock_source)
743 uint64_t clock_period_ps;
745 switch (generic_clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK) {
746 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
747 clock_period_ps = 50000;
749 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
750 clock_period_ps = 10000000;
752 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
753 clock_period_ps = 12500;
755 case NI_GPCT_PXI10_CLOCK_SRC_BITS:
756 clock_period_ps = 100000;
760 * clock period is specified by user with prescaling
761 * already taken into account.
763 return counter->clock_period_ps;
766 switch (generic_clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK) {
767 case NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS:
769 case NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS:
770 clock_period_ps *= 2;
772 case NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS:
773 clock_period_ps *= 8;
779 return clock_period_ps;
782 static void ni_tio_get_clock_src(struct ni_gpct *counter,
783 unsigned int *clock_source,
784 unsigned int *period_ns)
786 static const unsigned pico_per_nano = 1000;
788 *clock_source = ni_tio_generic_clock_src_select(counter);
789 temp64 = ni_tio_clock_period_ps(counter, *clock_source);
790 do_div(temp64, pico_per_nano);
794 static void ni_tio_set_first_gate_modifiers(struct ni_gpct *counter,
795 unsigned int gate_source)
797 const unsigned mode_mask = Gi_Gate_Polarity_Bit | Gi_Gating_Mode_Mask;
798 unsigned cidx = counter->counter_index;
799 unsigned mode_values = 0;
801 if (gate_source & CR_INVERT)
802 mode_values |= Gi_Gate_Polarity_Bit;
803 if (gate_source & CR_EDGE)
804 mode_values |= Gi_Rising_Edge_Gating_Bits;
806 mode_values |= Gi_Level_Gating_Bits;
807 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
808 mode_mask, mode_values);
811 static int ni_660x_set_first_gate(struct ni_gpct *counter,
812 unsigned int gate_source)
814 unsigned int chan = CR_CHAN(gate_source);
815 unsigned cidx = counter->counter_index;
820 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
821 gate_sel = NI_660X_NEXT_SRC_GATE_SEL;
823 case NI_GPCT_NEXT_OUT_GATE_SELECT:
824 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
825 case NI_GPCT_SOURCE_PIN_i_GATE_SELECT:
826 case NI_GPCT_GATE_PIN_i_GATE_SELECT:
827 gate_sel = chan & 0x1f;
830 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
831 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
832 gate_sel = chan & 0x1f;
836 if (i <= NI_660X_MAX_RTSI_CHAN)
838 for (i = 0; i <= NI_660X_MAX_GATE_PIN; ++i) {
839 if (chan == NI_GPCT_GATE_PIN_GATE_SELECT(i)) {
840 gate_sel = chan & 0x1f;
844 if (i <= NI_660X_MAX_GATE_PIN)
848 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
849 Gi_Gate_Select_Mask, Gi_Gate_Select_Bits(gate_sel));
853 static int ni_m_series_set_first_gate(struct ni_gpct *counter,
854 unsigned int gate_source)
856 unsigned int chan = CR_CHAN(gate_source);
857 unsigned cidx = counter->counter_index;
862 case NI_GPCT_TIMESTAMP_MUX_GATE_SELECT:
863 case NI_GPCT_AI_START2_GATE_SELECT:
864 case NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT:
865 case NI_GPCT_NEXT_OUT_GATE_SELECT:
866 case NI_GPCT_AI_START1_GATE_SELECT:
867 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
868 case NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT:
869 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
870 gate_sel = chan & 0x1f;
873 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
874 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
875 gate_sel = chan & 0x1f;
879 if (i <= NI_M_MAX_RTSI_CHAN)
881 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
882 if (chan == NI_GPCT_PFI_GATE_SELECT(i)) {
883 gate_sel = chan & 0x1f;
887 if (i <= NI_M_MAX_PFI_CHAN)
891 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
892 Gi_Gate_Select_Mask, Gi_Gate_Select_Bits(gate_sel));
896 static int ni_660x_set_second_gate(struct ni_gpct *counter,
897 unsigned int gate_source)
899 struct ni_gpct_device *counter_dev = counter->counter_dev;
900 unsigned cidx = counter->counter_index;
901 unsigned int chan = CR_CHAN(gate_source);
902 unsigned gate2_reg = NITIO_GATE2_REG(cidx);
907 case NI_GPCT_SOURCE_PIN_i_GATE_SELECT:
908 case NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT:
909 case NI_GPCT_SELECTED_GATE_GATE_SELECT:
910 case NI_GPCT_NEXT_OUT_GATE_SELECT:
911 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
912 gate2_sel = chan & 0x1f;
914 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
915 gate2_sel = NI_660X_NEXT_SRC_GATE2_SEL;
918 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
919 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
920 gate2_sel = chan & 0x1f;
924 if (i <= NI_660X_MAX_RTSI_CHAN)
926 for (i = 0; i <= NI_660X_MAX_UP_DOWN_PIN; ++i) {
927 if (chan == NI_GPCT_UP_DOWN_PIN_GATE_SELECT(i)) {
928 gate2_sel = chan & 0x1f;
932 if (i <= NI_660X_MAX_UP_DOWN_PIN)
936 counter_dev->regs[gate2_reg] |= Gi_Second_Gate_Mode_Bit;
937 counter_dev->regs[gate2_reg] &= ~Gi_Second_Gate_Select_Mask;
938 counter_dev->regs[gate2_reg] |= Gi_Second_Gate_Select_Bits(gate2_sel);
939 write_register(counter, counter_dev->regs[gate2_reg], gate2_reg);
943 static int ni_m_series_set_second_gate(struct ni_gpct *counter,
944 unsigned int gate_source)
946 struct ni_gpct_device *counter_dev = counter->counter_dev;
947 unsigned cidx = counter->counter_index;
948 const unsigned second_gate_reg = NITIO_GATE2_REG(cidx);
949 const unsigned selected_second_gate = CR_CHAN(gate_source);
950 /* bits of second_gate that may be meaningful to second gate register */
951 static const unsigned selected_second_gate_mask = 0x1f;
952 unsigned ni_m_series_second_gate_select;
955 * FIXME: We don't know what the m-series second gate codes are,
956 * so we'll just pass the bits through for now.
958 switch (selected_second_gate) {
960 ni_m_series_second_gate_select =
961 selected_second_gate & selected_second_gate_mask;
964 counter_dev->regs[second_gate_reg] |= Gi_Second_Gate_Mode_Bit;
965 counter_dev->regs[second_gate_reg] &= ~Gi_Second_Gate_Select_Mask;
966 counter_dev->regs[second_gate_reg] |=
967 Gi_Second_Gate_Select_Bits(ni_m_series_second_gate_select);
968 write_register(counter, counter_dev->regs[second_gate_reg],
973 int ni_tio_set_gate_src(struct ni_gpct *counter, unsigned gate_index,
974 unsigned int gate_source)
976 struct ni_gpct_device *counter_dev = counter->counter_dev;
977 unsigned cidx = counter->counter_index;
978 const unsigned second_gate_reg = NITIO_GATE2_REG(cidx);
980 switch (gate_index) {
982 if (CR_CHAN(gate_source) == NI_GPCT_DISABLED_GATE_SELECT) {
983 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
985 Gi_Gating_Disabled_Bits);
988 ni_tio_set_first_gate_modifiers(counter, gate_source);
989 switch (counter_dev->variant) {
990 case ni_gpct_variant_e_series:
991 case ni_gpct_variant_m_series:
993 return ni_m_series_set_first_gate(counter, gate_source);
994 case ni_gpct_variant_660x:
995 return ni_660x_set_first_gate(counter, gate_source);
999 if (ni_tio_second_gate_registers_present(counter_dev) == 0)
1001 if (CR_CHAN(gate_source) == NI_GPCT_DISABLED_GATE_SELECT) {
1002 counter_dev->regs[second_gate_reg] &=
1003 ~Gi_Second_Gate_Mode_Bit;
1004 write_register(counter,
1005 counter_dev->regs[second_gate_reg],
1009 if (gate_source & CR_INVERT) {
1010 counter_dev->regs[second_gate_reg] |=
1011 Gi_Second_Gate_Polarity_Bit;
1013 counter_dev->regs[second_gate_reg] &=
1014 ~Gi_Second_Gate_Polarity_Bit;
1016 switch (counter_dev->variant) {
1017 case ni_gpct_variant_m_series:
1018 return ni_m_series_set_second_gate(counter,
1020 case ni_gpct_variant_660x:
1021 return ni_660x_set_second_gate(counter, gate_source);
1032 EXPORT_SYMBOL_GPL(ni_tio_set_gate_src);
1034 static int ni_tio_set_other_src(struct ni_gpct *counter, unsigned index,
1035 unsigned int source)
1037 struct ni_gpct_device *counter_dev = counter->counter_dev;
1038 unsigned cidx = counter->counter_index;
1040 if (counter_dev->variant == ni_gpct_variant_m_series) {
1041 unsigned int abz_reg, shift, mask;
1043 abz_reg = NITIO_ABZ_REG(cidx);
1045 case NI_GPCT_SOURCE_ENCODER_A:
1048 case NI_GPCT_SOURCE_ENCODER_B:
1051 case NI_GPCT_SOURCE_ENCODER_Z:
1057 mask = 0x1f << shift;
1058 if (source > 0x1f) {
1062 counter_dev->regs[abz_reg] &= ~mask;
1063 counter_dev->regs[abz_reg] |= (source << shift) & mask;
1064 write_register(counter, counter_dev->regs[abz_reg], abz_reg);
1071 ni_660x_first_gate_to_generic_gate_source(unsigned ni_660x_gate_select)
1075 switch (ni_660x_gate_select) {
1076 case NI_660X_SRC_PIN_I_GATE_SEL:
1077 return NI_GPCT_SOURCE_PIN_i_GATE_SELECT;
1078 case NI_660X_GATE_PIN_I_GATE_SEL:
1079 return NI_GPCT_GATE_PIN_i_GATE_SELECT;
1080 case NI_660X_NEXT_SRC_GATE_SEL:
1081 return NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1082 case NI_660X_NEXT_OUT_GATE_SEL:
1083 return NI_GPCT_NEXT_OUT_GATE_SELECT;
1084 case NI_660X_LOGIC_LOW_GATE_SEL:
1085 return NI_GPCT_LOGIC_LOW_GATE_SELECT;
1087 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
1088 if (ni_660x_gate_select == NI_660X_RTSI_GATE_SEL(i))
1089 return NI_GPCT_RTSI_GATE_SELECT(i);
1091 if (i <= NI_660X_MAX_RTSI_CHAN)
1093 for (i = 0; i <= NI_660X_MAX_GATE_PIN; ++i) {
1094 if (ni_660x_gate_select == NI_660X_PIN_GATE_SEL(i))
1095 return NI_GPCT_GATE_PIN_GATE_SELECT(i);
1097 if (i <= NI_660X_MAX_GATE_PIN)
1106 ni_m_series_first_gate_to_generic_gate_source(unsigned ni_m_series_gate_select)
1110 switch (ni_m_series_gate_select) {
1111 case NI_M_TIMESTAMP_MUX_GATE_SEL:
1112 return NI_GPCT_TIMESTAMP_MUX_GATE_SELECT;
1113 case NI_M_AI_START2_GATE_SEL:
1114 return NI_GPCT_AI_START2_GATE_SELECT;
1115 case NI_M_PXI_STAR_TRIGGER_GATE_SEL:
1116 return NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT;
1117 case NI_M_NEXT_OUT_GATE_SEL:
1118 return NI_GPCT_NEXT_OUT_GATE_SELECT;
1119 case NI_M_AI_START1_GATE_SEL:
1120 return NI_GPCT_AI_START1_GATE_SELECT;
1121 case NI_M_NEXT_SRC_GATE_SEL:
1122 return NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1123 case NI_M_ANALOG_TRIG_OUT_GATE_SEL:
1124 return NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT;
1125 case NI_M_LOGIC_LOW_GATE_SEL:
1126 return NI_GPCT_LOGIC_LOW_GATE_SELECT;
1128 for (i = 0; i <= NI_M_MAX_RTSI_CHAN; ++i) {
1129 if (ni_m_series_gate_select == NI_M_RTSI_GATE_SEL(i))
1130 return NI_GPCT_RTSI_GATE_SELECT(i);
1132 if (i <= NI_M_MAX_RTSI_CHAN)
1134 for (i = 0; i <= NI_M_MAX_PFI_CHAN; ++i) {
1135 if (ni_m_series_gate_select == NI_M_PFI_GATE_SEL(i))
1136 return NI_GPCT_PFI_GATE_SELECT(i);
1138 if (i <= NI_M_MAX_PFI_CHAN)
1147 ni_660x_second_gate_to_generic_gate_source(unsigned ni_660x_gate_select)
1151 switch (ni_660x_gate_select) {
1152 case NI_660X_SRC_PIN_I_GATE2_SEL:
1153 return NI_GPCT_SOURCE_PIN_i_GATE_SELECT;
1154 case NI_660X_UD_PIN_I_GATE2_SEL:
1155 return NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT;
1156 case NI_660X_NEXT_SRC_GATE2_SEL:
1157 return NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1158 case NI_660X_NEXT_OUT_GATE2_SEL:
1159 return NI_GPCT_NEXT_OUT_GATE_SELECT;
1160 case NI_660X_SELECTED_GATE2_SEL:
1161 return NI_GPCT_SELECTED_GATE_GATE_SELECT;
1162 case NI_660X_LOGIC_LOW_GATE2_SEL:
1163 return NI_GPCT_LOGIC_LOW_GATE_SELECT;
1165 for (i = 0; i <= NI_660X_MAX_RTSI_CHAN; ++i) {
1166 if (ni_660x_gate_select == NI_660X_RTSI_GATE2_SEL(i))
1167 return NI_GPCT_RTSI_GATE_SELECT(i);
1169 if (i <= NI_660X_MAX_RTSI_CHAN)
1171 for (i = 0; i <= NI_660X_MAX_UP_DOWN_PIN; ++i) {
1172 if (ni_660x_gate_select == NI_660X_UD_PIN_GATE2_SEL(i))
1173 return NI_GPCT_UP_DOWN_PIN_GATE_SELECT(i);
1175 if (i <= NI_660X_MAX_UP_DOWN_PIN)
1184 ni_m_series_second_gate_to_generic_gate_source(unsigned ni_m_series_gate_select)
1187 * FIXME: the second gate sources for the m series are undocumented,
1188 * so we just return the raw bits for now.
1190 switch (ni_m_series_gate_select) {
1192 return ni_m_series_gate_select;
1197 static int ni_tio_get_gate_src(struct ni_gpct *counter, unsigned gate_index,
1198 unsigned int *gate_source)
1200 struct ni_gpct_device *counter_dev = counter->counter_dev;
1201 unsigned cidx = counter->counter_index;
1202 const unsigned mode_bits =
1203 ni_tio_get_soft_copy(counter, NITIO_MODE_REG(cidx));
1204 const unsigned second_gate_reg = NITIO_GATE2_REG(cidx);
1205 unsigned gate_select_bits;
1207 switch (gate_index) {
1209 if ((mode_bits & Gi_Gating_Mode_Mask) ==
1210 Gi_Gating_Disabled_Bits) {
1211 *gate_source = NI_GPCT_DISABLED_GATE_SELECT;
1216 (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
1217 Gi_Gate_Select_Mask) >> Gi_Gate_Select_Shift;
1219 switch (counter_dev->variant) {
1220 case ni_gpct_variant_e_series:
1221 case ni_gpct_variant_m_series:
1224 ni_m_series_first_gate_to_generic_gate_source
1227 case ni_gpct_variant_660x:
1229 ni_660x_first_gate_to_generic_gate_source
1233 if (mode_bits & Gi_Gate_Polarity_Bit)
1234 *gate_source |= CR_INVERT;
1235 if ((mode_bits & Gi_Gating_Mode_Mask) != Gi_Level_Gating_Bits)
1236 *gate_source |= CR_EDGE;
1239 if ((mode_bits & Gi_Gating_Mode_Mask) == Gi_Gating_Disabled_Bits
1240 || (counter_dev->regs[second_gate_reg] &
1241 Gi_Second_Gate_Mode_Bit)
1243 *gate_source = NI_GPCT_DISABLED_GATE_SELECT;
1247 gate_select_bits = (counter_dev->regs[second_gate_reg] &
1248 Gi_Second_Gate_Select_Mask) >>
1249 Gi_Second_Gate_Select_Shift;
1250 switch (counter_dev->variant) {
1251 case ni_gpct_variant_e_series:
1252 case ni_gpct_variant_m_series:
1255 ni_m_series_second_gate_to_generic_gate_source
1258 case ni_gpct_variant_660x:
1260 ni_660x_second_gate_to_generic_gate_source
1264 if (counter_dev->regs[second_gate_reg] &
1265 Gi_Second_Gate_Polarity_Bit) {
1266 *gate_source |= CR_INVERT;
1268 /* second gate can't have edge/level mode set independently */
1269 if ((mode_bits & Gi_Gating_Mode_Mask) != Gi_Level_Gating_Bits)
1270 *gate_source |= CR_EDGE;
1278 int ni_tio_insn_config(struct comedi_device *dev,
1279 struct comedi_subdevice *s,
1280 struct comedi_insn *insn,
1283 struct ni_gpct *counter = s->private;
1286 case INSN_CONFIG_SET_COUNTER_MODE:
1287 return ni_tio_set_counter_mode(counter, data[1]);
1288 case INSN_CONFIG_ARM:
1289 return ni_tio_arm(counter, 1, data[1]);
1290 case INSN_CONFIG_DISARM:
1291 ni_tio_arm(counter, 0, 0);
1293 case INSN_CONFIG_GET_COUNTER_STATUS:
1294 data[1] = ni_tio_counter_status(counter);
1295 data[2] = COMEDI_COUNTER_ARMED | COMEDI_COUNTER_COUNTING;
1297 case INSN_CONFIG_SET_CLOCK_SRC:
1298 return ni_tio_set_clock_src(counter, data[1], data[2]);
1299 case INSN_CONFIG_GET_CLOCK_SRC:
1300 ni_tio_get_clock_src(counter, &data[1], &data[2]);
1302 case INSN_CONFIG_SET_GATE_SRC:
1303 return ni_tio_set_gate_src(counter, data[1], data[2]);
1304 case INSN_CONFIG_GET_GATE_SRC:
1305 return ni_tio_get_gate_src(counter, data[1], &data[2]);
1306 case INSN_CONFIG_SET_OTHER_SRC:
1307 return ni_tio_set_other_src(counter, data[1], data[2]);
1308 case INSN_CONFIG_RESET:
1309 ni_tio_reset_count_and_disarm(counter);
1316 EXPORT_SYMBOL_GPL(ni_tio_insn_config);
1318 static unsigned int ni_tio_read_sw_save_reg(struct comedi_device *dev,
1319 struct comedi_subdevice *s)
1321 struct ni_gpct *counter = s->private;
1322 unsigned cidx = counter->counter_index;
1323 unsigned int first_read;
1324 unsigned int second_read;
1325 unsigned int correct_read;
1327 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx), Gi_Save_Trace_Bit, 0);
1328 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
1329 Gi_Save_Trace_Bit, Gi_Save_Trace_Bit);
1332 * The count doesn't get latched until the next clock edge, so it is
1333 * possible the count may change (once) while we are reading. Since
1334 * the read of the SW_Save_Reg isn't atomic (apparently even when it's
1335 * a 32 bit register according to 660x docs), we need to read twice
1336 * and make sure the reading hasn't changed. If it has, a third read
1337 * will be correct since the count value will definitely have latched
1340 first_read = read_register(counter, NITIO_SW_SAVE_REG(cidx));
1341 second_read = read_register(counter, NITIO_SW_SAVE_REG(cidx));
1342 if (first_read != second_read)
1343 correct_read = read_register(counter, NITIO_SW_SAVE_REG(cidx));
1345 correct_read = first_read;
1347 return correct_read;
1350 int ni_tio_insn_read(struct comedi_device *dev,
1351 struct comedi_subdevice *s,
1352 struct comedi_insn *insn,
1355 struct ni_gpct *counter = s->private;
1356 struct ni_gpct_device *counter_dev = counter->counter_dev;
1357 unsigned int channel = CR_CHAN(insn->chanspec);
1358 unsigned cidx = counter->counter_index;
1361 for (i = 0; i < insn->n; i++) {
1364 data[i] = ni_tio_read_sw_save_reg(dev, s);
1367 data[i] = counter_dev->regs[NITIO_LOADA_REG(cidx)];
1370 data[i] = counter_dev->regs[NITIO_LOADB_REG(cidx)];
1376 EXPORT_SYMBOL_GPL(ni_tio_insn_read);
1378 static unsigned ni_tio_next_load_register(struct ni_gpct *counter)
1380 unsigned cidx = counter->counter_index;
1381 const unsigned bits =
1382 read_register(counter, NITIO_SHARED_STATUS_REG(cidx));
1384 return (bits & Gi_Next_Load_Source_Bit(cidx))
1385 ? NITIO_LOADB_REG(cidx)
1386 : NITIO_LOADA_REG(cidx);
1389 int ni_tio_insn_write(struct comedi_device *dev,
1390 struct comedi_subdevice *s,
1391 struct comedi_insn *insn,
1394 struct ni_gpct *counter = s->private;
1395 struct ni_gpct_device *counter_dev = counter->counter_dev;
1396 const unsigned channel = CR_CHAN(insn->chanspec);
1397 unsigned cidx = counter->counter_index;
1405 * Unsafe if counter is armed.
1406 * Should probably check status and return -EBUSY if armed.
1410 * Don't disturb load source select, just use whichever
1411 * load register is already selected.
1413 load_reg = ni_tio_next_load_register(counter);
1414 write_register(counter, data[0], load_reg);
1415 ni_tio_set_bits_transient(counter, NITIO_CMD_REG(cidx),
1417 /* restore load reg */
1418 write_register(counter, counter_dev->regs[load_reg], load_reg);
1421 counter_dev->regs[NITIO_LOADA_REG(cidx)] = data[0];
1422 write_register(counter, data[0], NITIO_LOADA_REG(cidx));
1425 counter_dev->regs[NITIO_LOADB_REG(cidx)] = data[0];
1426 write_register(counter, data[0], NITIO_LOADB_REG(cidx));
1433 EXPORT_SYMBOL_GPL(ni_tio_insn_write);
1435 void ni_tio_init_counter(struct ni_gpct *counter)
1437 struct ni_gpct_device *counter_dev = counter->counter_dev;
1438 unsigned cidx = counter->counter_index;
1440 ni_tio_reset_count_and_disarm(counter);
1442 /* initialize counter registers */
1443 counter_dev->regs[NITIO_AUTO_INC_REG(cidx)] = 0x0;
1444 write_register(counter, 0x0, NITIO_AUTO_INC_REG(cidx));
1446 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
1447 ~0, Gi_Synchronize_Gate_Bit);
1449 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx), ~0, 0);
1451 counter_dev->regs[NITIO_LOADA_REG(cidx)] = 0x0;
1452 write_register(counter, 0x0, NITIO_LOADA_REG(cidx));
1454 counter_dev->regs[NITIO_LOADB_REG(cidx)] = 0x0;
1455 write_register(counter, 0x0, NITIO_LOADB_REG(cidx));
1457 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx), ~0, 0);
1459 if (ni_tio_counting_mode_registers_present(counter_dev))
1460 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx), ~0, 0);
1462 if (ni_tio_second_gate_registers_present(counter_dev)) {
1463 counter_dev->regs[NITIO_GATE2_REG(cidx)] = 0x0;
1464 write_register(counter, 0x0, NITIO_GATE2_REG(cidx));
1467 ni_tio_set_bits(counter, NITIO_DMA_CFG_REG(cidx), ~0, 0x0);
1469 ni_tio_set_bits(counter, NITIO_INT_ENA_REG(cidx), ~0, 0x0);
1471 EXPORT_SYMBOL_GPL(ni_tio_init_counter);
1473 struct ni_gpct_device *
1474 ni_gpct_device_construct(struct comedi_device *dev,
1475 void (*write_register)(struct ni_gpct *counter,
1477 enum ni_gpct_register reg),
1478 unsigned (*read_register)(struct ni_gpct *counter,
1479 enum ni_gpct_register reg),
1480 enum ni_gpct_variant variant,
1481 unsigned num_counters)
1483 struct ni_gpct_device *counter_dev;
1484 struct ni_gpct *counter;
1487 if (num_counters == 0)
1490 counter_dev = kzalloc(sizeof(*counter_dev), GFP_KERNEL);
1494 counter_dev->dev = dev;
1495 counter_dev->write_register = write_register;
1496 counter_dev->read_register = read_register;
1497 counter_dev->variant = variant;
1499 spin_lock_init(&counter_dev->regs_lock);
1501 counter_dev->counters = kcalloc(num_counters, sizeof(*counter),
1503 if (!counter_dev->counters) {
1508 for (i = 0; i < num_counters; ++i) {
1509 counter = &counter_dev->counters[i];
1510 counter->counter_dev = counter_dev;
1511 spin_lock_init(&counter->lock);
1513 counter_dev->num_counters = num_counters;
1517 EXPORT_SYMBOL_GPL(ni_gpct_device_construct);
1519 void ni_gpct_device_destroy(struct ni_gpct_device *counter_dev)
1521 if (!counter_dev->counters)
1523 kfree(counter_dev->counters);
1526 EXPORT_SYMBOL_GPL(ni_gpct_device_destroy);
1528 static int __init ni_tio_init_module(void)
1532 module_init(ni_tio_init_module);
1534 static void __exit ni_tio_cleanup_module(void)
1537 module_exit(ni_tio_cleanup_module);
1539 MODULE_AUTHOR("Comedi <comedi@comedi.org>");
1540 MODULE_DESCRIPTION("Comedi support for NI general-purpose counters");
1541 MODULE_LICENSE("GPL");