Lines Matching refs:chan
73 static void set_comparator(int32_t chan, uint32_t cyc) in set_comparator() argument
75 nrfy_rtc_cc_set(RTC, chan, cyc & COUNTER_MAX); in set_comparator()
78 static bool event_check(int32_t chan) in event_check() argument
80 return nrfy_rtc_event_check(RTC, NRF_RTC_CHANNEL_EVENT_ADDR(chan)); in event_check()
83 static void event_clear(int32_t chan) in event_clear() argument
85 nrfy_rtc_event_clear(RTC, NRF_RTC_CHANNEL_EVENT_ADDR(chan)); in event_clear()
88 static void event_enable(int32_t chan) in event_enable() argument
90 nrfy_rtc_event_enable(RTC, NRF_RTC_CHANNEL_INT_MASK(chan)); in event_enable()
93 static void event_disable(int32_t chan) in event_disable() argument
95 nrfy_rtc_event_disable(RTC, NRF_RTC_CHANNEL_INT_MASK(chan)); in event_disable()
132 uint32_t z_nrf_rtc_timer_compare_evt_address_get(int32_t chan) in z_nrf_rtc_timer_compare_evt_address_get() argument
134 __ASSERT_NO_MSG(chan >= 0 && chan < CHAN_COUNT); in z_nrf_rtc_timer_compare_evt_address_get()
135 return nrfy_rtc_event_address_get(RTC, nrfy_rtc_compare_event_get(chan)); in z_nrf_rtc_timer_compare_evt_address_get()
138 uint32_t z_nrf_rtc_timer_capture_task_address_get(int32_t chan) in z_nrf_rtc_timer_capture_task_address_get() argument
141 __ASSERT_NO_MSG(chan >= 0 && chan < CHAN_COUNT); in z_nrf_rtc_timer_capture_task_address_get()
142 if (chan == 0) { in z_nrf_rtc_timer_capture_task_address_get()
146 return nrfy_rtc_task_address_get(RTC, nrfy_rtc_capture_task_get(chan)); in z_nrf_rtc_timer_capture_task_address_get()
148 ARG_UNUSED(chan); in z_nrf_rtc_timer_capture_task_address_get()
153 static bool compare_int_lock(int32_t chan) in compare_int_lock() argument
155 atomic_val_t prev = atomic_and(&int_mask, ~BIT(chan)); in compare_int_lock()
157 nrfy_rtc_int_disable(RTC, NRF_RTC_CHANNEL_INT_MASK(chan)); in compare_int_lock()
162 return prev & BIT(chan); in compare_int_lock()
166 bool z_nrf_rtc_timer_compare_int_lock(int32_t chan) in z_nrf_rtc_timer_compare_int_lock() argument
168 __ASSERT_NO_MSG(chan > 0 && chan < CHAN_COUNT); in z_nrf_rtc_timer_compare_int_lock()
170 return compare_int_lock(chan); in z_nrf_rtc_timer_compare_int_lock()
173 static void compare_int_unlock(int32_t chan, bool key) in compare_int_unlock() argument
176 atomic_or(&int_mask, BIT(chan)); in compare_int_unlock()
177 nrfy_rtc_int_enable(RTC, NRF_RTC_CHANNEL_INT_MASK(chan)); in compare_int_unlock()
178 if (atomic_get(&force_isr_mask) & BIT(chan)) { in compare_int_unlock()
184 void z_nrf_rtc_timer_compare_int_unlock(int32_t chan, bool key) in z_nrf_rtc_timer_compare_int_unlock() argument
186 __ASSERT_NO_MSG(chan > 0 && chan < CHAN_COUNT); in z_nrf_rtc_timer_compare_int_unlock()
188 compare_int_unlock(chan, key); in z_nrf_rtc_timer_compare_int_unlock()
191 uint32_t z_nrf_rtc_timer_compare_read(int32_t chan) in z_nrf_rtc_timer_compare_read() argument
193 __ASSERT_NO_MSG(chan >= 0 && chan < CHAN_COUNT); in z_nrf_rtc_timer_compare_read()
195 return nrfy_rtc_cc_get(RTC, chan); in z_nrf_rtc_timer_compare_read()
247 static int set_alarm(int32_t chan, uint32_t req_cc, bool exact) in set_alarm() argument
276 event_disable(chan); in set_alarm()
277 event_clear(chan); in set_alarm()
282 set_comparator(chan, cc_val); in set_alarm()
290 event_enable(chan); in set_alarm()
306 if (event_check(chan)) { in set_alarm()
316 event_clear(chan); in set_alarm()
339 static int compare_set_nolocks(int32_t chan, uint64_t target_time, in compare_set_nolocks() argument
353 if (target_time != cc_data[chan].target_time) { in compare_set_nolocks()
357 ret = set_alarm(chan, cc_value, exact); in compare_set_nolocks()
361 atomic_or(&force_isr_mask, BIT(chan)); in compare_set_nolocks()
367 cc_data[chan].target_time = target_time; in compare_set_nolocks()
368 cc_data[chan].callback = handler; in compare_set_nolocks()
369 cc_data[chan].user_context = user_data; in compare_set_nolocks()
375 static int compare_set(int32_t chan, uint64_t target_time, in compare_set() argument
381 key = compare_int_lock(chan); in compare_set()
383 int ret = compare_set_nolocks(chan, target_time, handler, user_data, exact); in compare_set()
385 compare_int_unlock(chan, key); in compare_set()
390 int z_nrf_rtc_timer_set(int32_t chan, uint64_t target_time, in z_nrf_rtc_timer_set() argument
394 __ASSERT_NO_MSG(chan > 0 && chan < CHAN_COUNT); in z_nrf_rtc_timer_set()
396 return compare_set(chan, target_time, handler, user_data, false); in z_nrf_rtc_timer_set()
399 int z_nrf_rtc_timer_exact_set(int32_t chan, uint64_t target_time, in z_nrf_rtc_timer_exact_set() argument
403 __ASSERT_NO_MSG(chan > 0 && chan < CHAN_COUNT); in z_nrf_rtc_timer_exact_set()
405 return compare_set(chan, target_time, handler, user_data, true); in z_nrf_rtc_timer_exact_set()
408 void z_nrf_rtc_timer_abort(int32_t chan) in z_nrf_rtc_timer_abort() argument
410 __ASSERT_NO_MSG(chan > 0 && chan < CHAN_COUNT); in z_nrf_rtc_timer_abort()
412 bool key = compare_int_lock(chan); in z_nrf_rtc_timer_abort()
414 cc_data[chan].target_time = TARGET_TIME_INVALID; in z_nrf_rtc_timer_abort()
415 event_clear(chan); in z_nrf_rtc_timer_abort()
416 event_disable(chan); in z_nrf_rtc_timer_abort()
417 (void)atomic_and(&force_isr_mask, ~BIT(chan)); in z_nrf_rtc_timer_abort()
419 compare_int_unlock(chan, key); in z_nrf_rtc_timer_abort()
470 static void sys_clock_timeout_handler(int32_t chan, in sys_clock_timeout_handler() argument
485 compare_set(chan, last_count + CYC_PER_TICK, in sys_clock_timeout_handler()
492 static bool channel_processing_check_and_clear(int32_t chan) in channel_processing_check_and_clear() argument
494 if (nrfy_rtc_int_enable_check(RTC, NRF_RTC_CHANNEL_INT_MASK(chan))) { in channel_processing_check_and_clear()
498 if ((atomic_and(&force_isr_mask, ~BIT(chan)) & BIT(chan)) || in channel_processing_check_and_clear()
499 event_check(chan)) { in channel_processing_check_and_clear()
500 event_clear(chan); in channel_processing_check_and_clear()
508 static void process_channel(int32_t chan) in process_channel() argument
510 if (channel_processing_check_and_clear(chan)) { in process_channel()
528 expire_time = cc_data[chan].target_time; in process_channel()
530 handler = cc_data[chan].callback; in process_channel()
531 user_context = cc_data[chan].user_context; in process_channel()
532 cc_data[chan].callback = NULL; in process_channel()
533 cc_data[chan].target_time = TARGET_TIME_INVALID; in process_channel()
534 event_disable(chan); in process_channel()
541 event_clear(chan); in process_channel()
547 handler(chan, expire_time, user_context); in process_channel()
573 for (int32_t chan = 0; chan < CHAN_COUNT; chan++) { in rtc_nrf_isr() local
574 process_channel(chan); in rtc_nrf_isr()
580 int32_t chan; in z_nrf_rtc_timer_chan_alloc() local
583 chan = alloc_mask ? 31 - __builtin_clz(alloc_mask) : -1; in z_nrf_rtc_timer_chan_alloc()
584 if (chan < 0) { in z_nrf_rtc_timer_chan_alloc()
587 prev = atomic_and(&alloc_mask, ~BIT(chan)); in z_nrf_rtc_timer_chan_alloc()
588 } while (!(prev & BIT(chan))); in z_nrf_rtc_timer_chan_alloc()
590 return chan; in z_nrf_rtc_timer_chan_alloc()
593 void z_nrf_rtc_timer_chan_free(int32_t chan) in z_nrf_rtc_timer_chan_free() argument
595 __ASSERT_NO_MSG(chan > 0 && chan < CHAN_COUNT); in z_nrf_rtc_timer_chan_free()
597 atomic_or(&alloc_mask, BIT(chan)); in z_nrf_rtc_timer_chan_free()
732 for (int32_t chan = 0; chan < CHAN_COUNT; chan++) { in sys_clock_driver_init() local
733 cc_data[chan].target_time = TARGET_TIME_INVALID; in sys_clock_driver_init()
734 nrfy_rtc_int_enable(RTC, NRF_RTC_CHANNEL_INT_MASK(chan)); in sys_clock_driver_init()