mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user