i32 cc_timer_start(cc_hndl hndl, struct u64_time *time_u64, u32 options) { struct sw_timer *swt = (struct sw_timer*) hndl; struct u64_time time64_ref = {0, 0}; /* init */ u32 intr_mask; i32 rv = -1; if((NULL == swt) || (false == has_valid_opts(swt->hwt_obj, options))) goto cc_timer_start_exit1; #define IS_LRT_TIMER(hwt) hwt_has_abs_time(hwt) /* LRT:: Low Resolution Timer */ time64_ref.secs = time_u64->secs; time64_ref.nsec = time_u64->nsec; if(IS_LRT_TIMER(swt->hwt_obj)) { /* reducing the precision to milliseconds to avoid floating point ops */ time64_ref.nsec = U16MS_U32NS(U32NS_U16MS(time_u64->nsec)); } intr_mask = dsbl_irqc(); rv = timer_start(swt, &time64_ref, options); enbl_irqc(intr_mask); cc_timer_start_exit1: return rv; }
static void rtc_alarm_rd(struct u64_time *alarm) { u16 msec_cycles = 0; MAP_PRCMRTCMatchGet(&alarm->secs, &msec_cycles); alarm->nsec = U16MS_U32NS(CYCLES_U16MS(msec_cycles)); }
static void rtc_value_rd(struct u64_time *value) { u16 msec_cycles = 0; MAP_PRCMRTCGet(&value->secs, &msec_cycles); value->nsec = U16MS_U32NS(CYCLES_U16MS(msec_cycles)); }
i32 cc_timer_start(cc_hndl hndl, struct u64_time *time_u64, u32 options) { u32 intr_mask; struct sw_timer *swt = (struct sw_timer*) hndl; struct u64_time time_64_loc = {0,0}; i32 rv = -1; if((NULL == swt) || (false == has_valid_opts(swt->hwt_obj, options))) goto cc_timer_start_exit1; intr_mask = dsbl_irqc(); /* reducing the precision to milliseconds to avoid floating point ops */ time_64_loc.secs = time_u64->secs; time_64_loc.nsec = U16MS_U32NS(U32NS_U16MS(time_u64->nsec)); rv = timer_start(swt, &time_64_loc, options); enbl_irqc(intr_mask); cc_timer_start_exit1: return rv; }