1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2016 MediaTek Inc.
4 * Author: PC Chen <pc.chen@mediatek.com>
5 * Tiffany Lin <tiffany.lin@mediatek.com>
8 #include <linux/interrupt.h>
9 #include <linux/kernel.h>
10 #include <linux/slab.h>
12 #include "vdec_drv_if.h"
13 #include "mtk_vcodec_dec.h"
14 #include "vdec_drv_base.h"
15 #include "mtk_vcodec_dec_pm.h"
18 const struct vdec_common_if *get_h264_dec_comm_if(void);
19 const struct vdec_common_if *get_vp8_dec_comm_if(void);
20 const struct vdec_common_if *get_vp9_dec_comm_if(void);
22 int vdec_if_init(struct mtk_vcodec_ctx *ctx, unsigned int fourcc)
27 case V4L2_PIX_FMT_H264:
28 ctx->dec_if = get_h264_dec_comm_if();
30 case V4L2_PIX_FMT_VP8:
31 ctx->dec_if = get_vp8_dec_comm_if();
33 case V4L2_PIX_FMT_VP9:
34 ctx->dec_if = get_vp9_dec_comm_if();
41 mtk_vcodec_dec_clock_on(&ctx->dev->pm);
42 ret = ctx->dec_if->init(ctx);
43 mtk_vcodec_dec_clock_off(&ctx->dev->pm);
49 int vdec_if_decode(struct mtk_vcodec_ctx *ctx, struct mtk_vcodec_mem *bs,
50 struct vdec_fb *fb, bool *res_chg)
55 if ((bs->dma_addr & 63) != 0) {
56 mtk_v4l2_err("bs dma_addr should 64 byte align");
62 if (((fb->base_y.dma_addr & 511) != 0) ||
63 ((fb->base_c.dma_addr & 511) != 0)) {
64 mtk_v4l2_err("frame buffer dma_addr should 512 byte align");
74 mtk_vcodec_set_curr_ctx(ctx->dev, ctx);
75 mtk_vcodec_dec_clock_on(&ctx->dev->pm);
76 enable_irq(ctx->dev->dec_irq);
77 ret = ctx->dec_if->decode(ctx->drv_handle, bs, fb, res_chg);
78 disable_irq(ctx->dev->dec_irq);
79 mtk_vcodec_dec_clock_off(&ctx->dev->pm);
80 mtk_vcodec_set_curr_ctx(ctx->dev, NULL);
87 int vdec_if_get_param(struct mtk_vcodec_ctx *ctx, enum vdec_get_param_type type,
96 ret = ctx->dec_if->get_param(ctx->drv_handle, type, out);
102 void vdec_if_deinit(struct mtk_vcodec_ctx *ctx)
104 if (!ctx->drv_handle)
108 mtk_vcodec_dec_clock_on(&ctx->dev->pm);
109 ctx->dec_if->deinit(ctx->drv_handle);
110 mtk_vcodec_dec_clock_off(&ctx->dev->pm);
111 mtk_vdec_unlock(ctx);
113 ctx->drv_handle = NULL;