media: rockchip: isp: fix mmu err for mpfbc free buf early

Change-Id: If98814762eab4e701d147b36973126e35e767709
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2020-04-06 21:49:36 +08:00
committed by Tao Huang
parent e1f238a4a4
commit ce5e72582f
2 changed files with 28 additions and 11 deletions

View File

@@ -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;

View File

@@ -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;
}