diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index 895cacf003..fba78b166c 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -10,11 +10,6 @@ #include "msm_vidc_inst.h" #include "msm_vidc_internal.h" -enum msm_vidc_ctrl_list_type { - CHILD_LIST = BIT(0), - FW_LIST = BIT(1), -}; - int msm_vidc_ctrl_init(struct msm_vidc_inst *inst); int msm_vidc_ctrl_deinit(struct msm_vidc_inst *inst); int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl); diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index 9b9ae32780..5c044c0b18 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -387,5 +387,7 @@ int msm_vidc_check_session_supported(struct msm_vidc_inst *inst); int msm_vidc_check_mbps_supported(struct msm_vidc_inst *inst); int msm_vidc_check_scaling_supported(struct msm_vidc_inst *inst); const char *buf_name(enum msm_vidc_buffer_type type); +void msm_vidc_free_capabililty_list(struct msm_vidc_inst *inst, + enum msm_vidc_ctrl_list_type list_type); #endif // _MSM_VIDC_DRIVER_H_ diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 4fa2f96cbb..337895df30 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -292,6 +292,11 @@ enum msm_vidc_matrix_coefficients { MSM_VIDC_MATRIX_COEFF_BT2100 = 14, }; +enum msm_vidc_ctrl_list_type { + CHILD_LIST = BIT(0), + FW_LIST = BIT(1), +}; + enum msm_vidc_core_capability_type { CORE_CAP_NONE = 0, ENC_CODECS, diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index b36e6f516b..6f26819883 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -757,6 +757,9 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl) } exit: + if (rc) + msm_vidc_free_capabililty_list(inst, CHILD_LIST | FW_LIST); + return rc; } @@ -1817,6 +1820,9 @@ int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst) } exit: + if (rc) + msm_vidc_free_capabililty_list(inst, CHILD_LIST | FW_LIST); + return rc; } @@ -2742,6 +2748,8 @@ int msm_vidc_set_v4l2_properties(struct msm_vidc_inst *inst) } exit: + msm_vidc_free_capabililty_list(inst, FW_LIST); + return rc; } diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 55146f375a..f3a7cfb648 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -2561,6 +2561,31 @@ static void msm_vidc_free_input_cr_list(struct msm_vidc_inst *inst) INIT_LIST_HEAD(&inst->enc_input_crs); } +void msm_vidc_free_capabililty_list(struct msm_vidc_inst *inst, + enum msm_vidc_ctrl_list_type list_type) +{ + struct msm_vidc_inst_cap_entry *temp = NULL, *next = NULL; + + if (list_type & CHILD_LIST) { + list_for_each_entry_safe(temp, next, &inst->children.list, list) { + list_del(&temp->list); + kfree(temp); + } + INIT_LIST_HEAD(&inst->children.list); + } + + temp = NULL; + next = NULL; + + if (list_type & FW_LIST) { + list_for_each_entry_safe(temp, next, &inst->firmware.list, list) { + list_del(&temp->list); + kfree(temp); + } + INIT_LIST_HEAD(&inst->firmware.list); + } +} + static int msm_vidc_queue_buffer(struct msm_vidc_inst *inst, struct msm_vidc_buffer *buf) { struct msm_vidc_buffer *meta; @@ -4263,6 +4288,7 @@ static void msm_vidc_close_helper(struct kref *kref) else if (is_encode_session(inst)) msm_venc_inst_deinit(inst); msm_vidc_free_input_cr_list(inst); + msm_vidc_free_capabililty_list(inst, CHILD_LIST | FW_LIST); kfree(inst->capabilities); if (inst->response_workq) destroy_workqueue(inst->response_workq);