diff --git a/driver/vidc/inc/venus_hfi_response.h b/driver/vidc/inc/venus_hfi_response.h index 23189c4beb..83e05dd9a9 100644 --- a/driver/vidc/inc/venus_hfi_response.h +++ b/driver/vidc/inc/venus_hfi_response.h @@ -20,6 +20,7 @@ void handle_session_response_work_handler(struct work_struct *work); int handle_session_response_work(struct msm_vidc_inst *inst, struct response_work *work); int cancel_response_work(struct msm_vidc_inst *inst); +int cancel_response_work_sync(struct msm_vidc_inst *inst); int handle_system_error(struct msm_vidc_core *core, struct hfi_packet *pkt); void fw_coredump(struct msm_vidc_core *core); diff --git a/driver/vidc/src/msm_vidc.c b/driver/vidc/src/msm_vidc.c index 7591da0f23..10fd4b7ce5 100644 --- a/driver/vidc/src/msm_vidc.c +++ b/driver/vidc/src/msm_vidc.c @@ -953,13 +953,13 @@ int msm_vidc_close(void *instance) i_vpr_h(inst, "%s()\n", __func__); inst_lock(inst, __func__); - cancel_response_work(inst); /* print final stats */ msm_vidc_print_stats(inst); msm_vidc_session_close(inst); msm_vidc_remove_session(inst); msm_vidc_destroy_buffers(inst); inst_unlock(inst, __func__); + cancel_response_work_sync(inst); cancel_stats_work_sync(inst); msm_vidc_show_stats(inst); put_inst(inst); diff --git a/driver/vidc/src/venus_hfi_response.c b/driver/vidc/src/venus_hfi_response.c index 79bc8d4f79..8dabb9f5bc 100644 --- a/driver/vidc/src/venus_hfi_response.c +++ b/driver/vidc/src/venus_hfi_response.c @@ -1748,6 +1748,17 @@ int cancel_response_work(struct msm_vidc_inst *inst) return 0; } +int cancel_response_work_sync(struct msm_vidc_inst *inst) +{ + if (!inst) { + d_vpr_e("%s: Invalid arguments\n", __func__); + return -EINVAL; + } + cancel_delayed_work_sync(&inst->response_work); + + return 0; +} + static int handle_session_response(struct msm_vidc_core *core, struct hfi_header *hdr) {