/* * Add timer to active timer list */ static void ci_otg_add_timer(struct ci_hdrc *ci, enum ci_otg_fsm_timer_index t) { struct ci_otg_fsm_timer *tmp_timer; struct ci_otg_fsm_timer *timer = ci->fsm_timer->timer_list[t]; struct list_head *active_timers = &ci->fsm_timer->active_timers; if (t >= NUM_CI_OTG_FSM_TIMERS) return; /* * Check if the timer is already in the active list, * if so update timer count */ list_for_each_entry(tmp_timer, active_timers, list) if (tmp_timer == timer) { timer->count = timer->expires; return; } timer->count = timer->expires; list_add_tail(&timer->list, active_timers); /* Enable 1ms irq */ if (!(hw_read_otgsc(ci, OTGSC_1MSIE))) hw_write_otgsc(ci, OTGSC_1MSIE, OTGSC_1MSIE); }
/** * ci_hdrc_otg_destroy - destroy otg struct * ci: the controller */ void ci_hdrc_otg_destroy(struct ci_hdrc *ci) { if (ci->wq) { flush_workqueue(ci->wq); destroy_workqueue(ci->wq); } /* Disable all OTG irq and clear status */ hw_write_otgsc(ci, OTGSC_INT_EN_BITS | OTGSC_INT_STATUS_BITS, OTGSC_INT_STATUS_BITS); if (ci_otg_is_fsm_mode(ci)) ci_hdrc_otg_fsm_remove(ci); }
/* * Remove timer from active timer list */ static void ci_otg_del_timer(struct ci_hdrc *ci, enum ci_otg_fsm_timer_index t) { struct ci_otg_fsm_timer *tmp_timer, *del_tmp; struct ci_otg_fsm_timer *timer = ci->fsm_timer->timer_list[t]; struct list_head *active_timers = &ci->fsm_timer->active_timers; if (t >= NUM_CI_OTG_FSM_TIMERS) return; list_for_each_entry_safe(tmp_timer, del_tmp, active_timers, list) if (tmp_timer == timer) list_del(&timer->list); /* Disable 1ms irq if there is no any active timer */ if (list_empty(active_timers)) hw_write_otgsc(ci, OTGSC_1MSIE, 0); }