spin_unlock(&core_ctx->ready_lock);
 
        timeout_jiff = msecs_to_jiffies(1000 * (NUM_BUFFER_COUNT + 2));
-       ret = wait_event_timeout(msg_queue->lat_ctx.ready_to_use,
+       ret = wait_event_timeout(msg_queue->ctx->msg_queue.core_dec_done,
                                 msg_queue->lat_ctx.ready_num == NUM_BUFFER_COUNT,
                                 timeout_jiff);
        if (ret) {
        mtk_vcodec_dec_disable_hardware(ctx, MTK_VDEC_CORE);
        vdec_msg_queue_qbuf(&ctx->msg_queue.lat_ctx, lat_buf);
 
+       wake_up_all(&ctx->msg_queue.core_dec_done);
        if (atomic_read(&lat_buf->ctx->msg_queue.core_list_cnt)) {
                mtk_v4l2_debug(3, "re-schedule to decode for core: %d",
                               dev->msg_queue_core_ctx.ready_num);
 
        atomic_set(&msg_queue->lat_list_cnt, 0);
        atomic_set(&msg_queue->core_list_cnt, 0);
+       init_waitqueue_head(&msg_queue->core_dec_done);
 
        msg_queue->wdma_addr.size =
                vde_msg_queue_get_trans_size(ctx->picinfo.buf_w,
 
  *
  * @lat_list_cnt: used to record each instance lat list count
  * @core_list_cnt: used to record each instance core list count
+ * @core_dec_done: core work queue decode done event
  */
 struct vdec_msg_queue {
        struct vdec_lat_buf lat_buf[NUM_BUFFER_COUNT];
 
        atomic_t lat_list_cnt;
        atomic_t core_list_cnt;
+       wait_queue_head_t core_dec_done;
 };
 
 /**