void mfc_destroy_inst(struct mfc_inst_ctx* ctx) { struct mfc_dec_ctx *dec_ctx; struct mfc_enc_ctx *enc_ctx; struct mfc_pre_cfg *precfg; if (ctx) { if (ctx->state < INST_STATE_SETUP) { while (!list_empty(&ctx->presetcfgs)) { precfg = list_entry((&ctx->presetcfgs)->next, struct mfc_pre_cfg, list); mfc_dbg("remove unused preset config [0x%08x]\n", precfg->type); list_del(&precfg->list); kfree(precfg); } } else { /* free (decoder/encoder & context) private memory */ if (ctx->type == DECODER) { dec_ctx = ctx->c_priv; if (dec_ctx->d_priv) kfree(dec_ctx->d_priv); kfree(dec_ctx); } else if (ctx->type == ENCODER) { enc_ctx = ctx->c_priv; if (enc_ctx->e_priv) kfree(enc_ctx->e_priv); kfree(enc_ctx); } } if (ctx->state >= INST_STATE_OPEN) { mfc_clock_on(ctx->dev); mfc_cmd_inst_close(ctx); mfc_clock_off(ctx->dev); } mfc_free_buf_inst(ctx->id); /* free instance context memory */ kfree(ctx); }
void mfc_destroy_inst(struct mfc_inst_ctx* ctx) { int ret = 0; if (ctx) { if (ctx->state >= INST_STATE_OPENED) { mfc_clock_on(); /* FIXME: meaningless return value */ ret = mfc_cmd_inst_close(ctx); mfc_clock_off(); } mfc_free_buf_inst(ctx->id); /* FIXME: free ctx->c_priv */ kfree(ctx); } }