int msm_gemini_core_reset(uint8_t op_mode, void *base, int size) { memset(&fe_pingpong_buf, 0, sizeof(fe_pingpong_buf)); fe_pingpong_buf.is_fe = 1; we_pingpong_index = 0; memset(&we_pingpong_buf, 0, sizeof(we_pingpong_buf)); msm_gemini_hw_reset(base, size); if (op_mode == MSM_GEMINI_MODE_REALTIME_ENCODE) { /* Nothing needed for fe buffer cfg, config we only */ msm_gemini_hw_we_buffer_cfg(1); } else { /* Nothing needed for fe buffer cfg, config we only */ msm_gemini_hw_we_buffer_cfg(0); } /* @todo wait for reset done irq */ return 0; }
int msm_gemini_core_reset(uint8_t op_mode, void *base, int size) { unsigned long flags; int rc = 0; int tm = 500; /*500ms*/ memset(&fe_pingpong_buf, 0, sizeof(fe_pingpong_buf)); fe_pingpong_buf.is_fe = 1; we_pingpong_index = 0; memset(&we_pingpong_buf, 0, sizeof(we_pingpong_buf)); spin_lock_irqsave(&reset_lock, flags); reset_done_ack = 0; msm_gemini_hw_reset(base, size); spin_unlock_irqrestore(&reset_lock, flags); rc = wait_event_interruptible_timeout( reset_wait, reset_done_ack, msecs_to_jiffies(tm)); if (!reset_done_ack) { GMN_DBG("%s: reset ACK failed %d", __func__, rc); return -EBUSY; } GMN_DBG("%s: reset_done_ack rc %d", __func__, rc); spin_lock_irqsave(&reset_lock, flags); reset_done_ack = 0; spin_unlock_irqrestore(&reset_lock, flags); if (op_mode == MSM_GEMINI_MODE_REALTIME_ENCODE) { /* Nothing needed for fe buffer cfg, config we only */ msm_gemini_hw_we_buffer_cfg(1); } else { /* Nothing needed for fe buffer cfg, config we only */ msm_gemini_hw_we_buffer_cfg(0); } /* @todo wait for reset done irq */ return 0; }