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"
52 static uint64_t ni_tio_clock_period_ps(const struct ni_gpct *counter,
53 unsigned generic_clock_source);
54 static unsigned ni_tio_generic_clock_src_select(const struct ni_gpct *counter);
56 static inline enum Gi_Counting_Mode_Reg_Bits
57 Gi_Alternate_Sync_Bit(enum ni_gpct_variant variant)
60 case ni_gpct_variant_e_series:
63 case ni_gpct_variant_m_series:
64 return Gi_M_Series_Alternate_Sync_Bit;
65 case ni_gpct_variant_660x:
66 return Gi_660x_Alternate_Sync_Bit;
70 static inline enum Gi_Counting_Mode_Reg_Bits
71 Gi_Prescale_X2_Bit(enum ni_gpct_variant variant)
74 case ni_gpct_variant_e_series:
77 case ni_gpct_variant_m_series:
78 return Gi_M_Series_Prescale_X2_Bit;
79 case ni_gpct_variant_660x:
80 return Gi_660x_Prescale_X2_Bit;
84 static inline enum Gi_Counting_Mode_Reg_Bits
85 Gi_Prescale_X8_Bit(enum ni_gpct_variant variant)
88 case ni_gpct_variant_e_series:
91 case ni_gpct_variant_m_series:
92 return Gi_M_Series_Prescale_X8_Bit;
93 case ni_gpct_variant_660x:
94 return Gi_660x_Prescale_X8_Bit;
98 static inline enum Gi_Counting_Mode_Reg_Bits
99 Gi_HW_Arm_Select_Mask(enum ni_gpct_variant variant)
102 case ni_gpct_variant_e_series:
105 case ni_gpct_variant_m_series:
106 return Gi_M_Series_HW_Arm_Select_Mask;
107 case ni_gpct_variant_660x:
108 return Gi_660x_HW_Arm_Select_Mask;
112 /* clock sources for ni_660x boards, get bits with Gi_Source_Select_Bits() */
113 enum ni_660x_clock_source {
114 NI_660x_Timebase_1_Clock = 0x0, /* 20MHz */
115 NI_660x_Source_Pin_i_Clock = 0x1,
116 NI_660x_Next_Gate_Clock = 0xa,
117 NI_660x_Timebase_2_Clock = 0x12, /* 100KHz */
118 NI_660x_Next_TC_Clock = 0x13,
119 NI_660x_Timebase_3_Clock = 0x1e, /* 80MHz */
120 NI_660x_Logic_Low_Clock = 0x1f,
122 static const unsigned ni_660x_max_rtsi_channel = 6;
123 static inline unsigned NI_660x_RTSI_Clock(unsigned n)
125 BUG_ON(n > ni_660x_max_rtsi_channel);
129 static const unsigned ni_660x_max_source_pin = 7;
130 static inline unsigned NI_660x_Source_Pin_Clock(unsigned n)
132 BUG_ON(n > ni_660x_max_source_pin);
136 /* clock sources for ni e and m series boards, get bits with Gi_Source_Select_Bits() */
137 enum ni_m_series_clock_source {
138 NI_M_Series_Timebase_1_Clock = 0x0, /* 20MHz */
139 NI_M_Series_Timebase_2_Clock = 0x12, /* 100KHz */
140 NI_M_Series_Next_TC_Clock = 0x13,
141 NI_M_Series_Next_Gate_Clock = 0x14, /* when Gi_Src_SubSelect = 0 */
142 NI_M_Series_PXI_Star_Trigger_Clock = 0x14, /* when Gi_Src_SubSelect = 1 */
143 NI_M_Series_PXI10_Clock = 0x1d,
144 NI_M_Series_Timebase_3_Clock = 0x1e, /* 80MHz, when Gi_Src_SubSelect = 0 */
145 NI_M_Series_Analog_Trigger_Out_Clock = 0x1e, /* when Gi_Src_SubSelect = 1 */
146 NI_M_Series_Logic_Low_Clock = 0x1f,
148 static const unsigned ni_m_series_max_pfi_channel = 15;
149 #define NI_M_PFI_CLK(x) (((x) < 10) ? (1 + (x)) : (0xb + (x)))
151 static const unsigned ni_m_series_max_rtsi_channel = 7;
152 #define NI_M_RTSI_CLK(x) (((x) == 7) ? 0x1b : (0xb + (x)))
154 enum ni_660x_gate_select {
155 NI_660x_Source_Pin_i_Gate_Select = 0x0,
156 NI_660x_Gate_Pin_i_Gate_Select = 0x1,
157 NI_660x_Next_SRC_Gate_Select = 0xa,
158 NI_660x_Next_Out_Gate_Select = 0x14,
159 NI_660x_Logic_Low_Gate_Select = 0x1f,
161 static const unsigned ni_660x_max_gate_pin = 7;
162 static inline unsigned NI_660x_Gate_Pin_Gate_Select(unsigned n)
164 BUG_ON(n > ni_660x_max_gate_pin);
168 static inline unsigned NI_660x_RTSI_Gate_Select(unsigned n)
170 BUG_ON(n > ni_660x_max_rtsi_channel);
174 enum ni_m_series_gate_select {
175 NI_M_Series_Timestamp_Mux_Gate_Select = 0x0,
176 NI_M_Series_AI_START2_Gate_Select = 0x12,
177 NI_M_Series_PXI_Star_Trigger_Gate_Select = 0x13,
178 NI_M_Series_Next_Out_Gate_Select = 0x14,
179 NI_M_Series_AI_START1_Gate_Select = 0x1c,
180 NI_M_Series_Next_SRC_Gate_Select = 0x1d,
181 NI_M_Series_Analog_Trigger_Out_Gate_Select = 0x1e,
182 NI_M_Series_Logic_Low_Gate_Select = 0x1f,
184 static inline unsigned NI_M_Series_RTSI_Gate_Select(unsigned n)
186 BUG_ON(n > ni_m_series_max_rtsi_channel);
192 static inline unsigned NI_M_Series_PFI_Gate_Select(unsigned n)
194 BUG_ON(n > ni_m_series_max_pfi_channel);
200 static inline unsigned Gi_Source_Select_Bits(unsigned source)
202 return (source << Gi_Source_Select_Shift) & Gi_Source_Select_Mask;
205 static inline unsigned Gi_Gate_Select_Bits(unsigned gate_select)
207 return (gate_select << Gi_Gate_Select_Shift) & Gi_Gate_Select_Mask;
210 enum ni_660x_second_gate_select {
211 NI_660x_Source_Pin_i_Second_Gate_Select = 0x0,
212 NI_660x_Up_Down_Pin_i_Second_Gate_Select = 0x1,
213 NI_660x_Next_SRC_Second_Gate_Select = 0xa,
214 NI_660x_Next_Out_Second_Gate_Select = 0x14,
215 NI_660x_Selected_Gate_Second_Gate_Select = 0x1e,
216 NI_660x_Logic_Low_Second_Gate_Select = 0x1f,
218 static const unsigned ni_660x_max_up_down_pin = 7;
219 static inline unsigned NI_660x_Up_Down_Pin_Second_Gate_Select(unsigned n)
221 BUG_ON(n > ni_660x_max_up_down_pin);
225 static inline unsigned NI_660x_RTSI_Second_Gate_Select(unsigned n)
227 BUG_ON(n > ni_660x_max_rtsi_channel);
231 static const unsigned int counter_status_mask =
232 COMEDI_COUNTER_ARMED | COMEDI_COUNTER_COUNTING;
234 struct ni_gpct_device *
235 ni_gpct_device_construct(struct comedi_device *dev,
236 void (*write_register)(struct ni_gpct *counter,
238 enum ni_gpct_register reg),
239 unsigned (*read_register)(struct ni_gpct *counter,
240 enum ni_gpct_register reg),
241 enum ni_gpct_variant variant,
242 unsigned num_counters)
246 struct ni_gpct_device *counter_dev =
247 kzalloc(sizeof(struct ni_gpct_device), GFP_KERNEL);
248 if (counter_dev == NULL)
250 counter_dev->dev = dev;
251 counter_dev->write_register = write_register;
252 counter_dev->read_register = read_register;
253 counter_dev->variant = variant;
254 spin_lock_init(&counter_dev->regs_lock);
255 BUG_ON(num_counters == 0);
256 counter_dev->counters =
257 kzalloc(sizeof(struct ni_gpct) * num_counters, GFP_KERNEL);
258 if (counter_dev->counters == NULL) {
262 for (i = 0; i < num_counters; ++i) {
263 counter_dev->counters[i].counter_dev = counter_dev;
264 spin_lock_init(&counter_dev->counters[i].lock);
266 counter_dev->num_counters = num_counters;
269 EXPORT_SYMBOL_GPL(ni_gpct_device_construct);
271 void ni_gpct_device_destroy(struct ni_gpct_device *counter_dev)
273 if (counter_dev->counters == NULL)
275 kfree(counter_dev->counters);
278 EXPORT_SYMBOL_GPL(ni_gpct_device_destroy);
281 ni_tio_second_gate_registers_present(const struct ni_gpct_device *counter_dev)
283 switch (counter_dev->variant) {
284 case ni_gpct_variant_e_series:
287 case ni_gpct_variant_m_series:
288 case ni_gpct_variant_660x:
293 static void ni_tio_reset_count_and_disarm(struct ni_gpct *counter)
295 unsigned cidx = counter->counter_index;
297 write_register(counter, Gi_Reset_Bit(cidx), NITIO_RESET_REG(cidx));
300 void ni_tio_init_counter(struct ni_gpct *counter)
302 struct ni_gpct_device *counter_dev = counter->counter_dev;
303 unsigned cidx = counter->counter_index;
305 ni_tio_reset_count_and_disarm(counter);
307 /* initialize counter registers */
308 counter_dev->regs[NITIO_AUTO_INC_REG(cidx)] = 0x0;
309 write_register(counter, counter_dev->regs[NITIO_AUTO_INC_REG(cidx)],
310 NITIO_AUTO_INC_REG(cidx));
312 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
313 ~0, Gi_Synchronize_Gate_Bit);
315 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx), ~0, 0);
317 counter_dev->regs[NITIO_LOADA_REG(cidx)] = 0x0;
318 write_register(counter, counter_dev->regs[NITIO_LOADA_REG(cidx)],
319 NITIO_LOADA_REG(cidx));
321 counter_dev->regs[NITIO_LOADB_REG(cidx)] = 0x0;
322 write_register(counter, counter_dev->regs[NITIO_LOADB_REG(cidx)],
323 NITIO_LOADB_REG(cidx));
325 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx), ~0, 0);
327 if (ni_tio_counting_mode_registers_present(counter_dev))
328 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx), ~0, 0);
330 if (ni_tio_second_gate_registers_present(counter_dev)) {
331 counter_dev->regs[NITIO_GATE2_REG(cidx)] = 0x0;
332 write_register(counter,
333 counter_dev->regs[NITIO_GATE2_REG(cidx)],
334 NITIO_GATE2_REG(cidx));
337 ni_tio_set_bits(counter, NITIO_DMA_CFG_REG(cidx), ~0, 0x0);
339 ni_tio_set_bits(counter, NITIO_INT_ENA_REG(cidx), ~0, 0x0);
341 EXPORT_SYMBOL_GPL(ni_tio_init_counter);
343 static unsigned int ni_tio_counter_status(struct ni_gpct *counter)
345 unsigned cidx = counter->counter_index;
346 const unsigned bits = read_register(counter,
347 NITIO_SHARED_STATUS_REG(cidx));
348 unsigned int status = 0;
350 if (bits & Gi_Armed_Bit(cidx)) {
351 status |= COMEDI_COUNTER_ARMED;
352 if (bits & Gi_Counting_Bit(cidx))
353 status |= COMEDI_COUNTER_COUNTING;
358 static void ni_tio_set_sync_mode(struct ni_gpct *counter, int force_alt_sync)
360 struct ni_gpct_device *counter_dev = counter->counter_dev;
361 unsigned cidx = counter->counter_index;
362 const unsigned counting_mode_reg = NITIO_CNT_MODE_REG(cidx);
363 static const uint64_t min_normal_sync_period_ps = 25000;
364 const uint64_t clock_period_ps = ni_tio_clock_period_ps(counter,
365 ni_tio_generic_clock_src_select
368 if (ni_tio_counting_mode_registers_present(counter_dev) == 0)
371 switch (ni_tio_get_soft_copy(counter, counting_mode_reg) & Gi_Counting_Mode_Mask) {
372 case Gi_Counting_Mode_QuadratureX1_Bits:
373 case Gi_Counting_Mode_QuadratureX2_Bits:
374 case Gi_Counting_Mode_QuadratureX4_Bits:
375 case Gi_Counting_Mode_Sync_Source_Bits:
382 * It's not clear what we should do if clock_period is unknown, so we
383 * are not using the alt sync bit in that case, but allow the caller
384 * to decide by using the force_alt_sync parameter.
386 if (force_alt_sync ||
387 (clock_period_ps && clock_period_ps < min_normal_sync_period_ps)) {
388 ni_tio_set_bits(counter, counting_mode_reg,
389 Gi_Alternate_Sync_Bit(counter_dev->variant),
390 Gi_Alternate_Sync_Bit(counter_dev->variant));
392 ni_tio_set_bits(counter, counting_mode_reg,
393 Gi_Alternate_Sync_Bit(counter_dev->variant),
398 static int ni_tio_set_counter_mode(struct ni_gpct *counter, unsigned mode)
400 struct ni_gpct_device *counter_dev = counter->counter_dev;
401 unsigned cidx = counter->counter_index;
402 unsigned mode_reg_mask;
403 unsigned mode_reg_values;
404 unsigned input_select_bits = 0;
405 /* these bits map directly on to the mode register */
406 static const unsigned mode_reg_direct_mask =
407 NI_GPCT_GATE_ON_BOTH_EDGES_BIT | NI_GPCT_EDGE_GATE_MODE_MASK |
408 NI_GPCT_STOP_MODE_MASK | NI_GPCT_OUTPUT_MODE_MASK |
409 NI_GPCT_HARDWARE_DISARM_MASK | NI_GPCT_LOADING_ON_TC_BIT |
410 NI_GPCT_LOADING_ON_GATE_BIT | NI_GPCT_LOAD_B_SELECT_BIT;
412 mode_reg_mask = mode_reg_direct_mask | Gi_Reload_Source_Switching_Bit;
413 mode_reg_values = mode & mode_reg_direct_mask;
414 switch (mode & NI_GPCT_RELOAD_SOURCE_MASK) {
415 case NI_GPCT_RELOAD_SOURCE_FIXED_BITS:
417 case NI_GPCT_RELOAD_SOURCE_SWITCHING_BITS:
418 mode_reg_values |= Gi_Reload_Source_Switching_Bit;
420 case NI_GPCT_RELOAD_SOURCE_GATE_SELECT_BITS:
421 input_select_bits |= Gi_Gate_Select_Load_Source_Bit;
422 mode_reg_mask |= Gi_Gating_Mode_Mask;
423 mode_reg_values |= Gi_Level_Gating_Bits;
428 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
429 mode_reg_mask, mode_reg_values);
431 if (ni_tio_counting_mode_registers_present(counter_dev)) {
432 unsigned counting_mode_bits = 0;
434 counting_mode_bits |=
435 (mode >> NI_GPCT_COUNTING_MODE_SHIFT) &
436 Gi_Counting_Mode_Mask;
437 counting_mode_bits |=
438 ((mode >> NI_GPCT_INDEX_PHASE_BITSHIFT) <<
439 Gi_Index_Phase_Bitshift) & Gi_Index_Phase_Mask;
440 if (mode & NI_GPCT_INDEX_ENABLE_BIT)
441 counting_mode_bits |= Gi_Index_Mode_Bit;
442 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
443 Gi_Counting_Mode_Mask | Gi_Index_Phase_Mask |
444 Gi_Index_Mode_Bit, counting_mode_bits);
445 ni_tio_set_sync_mode(counter, 0);
448 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
450 (mode >> NI_GPCT_COUNTING_DIRECTION_SHIFT) <<
453 if (mode & NI_GPCT_OR_GATE_BIT)
454 input_select_bits |= Gi_Or_Gate_Bit;
455 if (mode & NI_GPCT_INVERT_OUTPUT_BIT)
456 input_select_bits |= Gi_Output_Polarity_Bit;
457 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
458 Gi_Gate_Select_Load_Source_Bit | Gi_Or_Gate_Bit |
459 Gi_Output_Polarity_Bit, input_select_bits);
464 int ni_tio_arm(struct ni_gpct *counter, int arm, unsigned start_trigger)
466 struct ni_gpct_device *counter_dev = counter->counter_dev;
467 unsigned cidx = counter->counter_index;
468 unsigned command_transient_bits = 0;
471 switch (start_trigger) {
472 case NI_GPCT_ARM_IMMEDIATE:
473 command_transient_bits |= Gi_Arm_Bit;
475 case NI_GPCT_ARM_PAIRED_IMMEDIATE:
476 command_transient_bits |= Gi_Arm_Bit | Gi_Arm_Copy_Bit;
481 if (ni_tio_counting_mode_registers_present(counter_dev)) {
482 unsigned counting_mode_bits = 0;
484 switch (start_trigger) {
485 case NI_GPCT_ARM_IMMEDIATE:
486 case NI_GPCT_ARM_PAIRED_IMMEDIATE:
489 if (start_trigger & NI_GPCT_ARM_UNKNOWN) {
491 * pass-through the least significant
492 * bits so we can figure out what
495 unsigned hw_arm_select_bits =
497 Gi_HW_Arm_Select_Shift) &
498 Gi_HW_Arm_Select_Mask
499 (counter_dev->variant);
501 counting_mode_bits |=
502 Gi_HW_Arm_Enable_Bit |
509 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
510 Gi_HW_Arm_Select_Mask
511 (counter_dev->variant) |
512 Gi_HW_Arm_Enable_Bit,
516 command_transient_bits |= Gi_Disarm_Bit;
518 ni_tio_set_bits_transient(counter, NITIO_CMD_REG(cidx),
519 0, 0, command_transient_bits);
522 EXPORT_SYMBOL_GPL(ni_tio_arm);
524 static unsigned ni_660x_source_select_bits(unsigned int clock_source)
526 unsigned ni_660x_clock;
528 const unsigned clock_select_bits =
529 clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
531 switch (clock_select_bits) {
532 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
533 ni_660x_clock = NI_660x_Timebase_1_Clock;
535 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
536 ni_660x_clock = NI_660x_Timebase_2_Clock;
538 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
539 ni_660x_clock = NI_660x_Timebase_3_Clock;
541 case NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS:
542 ni_660x_clock = NI_660x_Logic_Low_Clock;
544 case NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS:
545 ni_660x_clock = NI_660x_Source_Pin_i_Clock;
547 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
548 ni_660x_clock = NI_660x_Next_Gate_Clock;
550 case NI_GPCT_NEXT_TC_CLOCK_SRC_BITS:
551 ni_660x_clock = NI_660x_Next_TC_Clock;
554 for (i = 0; i <= ni_660x_max_rtsi_channel; ++i) {
555 if (clock_select_bits == NI_GPCT_RTSI_CLOCK_SRC_BITS(i)) {
556 ni_660x_clock = NI_660x_RTSI_Clock(i);
560 if (i <= ni_660x_max_rtsi_channel)
562 for (i = 0; i <= ni_660x_max_source_pin; ++i) {
563 if (clock_select_bits ==
564 NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(i)) {
565 ni_660x_clock = NI_660x_Source_Pin_Clock(i);
569 if (i <= ni_660x_max_source_pin)
575 return Gi_Source_Select_Bits(ni_660x_clock);
578 static unsigned ni_m_series_source_select_bits(unsigned int clock_source)
580 unsigned ni_m_series_clock;
582 const unsigned clock_select_bits =
583 clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
584 switch (clock_select_bits) {
585 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
586 ni_m_series_clock = NI_M_Series_Timebase_1_Clock;
588 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
589 ni_m_series_clock = NI_M_Series_Timebase_2_Clock;
591 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
592 ni_m_series_clock = NI_M_Series_Timebase_3_Clock;
594 case NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS:
595 ni_m_series_clock = NI_M_Series_Logic_Low_Clock;
597 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
598 ni_m_series_clock = NI_M_Series_Next_Gate_Clock;
600 case NI_GPCT_NEXT_TC_CLOCK_SRC_BITS:
601 ni_m_series_clock = NI_M_Series_Next_TC_Clock;
603 case NI_GPCT_PXI10_CLOCK_SRC_BITS:
604 ni_m_series_clock = NI_M_Series_PXI10_Clock;
606 case NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS:
607 ni_m_series_clock = NI_M_Series_PXI_Star_Trigger_Clock;
609 case NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS:
610 ni_m_series_clock = NI_M_Series_Analog_Trigger_Out_Clock;
613 for (i = 0; i <= ni_m_series_max_rtsi_channel; ++i) {
614 if (clock_select_bits == NI_GPCT_RTSI_CLOCK_SRC_BITS(i)) {
615 ni_m_series_clock = NI_M_RTSI_CLK(i);
619 if (i <= ni_m_series_max_rtsi_channel)
621 for (i = 0; i <= ni_m_series_max_pfi_channel; ++i) {
622 if (clock_select_bits == NI_GPCT_PFI_CLOCK_SRC_BITS(i)) {
623 ni_m_series_clock = NI_M_PFI_CLK(i);
627 if (i <= ni_m_series_max_pfi_channel)
629 printk(KERN_ERR "invalid clock source 0x%lx\n",
630 (unsigned long)clock_source);
632 ni_m_series_clock = 0;
635 return Gi_Source_Select_Bits(ni_m_series_clock);
638 static void ni_tio_set_source_subselect(struct ni_gpct *counter,
639 unsigned int clock_source)
641 struct ni_gpct_device *counter_dev = counter->counter_dev;
642 unsigned cidx = counter->counter_index;
643 const unsigned second_gate_reg = NITIO_GATE2_REG(cidx);
645 if (counter_dev->variant != ni_gpct_variant_m_series)
647 switch (clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK) {
648 /* Gi_Source_Subselect is zero */
649 case NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS:
650 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
651 counter_dev->regs[second_gate_reg] &= ~Gi_Source_Subselect_Bit;
653 /* Gi_Source_Subselect is one */
654 case NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS:
655 case NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS:
656 counter_dev->regs[second_gate_reg] |= Gi_Source_Subselect_Bit;
658 /* Gi_Source_Subselect doesn't matter */
662 write_register(counter, counter_dev->regs[second_gate_reg],
666 static int ni_tio_set_clock_src(struct ni_gpct *counter,
667 unsigned int clock_source,
668 unsigned int period_ns)
670 struct ni_gpct_device *counter_dev = counter->counter_dev;
671 unsigned cidx = counter->counter_index;
672 unsigned input_select_bits = 0;
673 static const uint64_t pico_per_nano = 1000;
675 /*FIXME: validate clock source */
676 switch (counter_dev->variant) {
677 case ni_gpct_variant_660x:
678 input_select_bits |= ni_660x_source_select_bits(clock_source);
680 case ni_gpct_variant_e_series:
681 case ni_gpct_variant_m_series:
684 ni_m_series_source_select_bits(clock_source);
687 if (clock_source & NI_GPCT_INVERT_CLOCK_SRC_BIT)
688 input_select_bits |= Gi_Source_Polarity_Bit;
689 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
690 Gi_Source_Select_Mask | Gi_Source_Polarity_Bit,
692 ni_tio_set_source_subselect(counter, clock_source);
693 if (ni_tio_counting_mode_registers_present(counter_dev)) {
694 const unsigned prescaling_mode =
695 clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK;
696 unsigned counting_mode_bits = 0;
698 switch (prescaling_mode) {
699 case NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS:
701 case NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS:
702 counting_mode_bits |=
703 Gi_Prescale_X2_Bit(counter_dev->variant);
705 case NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS:
706 counting_mode_bits |=
707 Gi_Prescale_X8_Bit(counter_dev->variant);
712 ni_tio_set_bits(counter, NITIO_CNT_MODE_REG(cidx),
713 Gi_Prescale_X2_Bit(counter_dev->variant) |
714 Gi_Prescale_X8_Bit(counter_dev->variant),
717 counter->clock_period_ps = pico_per_nano * period_ns;
718 ni_tio_set_sync_mode(counter, 0);
722 static unsigned ni_tio_clock_src_modifiers(const struct ni_gpct *counter)
724 struct ni_gpct_device *counter_dev = counter->counter_dev;
725 unsigned cidx = counter->counter_index;
726 const unsigned counting_mode_bits =
727 ni_tio_get_soft_copy(counter, NITIO_CNT_MODE_REG(cidx));
730 if (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
731 Gi_Source_Polarity_Bit)
732 bits |= NI_GPCT_INVERT_CLOCK_SRC_BIT;
733 if (counting_mode_bits & Gi_Prescale_X2_Bit(counter_dev->variant))
734 bits |= NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS;
735 if (counting_mode_bits & Gi_Prescale_X8_Bit(counter_dev->variant))
736 bits |= NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS;
740 static unsigned ni_m_series_clock_src_select(const struct ni_gpct *counter)
742 struct ni_gpct_device *counter_dev = counter->counter_dev;
743 unsigned cidx = counter->counter_index;
744 const unsigned second_gate_reg = NITIO_GATE2_REG(cidx);
745 unsigned clock_source = 0;
747 const unsigned input_select =
748 (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
749 Gi_Source_Select_Mask) >> Gi_Source_Select_Shift;
751 switch (input_select) {
752 case NI_M_Series_Timebase_1_Clock:
753 clock_source = NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS;
755 case NI_M_Series_Timebase_2_Clock:
756 clock_source = NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS;
758 case NI_M_Series_Timebase_3_Clock:
759 if (counter_dev->regs[second_gate_reg] &
760 Gi_Source_Subselect_Bit)
762 NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS;
764 clock_source = NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS;
766 case NI_M_Series_Logic_Low_Clock:
767 clock_source = NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS;
769 case NI_M_Series_Next_Gate_Clock:
770 if (counter_dev->regs[second_gate_reg] &
771 Gi_Source_Subselect_Bit)
772 clock_source = NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS;
774 clock_source = NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS;
776 case NI_M_Series_PXI10_Clock:
777 clock_source = NI_GPCT_PXI10_CLOCK_SRC_BITS;
779 case NI_M_Series_Next_TC_Clock:
780 clock_source = NI_GPCT_NEXT_TC_CLOCK_SRC_BITS;
783 for (i = 0; i <= ni_m_series_max_rtsi_channel; ++i) {
784 if (input_select == NI_M_RTSI_CLK(i)) {
785 clock_source = NI_GPCT_RTSI_CLOCK_SRC_BITS(i);
789 if (i <= ni_m_series_max_rtsi_channel)
791 for (i = 0; i <= ni_m_series_max_pfi_channel; ++i) {
792 if (input_select == NI_M_PFI_CLK(i)) {
793 clock_source = NI_GPCT_PFI_CLOCK_SRC_BITS(i);
797 if (i <= ni_m_series_max_pfi_channel)
802 clock_source |= ni_tio_clock_src_modifiers(counter);
806 static unsigned ni_660x_clock_src_select(const struct ni_gpct *counter)
808 unsigned clock_source = 0;
809 unsigned cidx = counter->counter_index;
810 const unsigned input_select =
811 (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
812 Gi_Source_Select_Mask) >> Gi_Source_Select_Shift;
815 switch (input_select) {
816 case NI_660x_Timebase_1_Clock:
817 clock_source = NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS;
819 case NI_660x_Timebase_2_Clock:
820 clock_source = NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS;
822 case NI_660x_Timebase_3_Clock:
823 clock_source = NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS;
825 case NI_660x_Logic_Low_Clock:
826 clock_source = NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS;
828 case NI_660x_Source_Pin_i_Clock:
829 clock_source = NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS;
831 case NI_660x_Next_Gate_Clock:
832 clock_source = NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS;
834 case NI_660x_Next_TC_Clock:
835 clock_source = NI_GPCT_NEXT_TC_CLOCK_SRC_BITS;
838 for (i = 0; i <= ni_660x_max_rtsi_channel; ++i) {
839 if (input_select == NI_660x_RTSI_Clock(i)) {
840 clock_source = NI_GPCT_RTSI_CLOCK_SRC_BITS(i);
844 if (i <= ni_660x_max_rtsi_channel)
846 for (i = 0; i <= ni_660x_max_source_pin; ++i) {
847 if (input_select == NI_660x_Source_Pin_Clock(i)) {
849 NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(i);
853 if (i <= ni_660x_max_source_pin)
858 clock_source |= ni_tio_clock_src_modifiers(counter);
862 static unsigned ni_tio_generic_clock_src_select(const struct ni_gpct *counter)
864 switch (counter->counter_dev->variant) {
865 case ni_gpct_variant_e_series:
866 case ni_gpct_variant_m_series:
868 return ni_m_series_clock_src_select(counter);
869 case ni_gpct_variant_660x:
870 return ni_660x_clock_src_select(counter);
874 static uint64_t ni_tio_clock_period_ps(const struct ni_gpct *counter,
875 unsigned generic_clock_source)
877 uint64_t clock_period_ps;
879 switch (generic_clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK) {
880 case NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS:
881 clock_period_ps = 50000;
883 case NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS:
884 clock_period_ps = 10000000;
886 case NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS:
887 clock_period_ps = 12500;
889 case NI_GPCT_PXI10_CLOCK_SRC_BITS:
890 clock_period_ps = 100000;
894 * clock period is specified by user with prescaling
895 * already taken into account.
897 return counter->clock_period_ps;
900 switch (generic_clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK) {
901 case NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS:
903 case NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS:
904 clock_period_ps *= 2;
906 case NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS:
907 clock_period_ps *= 8;
913 return clock_period_ps;
916 static void ni_tio_get_clock_src(struct ni_gpct *counter,
917 unsigned int *clock_source,
918 unsigned int *period_ns)
920 static const unsigned pico_per_nano = 1000;
922 *clock_source = ni_tio_generic_clock_src_select(counter);
923 temp64 = ni_tio_clock_period_ps(counter, *clock_source);
924 do_div(temp64, pico_per_nano);
928 static void ni_tio_set_first_gate_modifiers(struct ni_gpct *counter,
929 unsigned int gate_source)
931 const unsigned mode_mask = Gi_Gate_Polarity_Bit | Gi_Gating_Mode_Mask;
932 unsigned cidx = counter->counter_index;
933 unsigned mode_values = 0;
935 if (gate_source & CR_INVERT)
936 mode_values |= Gi_Gate_Polarity_Bit;
937 if (gate_source & CR_EDGE)
938 mode_values |= Gi_Rising_Edge_Gating_Bits;
940 mode_values |= Gi_Level_Gating_Bits;
941 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
942 mode_mask, mode_values);
945 static int ni_660x_set_first_gate(struct ni_gpct *counter,
946 unsigned int gate_source)
948 unsigned int chan = CR_CHAN(gate_source);
949 unsigned cidx = counter->counter_index;
954 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
955 gate_sel = NI_660x_Next_SRC_Gate_Select;
957 case NI_GPCT_NEXT_OUT_GATE_SELECT:
958 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
959 case NI_GPCT_SOURCE_PIN_i_GATE_SELECT:
960 case NI_GPCT_GATE_PIN_i_GATE_SELECT:
961 gate_sel = chan & 0x1f;
964 for (i = 0; i <= ni_660x_max_rtsi_channel; ++i) {
965 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
966 gate_sel = chan & 0x1f;
970 if (i <= ni_660x_max_rtsi_channel)
972 for (i = 0; i <= ni_660x_max_gate_pin; ++i) {
973 if (chan == NI_GPCT_GATE_PIN_GATE_SELECT(i)) {
974 gate_sel = chan & 0x1f;
978 if (i <= ni_660x_max_gate_pin)
982 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
983 Gi_Gate_Select_Mask, Gi_Gate_Select_Bits(gate_sel));
987 static int ni_m_series_set_first_gate(struct ni_gpct *counter,
988 unsigned int gate_source)
990 unsigned int chan = CR_CHAN(gate_source);
991 unsigned cidx = counter->counter_index;
996 case NI_GPCT_TIMESTAMP_MUX_GATE_SELECT:
997 case NI_GPCT_AI_START2_GATE_SELECT:
998 case NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT:
999 case NI_GPCT_NEXT_OUT_GATE_SELECT:
1000 case NI_GPCT_AI_START1_GATE_SELECT:
1001 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
1002 case NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT:
1003 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
1004 gate_sel = chan & 0x1f;
1007 for (i = 0; i <= ni_m_series_max_rtsi_channel; ++i) {
1008 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
1009 gate_sel = chan & 0x1f;
1013 if (i <= ni_m_series_max_rtsi_channel)
1015 for (i = 0; i <= ni_m_series_max_pfi_channel; ++i) {
1016 if (chan == NI_GPCT_PFI_GATE_SELECT(i)) {
1017 gate_sel = chan & 0x1f;
1021 if (i <= ni_m_series_max_pfi_channel)
1025 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
1026 Gi_Gate_Select_Mask, Gi_Gate_Select_Bits(gate_sel));
1030 static int ni_660x_set_second_gate(struct ni_gpct *counter,
1031 unsigned int gate_source)
1033 struct ni_gpct_device *counter_dev = counter->counter_dev;
1034 unsigned cidx = counter->counter_index;
1035 unsigned int chan = CR_CHAN(gate_source);
1036 unsigned gate2_reg = NITIO_GATE2_REG(cidx);
1041 case NI_GPCT_SOURCE_PIN_i_GATE_SELECT:
1042 case NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT:
1043 case NI_GPCT_SELECTED_GATE_GATE_SELECT:
1044 case NI_GPCT_NEXT_OUT_GATE_SELECT:
1045 case NI_GPCT_LOGIC_LOW_GATE_SELECT:
1046 gate2_sel = chan & 0x1f;
1048 case NI_GPCT_NEXT_SOURCE_GATE_SELECT:
1049 gate2_sel = NI_660x_Next_SRC_Second_Gate_Select;
1052 for (i = 0; i <= ni_660x_max_rtsi_channel; ++i) {
1053 if (chan == NI_GPCT_RTSI_GATE_SELECT(i)) {
1054 gate2_sel = chan & 0x1f;
1058 if (i <= ni_660x_max_rtsi_channel)
1060 for (i = 0; i <= ni_660x_max_up_down_pin; ++i) {
1061 if (chan == NI_GPCT_UP_DOWN_PIN_GATE_SELECT(i)) {
1062 gate2_sel = chan & 0x1f;
1066 if (i <= ni_660x_max_up_down_pin)
1070 counter_dev->regs[gate2_reg] |= Gi_Second_Gate_Mode_Bit;
1071 counter_dev->regs[gate2_reg] &= ~Gi_Second_Gate_Select_Mask;
1072 counter_dev->regs[gate2_reg] |= Gi_Second_Gate_Select_Bits(gate2_sel);
1073 write_register(counter, counter_dev->regs[gate2_reg], gate2_reg);
1077 static int ni_m_series_set_second_gate(struct ni_gpct *counter,
1078 unsigned int gate_source)
1080 struct ni_gpct_device *counter_dev = counter->counter_dev;
1081 unsigned cidx = counter->counter_index;
1082 const unsigned second_gate_reg = NITIO_GATE2_REG(cidx);
1083 const unsigned selected_second_gate = CR_CHAN(gate_source);
1084 /* bits of second_gate that may be meaningful to second gate register */
1085 static const unsigned selected_second_gate_mask = 0x1f;
1086 unsigned ni_m_series_second_gate_select;
1089 * FIXME: We don't know what the m-series second gate codes are,
1090 * so we'll just pass the bits through for now.
1092 switch (selected_second_gate) {
1094 ni_m_series_second_gate_select =
1095 selected_second_gate & selected_second_gate_mask;
1098 counter_dev->regs[second_gate_reg] |= Gi_Second_Gate_Mode_Bit;
1099 counter_dev->regs[second_gate_reg] &= ~Gi_Second_Gate_Select_Mask;
1100 counter_dev->regs[second_gate_reg] |=
1101 Gi_Second_Gate_Select_Bits(ni_m_series_second_gate_select);
1102 write_register(counter, counter_dev->regs[second_gate_reg],
1107 int ni_tio_set_gate_src(struct ni_gpct *counter, unsigned gate_index,
1108 unsigned int gate_source)
1110 struct ni_gpct_device *counter_dev = counter->counter_dev;
1111 unsigned cidx = counter->counter_index;
1112 const unsigned second_gate_reg = NITIO_GATE2_REG(cidx);
1114 switch (gate_index) {
1116 if (CR_CHAN(gate_source) == NI_GPCT_DISABLED_GATE_SELECT) {
1117 ni_tio_set_bits(counter, NITIO_MODE_REG(cidx),
1118 Gi_Gating_Mode_Mask,
1119 Gi_Gating_Disabled_Bits);
1122 ni_tio_set_first_gate_modifiers(counter, gate_source);
1123 switch (counter_dev->variant) {
1124 case ni_gpct_variant_e_series:
1125 case ni_gpct_variant_m_series:
1127 return ni_m_series_set_first_gate(counter, gate_source);
1128 case ni_gpct_variant_660x:
1129 return ni_660x_set_first_gate(counter, gate_source);
1133 if (ni_tio_second_gate_registers_present(counter_dev) == 0)
1135 if (CR_CHAN(gate_source) == NI_GPCT_DISABLED_GATE_SELECT) {
1136 counter_dev->regs[second_gate_reg] &=
1137 ~Gi_Second_Gate_Mode_Bit;
1138 write_register(counter,
1139 counter_dev->regs[second_gate_reg],
1143 if (gate_source & CR_INVERT) {
1144 counter_dev->regs[second_gate_reg] |=
1145 Gi_Second_Gate_Polarity_Bit;
1147 counter_dev->regs[second_gate_reg] &=
1148 ~Gi_Second_Gate_Polarity_Bit;
1150 switch (counter_dev->variant) {
1151 case ni_gpct_variant_m_series:
1152 return ni_m_series_set_second_gate(counter,
1154 case ni_gpct_variant_660x:
1155 return ni_660x_set_second_gate(counter, gate_source);
1166 EXPORT_SYMBOL_GPL(ni_tio_set_gate_src);
1168 static int ni_tio_set_other_src(struct ni_gpct *counter, unsigned index,
1169 unsigned int source)
1171 struct ni_gpct_device *counter_dev = counter->counter_dev;
1172 unsigned cidx = counter->counter_index;
1174 if (counter_dev->variant == ni_gpct_variant_m_series) {
1175 unsigned int abz_reg, shift, mask;
1177 abz_reg = NITIO_ABZ_REG(cidx);
1179 case NI_GPCT_SOURCE_ENCODER_A:
1182 case NI_GPCT_SOURCE_ENCODER_B:
1185 case NI_GPCT_SOURCE_ENCODER_Z:
1191 mask = 0x1f << shift;
1192 if (source > 0x1f) {
1196 counter_dev->regs[abz_reg] &= ~mask;
1197 counter_dev->regs[abz_reg] |= (source << shift) & mask;
1198 write_register(counter, counter_dev->regs[abz_reg], abz_reg);
1205 ni_660x_first_gate_to_generic_gate_source(unsigned ni_660x_gate_select)
1209 switch (ni_660x_gate_select) {
1210 case NI_660x_Source_Pin_i_Gate_Select:
1211 return NI_GPCT_SOURCE_PIN_i_GATE_SELECT;
1212 case NI_660x_Gate_Pin_i_Gate_Select:
1213 return NI_GPCT_GATE_PIN_i_GATE_SELECT;
1214 case NI_660x_Next_SRC_Gate_Select:
1215 return NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1216 case NI_660x_Next_Out_Gate_Select:
1217 return NI_GPCT_NEXT_OUT_GATE_SELECT;
1218 case NI_660x_Logic_Low_Gate_Select:
1219 return NI_GPCT_LOGIC_LOW_GATE_SELECT;
1221 for (i = 0; i <= ni_660x_max_rtsi_channel; ++i) {
1222 if (ni_660x_gate_select == NI_660x_RTSI_Gate_Select(i))
1223 return NI_GPCT_RTSI_GATE_SELECT(i);
1225 if (i <= ni_660x_max_rtsi_channel)
1227 for (i = 0; i <= ni_660x_max_gate_pin; ++i) {
1228 if (ni_660x_gate_select ==
1229 NI_660x_Gate_Pin_Gate_Select(i))
1230 return NI_GPCT_GATE_PIN_GATE_SELECT(i);
1232 if (i <= ni_660x_max_gate_pin)
1241 ni_m_series_first_gate_to_generic_gate_source(unsigned ni_m_series_gate_select)
1245 switch (ni_m_series_gate_select) {
1246 case NI_M_Series_Timestamp_Mux_Gate_Select:
1247 return NI_GPCT_TIMESTAMP_MUX_GATE_SELECT;
1248 case NI_M_Series_AI_START2_Gate_Select:
1249 return NI_GPCT_AI_START2_GATE_SELECT;
1250 case NI_M_Series_PXI_Star_Trigger_Gate_Select:
1251 return NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT;
1252 case NI_M_Series_Next_Out_Gate_Select:
1253 return NI_GPCT_NEXT_OUT_GATE_SELECT;
1254 case NI_M_Series_AI_START1_Gate_Select:
1255 return NI_GPCT_AI_START1_GATE_SELECT;
1256 case NI_M_Series_Next_SRC_Gate_Select:
1257 return NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1258 case NI_M_Series_Analog_Trigger_Out_Gate_Select:
1259 return NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT;
1260 case NI_M_Series_Logic_Low_Gate_Select:
1261 return NI_GPCT_LOGIC_LOW_GATE_SELECT;
1263 for (i = 0; i <= ni_m_series_max_rtsi_channel; ++i) {
1264 if (ni_m_series_gate_select ==
1265 NI_M_Series_RTSI_Gate_Select(i)) {
1266 return NI_GPCT_RTSI_GATE_SELECT(i);
1269 if (i <= ni_m_series_max_rtsi_channel)
1271 for (i = 0; i <= ni_m_series_max_pfi_channel; ++i) {
1272 if (ni_m_series_gate_select ==
1273 NI_M_Series_PFI_Gate_Select(i)) {
1274 return NI_GPCT_PFI_GATE_SELECT(i);
1277 if (i <= ni_m_series_max_pfi_channel)
1286 ni_660x_second_gate_to_generic_gate_source(unsigned ni_660x_gate_select)
1290 switch (ni_660x_gate_select) {
1291 case NI_660x_Source_Pin_i_Second_Gate_Select:
1292 return NI_GPCT_SOURCE_PIN_i_GATE_SELECT;
1293 case NI_660x_Up_Down_Pin_i_Second_Gate_Select:
1294 return NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT;
1295 case NI_660x_Next_SRC_Second_Gate_Select:
1296 return NI_GPCT_NEXT_SOURCE_GATE_SELECT;
1297 case NI_660x_Next_Out_Second_Gate_Select:
1298 return NI_GPCT_NEXT_OUT_GATE_SELECT;
1299 case NI_660x_Selected_Gate_Second_Gate_Select:
1300 return NI_GPCT_SELECTED_GATE_GATE_SELECT;
1301 case NI_660x_Logic_Low_Second_Gate_Select:
1302 return NI_GPCT_LOGIC_LOW_GATE_SELECT;
1304 for (i = 0; i <= ni_660x_max_rtsi_channel; ++i) {
1305 if (ni_660x_gate_select ==
1306 NI_660x_RTSI_Second_Gate_Select(i)) {
1307 return NI_GPCT_RTSI_GATE_SELECT(i);
1310 if (i <= ni_660x_max_rtsi_channel)
1312 for (i = 0; i <= ni_660x_max_up_down_pin; ++i) {
1313 if (ni_660x_gate_select ==
1314 NI_660x_Up_Down_Pin_Second_Gate_Select(i)) {
1315 return NI_GPCT_UP_DOWN_PIN_GATE_SELECT(i);
1318 if (i <= ni_660x_max_up_down_pin)
1327 ni_m_series_second_gate_to_generic_gate_source(unsigned ni_m_series_gate_select)
1330 * FIXME: the second gate sources for the m series are undocumented,
1331 * so we just return the raw bits for now.
1333 switch (ni_m_series_gate_select) {
1335 return ni_m_series_gate_select;
1340 static int ni_tio_get_gate_src(struct ni_gpct *counter, unsigned gate_index,
1341 unsigned int *gate_source)
1343 struct ni_gpct_device *counter_dev = counter->counter_dev;
1344 unsigned cidx = counter->counter_index;
1345 const unsigned mode_bits =
1346 ni_tio_get_soft_copy(counter, NITIO_MODE_REG(cidx));
1347 const unsigned second_gate_reg = NITIO_GATE2_REG(cidx);
1348 unsigned gate_select_bits;
1350 switch (gate_index) {
1352 if ((mode_bits & Gi_Gating_Mode_Mask) ==
1353 Gi_Gating_Disabled_Bits) {
1354 *gate_source = NI_GPCT_DISABLED_GATE_SELECT;
1359 (ni_tio_get_soft_copy(counter, NITIO_INPUT_SEL_REG(cidx)) &
1360 Gi_Gate_Select_Mask) >> Gi_Gate_Select_Shift;
1362 switch (counter_dev->variant) {
1363 case ni_gpct_variant_e_series:
1364 case ni_gpct_variant_m_series:
1367 ni_m_series_first_gate_to_generic_gate_source
1370 case ni_gpct_variant_660x:
1372 ni_660x_first_gate_to_generic_gate_source
1376 if (mode_bits & Gi_Gate_Polarity_Bit)
1377 *gate_source |= CR_INVERT;
1378 if ((mode_bits & Gi_Gating_Mode_Mask) != Gi_Level_Gating_Bits)
1379 *gate_source |= CR_EDGE;
1382 if ((mode_bits & Gi_Gating_Mode_Mask) == Gi_Gating_Disabled_Bits
1383 || (counter_dev->regs[second_gate_reg] &
1384 Gi_Second_Gate_Mode_Bit)
1386 *gate_source = NI_GPCT_DISABLED_GATE_SELECT;
1390 gate_select_bits = (counter_dev->regs[second_gate_reg] &
1391 Gi_Second_Gate_Select_Mask) >>
1392 Gi_Second_Gate_Select_Shift;
1393 switch (counter_dev->variant) {
1394 case ni_gpct_variant_e_series:
1395 case ni_gpct_variant_m_series:
1398 ni_m_series_second_gate_to_generic_gate_source
1401 case ni_gpct_variant_660x:
1403 ni_660x_second_gate_to_generic_gate_source
1407 if (counter_dev->regs[second_gate_reg] &
1408 Gi_Second_Gate_Polarity_Bit) {
1409 *gate_source |= CR_INVERT;
1411 /* second gate can't have edge/level mode set independently */
1412 if ((mode_bits & Gi_Gating_Mode_Mask) != Gi_Level_Gating_Bits)
1413 *gate_source |= CR_EDGE;
1421 int ni_tio_insn_config(struct comedi_device *dev,
1422 struct comedi_subdevice *s,
1423 struct comedi_insn *insn,
1426 struct ni_gpct *counter = s->private;
1429 case INSN_CONFIG_SET_COUNTER_MODE:
1430 return ni_tio_set_counter_mode(counter, data[1]);
1431 case INSN_CONFIG_ARM:
1432 return ni_tio_arm(counter, 1, data[1]);
1433 case INSN_CONFIG_DISARM:
1434 ni_tio_arm(counter, 0, 0);
1436 case INSN_CONFIG_GET_COUNTER_STATUS:
1437 data[1] = ni_tio_counter_status(counter);
1438 data[2] = counter_status_mask;
1440 case INSN_CONFIG_SET_CLOCK_SRC:
1441 return ni_tio_set_clock_src(counter, data[1], data[2]);
1442 case INSN_CONFIG_GET_CLOCK_SRC:
1443 ni_tio_get_clock_src(counter, &data[1], &data[2]);
1445 case INSN_CONFIG_SET_GATE_SRC:
1446 return ni_tio_set_gate_src(counter, data[1], data[2]);
1447 case INSN_CONFIG_GET_GATE_SRC:
1448 return ni_tio_get_gate_src(counter, data[1], &data[2]);
1449 case INSN_CONFIG_SET_OTHER_SRC:
1450 return ni_tio_set_other_src(counter, data[1], data[2]);
1451 case INSN_CONFIG_RESET:
1452 ni_tio_reset_count_and_disarm(counter);
1459 EXPORT_SYMBOL_GPL(ni_tio_insn_config);
1461 static unsigned int ni_tio_read_sw_save_reg(struct comedi_device *dev,
1462 struct comedi_subdevice *s)
1464 struct ni_gpct *counter = s->private;
1465 unsigned cidx = counter->counter_index;
1466 unsigned int first_read;
1467 unsigned int second_read;
1468 unsigned int correct_read;
1470 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx), Gi_Save_Trace_Bit, 0);
1471 ni_tio_set_bits(counter, NITIO_CMD_REG(cidx),
1472 Gi_Save_Trace_Bit, Gi_Save_Trace_Bit);
1475 * The count doesn't get latched until the next clock edge, so it is
1476 * possible the count may change (once) while we are reading. Since
1477 * the read of the SW_Save_Reg isn't atomic (apparently even when it's
1478 * a 32 bit register according to 660x docs), we need to read twice
1479 * and make sure the reading hasn't changed. If it has, a third read
1480 * will be correct since the count value will definitely have latched
1483 first_read = read_register(counter, NITIO_SW_SAVE_REG(cidx));
1484 second_read = read_register(counter, NITIO_SW_SAVE_REG(cidx));
1485 if (first_read != second_read)
1486 correct_read = read_register(counter, NITIO_SW_SAVE_REG(cidx));
1488 correct_read = first_read;
1490 return correct_read;
1493 int ni_tio_insn_read(struct comedi_device *dev,
1494 struct comedi_subdevice *s,
1495 struct comedi_insn *insn,
1498 struct ni_gpct *counter = s->private;
1499 struct ni_gpct_device *counter_dev = counter->counter_dev;
1500 unsigned int channel = CR_CHAN(insn->chanspec);
1501 unsigned cidx = counter->counter_index;
1504 for (i = 0; i < insn->n; i++) {
1507 data[i] = ni_tio_read_sw_save_reg(dev, s);
1510 data[i] = counter_dev->regs[NITIO_LOADA_REG(cidx)];
1513 data[i] = counter_dev->regs[NITIO_LOADB_REG(cidx)];
1519 EXPORT_SYMBOL_GPL(ni_tio_insn_read);
1521 static unsigned ni_tio_next_load_register(struct ni_gpct *counter)
1523 unsigned cidx = counter->counter_index;
1524 const unsigned bits =
1525 read_register(counter, NITIO_SHARED_STATUS_REG(cidx));
1527 return (bits & Gi_Next_Load_Source_Bit(cidx))
1528 ? NITIO_LOADB_REG(cidx)
1529 : NITIO_LOADA_REG(cidx);
1532 int ni_tio_insn_write(struct comedi_device *dev,
1533 struct comedi_subdevice *s,
1534 struct comedi_insn *insn,
1537 struct ni_gpct *counter = s->private;
1538 struct ni_gpct_device *counter_dev = counter->counter_dev;
1539 const unsigned channel = CR_CHAN(insn->chanspec);
1540 unsigned cidx = counter->counter_index;
1548 * Unsafe if counter is armed.
1549 * Should probably check status and return -EBUSY if armed.
1553 * Don't disturb load source select, just use whichever
1554 * load register is already selected.
1556 load_reg = ni_tio_next_load_register(counter);
1557 write_register(counter, data[0], load_reg);
1558 ni_tio_set_bits_transient(counter, NITIO_CMD_REG(cidx),
1560 /* restore load reg */
1561 write_register(counter, counter_dev->regs[load_reg], load_reg);
1564 counter_dev->regs[NITIO_LOADA_REG(cidx)] = data[0];
1565 write_register(counter, data[0], NITIO_LOADA_REG(cidx));
1568 counter_dev->regs[NITIO_LOADB_REG(cidx)] = data[0];
1569 write_register(counter, data[0], NITIO_LOADB_REG(cidx));
1576 EXPORT_SYMBOL_GPL(ni_tio_insn_write);
1578 static int __init ni_tio_init_module(void)
1582 module_init(ni_tio_init_module);
1584 static void __exit ni_tio_cleanup_module(void)
1587 module_exit(ni_tio_cleanup_module);
1589 MODULE_AUTHOR("Comedi <comedi@comedi.org>");
1590 MODULE_DESCRIPTION("Comedi support for NI general-purpose counters");
1591 MODULE_LICENSE("GPL");