On (24/10/24 19:08), Sergey Senozhatsky wrote: > So, we need to > - export a couple of symbols > - include vdec header in core [..] > +++ b/drivers/media/platform/qcom/venus/core.c > @@ -500,6 +500,31 @@ static __maybe_unused int venus_runtime_suspend(struct device *dev) > return ret; > } > > +void venus_close_common(struct venus_inst *inst) > +{ > + /* > + * First, remove the inst from the ->instances list, so that > + * to_instance() will return NULL. > + */ > + hfi_session_destroy(inst); > + /* > + * Second, make sure we don't have IRQ/IRQ-thread currently running > + * or pending execution, which would race with the inst destruction. > + */ > + synchronize_irq(inst->core->irq); > + > + v4l2_m2m_ctx_release(inst->m2m_ctx); > + v4l2_m2m_release(inst->m2m_dev); > + ida_destroy(&inst->dpb_ids); > + v4l2_fh_del(&inst->fh); > + v4l2_fh_exit(&inst->fh); > + vdec_ctrl_deinit(inst); > + > + mutex_destroy(&inst->lock); > + mutex_destroy(&inst->ctx_q_lock); > +} > +EXPORT_SYMBOL_GPL(venus_close_common); [..] > +++ b/drivers/media/platform/qcom/venus/core.h > @@ -17,6 +17,7 @@ > #include "hfi.h" > #include "hfi_platform.h" > #include "hfi_helper.h" > +#include "vdec.h" > > #define VDBGL "VenusLow : " > #define VDBGM "VenusMed : " > @@ -569,4 +570,6 @@ is_fw_rev_or_older(struct venus_core *core, u32 vmajor, u32 vminor, u32 vrev) > (core)->venus_ver.minor == vminor && > (core)->venus_ver.rev <= vrev); > } > + > +void venus_close_common(struct venus_inst *inst); > #endif [..] > +++ b/drivers/media/platform/qcom/venus/vdec_ctrls.c > @@ -192,3 +192,4 @@ void vdec_ctrl_deinit(struct venus_inst *inst) > { > v4l2_ctrl_handler_free(&inst->ctrl_handler); > } > +EXPORT_SYMBOL_GPL(vdec_ctrl_deinit); Would have been entirely too simple had I compile-tested my patches, wouldn't it? depmod: ERROR: Cycle detected: venus_core -> venus_dec -> venus_core vdec_ctrl_deinit() is a v4l2_ctrl_handler_free() wrapper, a one-liner, so I turned into a static inline. Compiles with the addition of: --- diff --git a/drivers/media/platform/qcom/venus/vdec.h b/drivers/media/platform/qcom/venus/vdec.h index 6b262d0bf561..2687255b1616 100644 --- a/drivers/media/platform/qcom/venus/vdec.h +++ b/drivers/media/platform/qcom/venus/vdec.h @@ -6,9 +6,14 @@ #ifndef __VENUS_VDEC_H__ #define __VENUS_VDEC_H__ +#include <media/v4l2-ctrls.h> + struct venus_inst; int vdec_ctrl_init(struct venus_inst *inst); -void vdec_ctrl_deinit(struct venus_inst *inst); +static inline void vdec_ctrl_deinit(struct venus_inst *inst) +{ + v4l2_ctrl_handler_free(&inst->ctrl_handler); +} #endif diff --git a/drivers/media/platform/qcom/venus/vdec_ctrls.c b/drivers/media/platform/qcom/venus/vdec_ctrls.c index 2b6b2eee619c..fa034a7fdbed 100644 --- a/drivers/media/platform/qcom/venus/vdec_ctrls.c +++ b/drivers/media/platform/qcom/venus/vdec_ctrls.c @@ -4,7 +4,6 @@ * Copyright (C) 2017 Linaro Ltd. */ #include <linux/types.h> -#include <media/v4l2-ctrls.h> #include "core.h" #include "helpers.h" @@ -187,9 +186,3 @@ int vdec_ctrl_init(struct venus_inst *inst) return 0; } - -void vdec_ctrl_deinit(struct venus_inst *inst) -{ - v4l2_ctrl_handler_free(&inst->ctrl_handler); -}