media: mtk-jpeg: Fixes jpeg enc&dec worker sw flow
authorkyrie wu <kyrie.wu@mediatek.com>
Fri, 10 Mar 2023 06:23:51 +0000 (06:23 +0000)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Mon, 10 Apr 2023 12:10:02 +0000 (13:10 +0100)
1. Move removing buffer after sw setting and before hw setting
in enc&dec worker to prevents the operation of removing
the buffer twice if the sw setting fails.
2. Remove the redundant operation of queue work in the
jpegenc irq handler because the jpegenc worker has called
v4l2_m2m_job_finish to do it.

Fixes: 5fb1c2361e56 ("mtk-jpegenc: add jpeg encode worker interface")
Fixes: dedc21500334 ("media: mtk-jpegdec: add jpeg decode worker interface")
Signed-off-by: kyrie wu <kyrie.wu@mediatek.com>
Signed-off-by: irui wang <irui.wang@mediatek.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c

index c7c98e1d36c63b1194046398d5eb8c8319eca1ae..6431aa4667c129466629e21f4ada043e70f6ee63 100644 (file)
@@ -1025,9 +1025,6 @@ retry_select:
        if (!dst_buf)
                goto getbuf_fail;
 
-       v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
-       v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
-
        v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, true);
 
        mtk_jpegenc_set_hw_param(ctx, hw_id, src_buf, dst_buf);
@@ -1045,6 +1042,9 @@ retry_select:
                goto enc_end;
        }
 
+       v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
+       v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
+
        schedule_delayed_work(&comp_jpeg[hw_id]->job_timeout_work,
                              msecs_to_jiffies(MTK_JPEG_HW_TIMEOUT_MSEC));
 
@@ -1220,9 +1220,6 @@ retry_select:
        if (!dst_buf)
                goto getbuf_fail;
 
-       v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
-       v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
-
        v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, true);
        jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(&src_buf->vb2_buf);
        jpeg_dst_buf = mtk_jpeg_vb2_to_srcbuf(&dst_buf->vb2_buf);
@@ -1231,7 +1228,7 @@ retry_select:
                                             &jpeg_src_buf->dec_param)) {
                mtk_jpeg_queue_src_chg_event(ctx);
                ctx->state = MTK_JPEG_SOURCE_CHANGE;
-               goto dec_end;
+               goto getbuf_fail;
        }
 
        jpeg_src_buf->curr_ctx = ctx;
@@ -1254,6 +1251,9 @@ retry_select:
                goto clk_end;
        }
 
+       v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
+       v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
+
        schedule_delayed_work(&comp_jpeg[hw_id]->job_timeout_work,
                              msecs_to_jiffies(MTK_JPEG_HW_TIMEOUT_MSEC));
 
index 1bbb712d78d0e64057e7ac13502958a11b508c24..867f4c1a09fa6510e1a2d0d02478dc03fe99327c 100644 (file)
@@ -286,10 +286,6 @@ static irqreturn_t mtk_jpegenc_hw_irq_handler(int irq, void *priv)
        mtk_jpegenc_put_buf(jpeg);
        pm_runtime_put(ctx->jpeg->dev);
        clk_disable_unprepare(jpeg->venc_clk.clks->clk);
-       if (!list_empty(&ctx->fh.m2m_ctx->out_q_ctx.rdy_queue) ||
-           !list_empty(&ctx->fh.m2m_ctx->cap_q_ctx.rdy_queue)) {
-               queue_work(master_jpeg->workqueue, &ctx->jpeg_work);
-       }
 
        jpeg->hw_state = MTK_JPEG_HW_IDLE;
        wake_up(&master_jpeg->enc_hw_wq);