diff --git a/drivers/media/platform/rockchip/isp/common.h b/drivers/media/platform/rockchip/isp/common.h index 2f9fff318e95..dd5541981ff8 100644 --- a/drivers/media/platform/rockchip/isp/common.h +++ b/drivers/media/platform/rockchip/isp/common.h @@ -138,10 +138,25 @@ static inline int rkisp_alloc_buffer(struct device *dev, { int ret = 0; + if (!buf->size) { + ret = -EINVAL; + goto err; + } + buf->vaddr = dma_alloc_coherent(dev, buf->size, &buf->dma_addr, GFP_KERNEL); - if (!buf->vaddr) + if (!buf->vaddr) { ret = -ENOMEM; + goto err; + } + + if (rkisp_debug) + dev_info(dev, "%s buf:0x%x~0x%x size:%d\n", __func__, + (u32)buf->dma_addr, (u32)buf->dma_addr + buf->size, buf->size); + + return ret; +err: + dev_err(dev, "%s failed ret:%d\n", __func__, ret); return ret; } @@ -149,6 +164,9 @@ static inline void rkisp_free_buffer(struct device *dev, struct rkisp_dummy_buffer *buf) { if (buf && buf->vaddr && buf->size) { + if (rkisp_debug) + dev_info(dev, "%s buf:0x%x~0x%x\n", __func__, + (u32)buf->dma_addr, (u32)buf->dma_addr + buf->size); dma_free_coherent(dev, buf->size, buf->vaddr, buf->dma_addr); buf->size = 0; diff --git a/drivers/media/platform/rockchip/isp/mpfbc.c b/drivers/media/platform/rockchip/isp/mpfbc.c index 86b78857b55b..6fb843cc7de9 100644 --- a/drivers/media/platform/rockchip/isp/mpfbc.c +++ b/drivers/media/platform/rockchip/isp/mpfbc.c @@ -79,7 +79,7 @@ static int mpfbc_s_rx_buffer(struct v4l2_subdev *sd, buf->dbuf = dbuf; buf->mem_priv = ops->attach_dmabuf(dev->dev, dbuf, - *size, DMA_FROM_DEVICE); + *size, DMA_BIDIRECTIONAL); if (IS_ERR(buf->mem_priv)) { ret = PTR_ERR(buf->mem_priv); goto err; @@ -166,19 +166,16 @@ static int mpfbc_stop(struct rkisp_mpfbc_device *mpfbc_dev) writel(SW_MPFBC_YUV_MODE(1), base + ISP_MPFBC_BASE); hdr_stop_dmatx(dev); - if (!dev->dmarx_dev.trigger) { - ret = wait_event_timeout(mpfbc_dev->done, - !mpfbc_dev->en, - msecs_to_jiffies(1000)); - if (!ret) - v4l2_warn(&mpfbc_dev->sd, - "waiting on event return error %d\n", ret); - } + ret = wait_event_timeout(mpfbc_dev->done, + !mpfbc_dev->en, + msecs_to_jiffies(1000)); + if (!ret) + v4l2_warn(&mpfbc_dev->sd, + "waiting on event return error %d\n", ret); mpfbc_dev->stopping = false; isp_clear_bits(base + MI_IMSC, MI_MPFBC_FRAME); mpfbc_dev->en = false; mpfbc_free_dma_buf(mpfbc_dev); - hdr_destroy_buf(dev); return 0; } @@ -229,6 +226,7 @@ pipe_stream_off: dev->pipe.set_stream(&dev->pipe, false); stop_mpfbc: mpfbc_stop(mpfbc_dev); + hdr_destroy_buf(dev); close_pipe: dev->pipe.close(&dev->pipe); return ret; @@ -243,6 +241,7 @@ static int mpfbc_stop_stream(struct v4l2_subdev *sd) media_pipeline_stop(&sd->entity); dev->pipe.set_stream(&dev->pipe, false); dev->pipe.close(&dev->pipe); + hdr_destroy_buf(dev); return 0; }