diff --git a/drivers/media/platform/imx8/mxc-jpeg.c b/drivers/media/platform/imx8/mxc-jpeg.c index 9779ce0a134e6ed0236f5ac80f1035f4e64ba51b..3bbf482db438e35cf7ad41a149442b3450070263 100644 --- a/drivers/media/platform/imx8/mxc-jpeg.c +++ b/drivers/media/platform/imx8/mxc-jpeg.c @@ -275,8 +275,6 @@ static irqreturn_t mxc_jpeg_dec_irq(int irq, void *priv) q_data = &ctx->out_q; desc = jpeg_src_buf->desc; dma_handle = jpeg_src_buf->handle; - dma_free_coherent(jpeg->dev, sizeof(unsigned char) * 615, - jpeg_src_buf->tbl, jpeg_src_buf->tbl_handle); testaddri = vb2_plane_vaddr(src_buf, 0); testaddro = vb2_plane_vaddr(dst_buf, 0); @@ -294,8 +292,6 @@ static irqreturn_t mxc_jpeg_dec_irq(int irq, void *priv) return IRQ_HANDLED; } buf_state = VB2_BUF_STATE_DONE; - dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), - jpeg_src_buf->desc, jpeg_src_buf->handle); v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); v4l2_m2m_buf_done(to_vb2_v4l2_buffer(src_buf), buf_state); @@ -549,6 +545,23 @@ static int mxc_jpeg_buf_prepare(struct vb2_buffer *vb) return 0; } +static void mxc_jpeg_buf_clean(struct vb2_buffer *vb) +{ + struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); + struct mxc_jpeg_src_buf *jpeg_src_buf; + + jpeg_src_buf = container_of(vbuf, struct mxc_jpeg_src_buf, b); + + if (ctx->mode == MXC_JPEG_ENCODE && + ctx->enc_state == MXC_JPEG_ENC_CONF) + dma_free_coherent(ctx->mxc_jpeg->dev, sizeof(hactbl), + jpeg_src_buf->tbl, jpeg_src_buf->tbl_handle); + + dma_free_coherent(ctx->mxc_jpeg->dev, sizeof(struct mxc_jpeg_desc), + jpeg_src_buf->desc, jpeg_src_buf->handle); +} + static const struct vb2_ops mxc_jpeg_qops = { .queue_setup = mxc_jpeg_queue_setup, @@ -558,6 +571,7 @@ static const struct vb2_ops mxc_jpeg_qops = { .wait_finish = vb2_ops_wait_finish, .start_streaming = mxc_jpeg_start_streaming, .stop_streaming = mxc_jpeg_stop_streaming, + .buf_cleanup = mxc_jpeg_buf_clean, }; static int mxc_jpeg_queue_init(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq)