From 94f439584b40f29fc024770e571d71bc8c163090 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Fri, 22 Apr 2022 11:41:59 +0800 Subject: [PATCH] media: rockchip: isp: lock for buf alloc and free Change-Id: I94f01e3d8a24ec11a6b853416421e7f5d6323a8a Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/common.c | 6 ++++++ drivers/media/platform/rockchip/isp/dev.h | 1 + drivers/media/platform/rockchip/isp/rkisp.c | 1 + 3 files changed, 8 insertions(+) diff --git a/drivers/media/platform/rockchip/isp/common.c b/drivers/media/platform/rockchip/isp/common.c index c84deb0cf614..66a7b080610f 100644 --- a/drivers/media/platform/rockchip/isp/common.c +++ b/drivers/media/platform/rockchip/isp/common.c @@ -166,6 +166,8 @@ int rkisp_alloc_buffer(struct rkisp_device *dev, void *mem_priv; int ret = 0; + mutex_lock(&dev->buf_lock); + if (!buf->size) { ret = -EINVAL; goto err; @@ -206,8 +208,10 @@ int rkisp_alloc_buffer(struct rkisp_device *dev, v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s buf:0x%x~0x%x size:%d\n", __func__, (u32)buf->dma_addr, (u32)buf->dma_addr + buf->size, buf->size); + mutex_unlock(&dev->buf_lock); return ret; err: + mutex_unlock(&dev->buf_lock); dev_err(dev->dev, "%s failed ret:%d\n", __func__, ret); return ret; } @@ -217,6 +221,7 @@ void rkisp_free_buffer(struct rkisp_device *dev, { const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops; + mutex_lock(&dev->buf_lock); if (buf && buf->mem_priv) { v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s buf:0x%x~0x%x\n", __func__, @@ -232,6 +237,7 @@ void rkisp_free_buffer(struct rkisp_device *dev, buf->is_need_vaddr = false; buf->is_need_dmafd = false; } + mutex_unlock(&dev->buf_lock); } void rkisp_prepare_buffer(struct rkisp_device *dev, diff --git a/drivers/media/platform/rockchip/isp/dev.h b/drivers/media/platform/rockchip/isp/dev.h index eb14b1ee4898..59465fcd7fa1 100644 --- a/drivers/media/platform/rockchip/isp/dev.h +++ b/drivers/media/platform/rockchip/isp/dev.h @@ -231,6 +231,7 @@ struct rkisp_device { struct rkisp_rx_buf_pool pv_pool[RKISP_RX_BUF_POOL_MAX]; + struct mutex buf_lock; spinlock_t cmsk_lock; struct rkisp_cmsk_cfg cmsk_cfg; bool is_cmsk_upd; diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 69fe6f7cd8ba..aa9bfbf907be 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -3324,6 +3324,7 @@ int rkisp_register_isp_subdev(struct rkisp_device *isp_dev, struct v4l2_subdev *sd = &isp_sdev->sd; int ret; + mutex_init(&isp_dev->buf_lock); spin_lock_init(&isp_dev->cmsk_lock); spin_lock_init(&isp_dev->rdbk_lock); ret = kfifo_alloc(&isp_dev->rdbk_kfifo,