FILE
venc_drv_if.c
File preview with syntax highlighting.
linux-6.19.14/drivers/media/platform/mediatek/vcodec/encoder/venc_drv_if.c
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (c) 2016 MediaTek Inc. 4 * Author: Daniel Hsiao <daniel.hsiao@mediatek.com> 5 * Jungchang Tsao <jungchang.tsao@mediatek.com> 6 * Tiffany Lin <tiffany.lin@mediatek.com> 7 */ 8 9#include <linux/interrupt.h> 10#include <linux/kernel.h> 11#include <linux/slab.h> 12 13#include "venc_drv_base.h" 14#include "venc_drv_if.h" 15 16#include "mtk_vcodec_enc.h" 17#include "mtk_vcodec_enc_pm.h" 18 19int venc_if_init(struct mtk_vcodec_enc_ctx *ctx, unsigned int fourcc) 20{ 21 int ret = 0; 22 23 switch (fourcc) { 24 case V4L2_PIX_FMT_VP8: 25 ctx->enc_if = &venc_vp8_if; 26 break; 27 case V4L2_PIX_FMT_H264: 28 ctx->enc_if = &venc_h264_if; 29 break; 30 default: 31 return -EINVAL; 32 } 33 34 mtk_venc_lock(ctx); 35 ret = ctx->enc_if->init(ctx); 36 mtk_venc_unlock(ctx); 37 38 return ret; 39} 40 41int venc_if_set_param(struct mtk_vcodec_enc_ctx *ctx, 42 enum venc_set_param_type type, struct venc_enc_param *in) 43{ 44 int ret = 0; 45 46 mtk_venc_lock(ctx); 47 ret = ctx->enc_if->set_param(ctx->drv_handle, type, in); 48 mtk_venc_unlock(ctx); 49 50 return ret; 51} 52 53int venc_if_encode(struct mtk_vcodec_enc_ctx *ctx, 54 enum venc_start_opt opt, struct venc_frm_buf *frm_buf, 55 struct mtk_vcodec_mem *bs_buf, 56 struct venc_done_result *result) 57{ 58 int ret = 0; 59 unsigned long flags; 60 61 mtk_venc_lock(ctx); 62 63 spin_lock_irqsave(&ctx->dev->irqlock, flags); 64 ctx->dev->curr_ctx = ctx; 65 spin_unlock_irqrestore(&ctx->dev->irqlock, flags); 66 67 ret = mtk_vcodec_enc_pw_on(&ctx->dev->pm); 68 if (ret) 69 goto venc_if_encode_pw_on_err; 70 mtk_vcodec_enc_clock_on(&ctx->dev->pm); 71 ret = ctx->enc_if->encode(ctx->drv_handle, opt, frm_buf, 72 bs_buf, result); 73 mtk_vcodec_enc_clock_off(&ctx->dev->pm); 74 mtk_vcodec_enc_pw_off(&ctx->dev->pm); 75 76 spin_lock_irqsave(&ctx->dev->irqlock, flags); 77 ctx->dev->curr_ctx = NULL; 78 spin_unlock_irqrestore(&ctx->dev->irqlock, flags); 79 80venc_if_encode_pw_on_err: 81 mtk_venc_unlock(ctx); 82 return ret; 83} 84 85int venc_if_deinit(struct mtk_vcodec_enc_ctx *ctx) 86{ 87 int ret = 0; 88 89 if (!ctx->drv_handle) 90 return 0; 91 92 mtk_venc_lock(ctx); 93 ret = ctx->enc_if->deinit(ctx->drv_handle); 94 mtk_venc_unlock(ctx); 95 96 ctx->drv_handle = NULL; 97 98 return ret; 99}
~/
Read-only file preview.