diff --git a/drivers/media/platform/rockchip/isp/isp_ispp.h b/drivers/media/platform/rockchip/isp/isp_ispp.h index ac87e1824658..10297362e420 100644 --- a/drivers/media/platform/rockchip/isp/isp_ispp.h +++ b/drivers/media/platform/rockchip/isp/isp_ispp.h @@ -9,8 +9,9 @@ #include #include -#define RKISPP_BUF_MAX 5 -#define RKISP_ISPP_BUF_MAX (RKISPP_BUF_MAX + (2 * (DEV_MAX - 1))) +#define RKISP_BUF_MAX 3 +#define RKISPP_BUF_MAX 2 +#define RKISP_ISPP_BUF_MAX (RKISP_BUF_MAX + RKISPP_BUF_MAX + (2 * (DEV_MAX - 1))) #define RKISP_ISPP_REGBUF_NUM RKISPP_BUF_POOL_MAX #define RKISP_ISP_SW_REG_SIZE 0x6000 diff --git a/drivers/media/platform/rockchip/ispp/stats.c b/drivers/media/platform/rockchip/ispp/stats.c index ec540b9ee74e..c66cf02c86a0 100644 --- a/drivers/media/platform/rockchip/ispp/stats.c +++ b/drivers/media/platform/rockchip/ispp/stats.c @@ -26,7 +26,7 @@ static void update_addr(struct rkispp_stats_vdev *stats_vdev) } if (!stats_vdev->next_buf) { - dummy_buf = &stats_vdev->dummy_buf; + dummy_buf = &stats_vdev->dev->hw_dev->dummy_buf; if (!dummy_buf->mem_priv) return; @@ -255,7 +255,6 @@ static void rkispp_stats_vb2_stop_streaming(struct vb2_queue *vq) stats_vdev->streamon = false; destroy_buf_queue(stats_vdev, VB2_BUF_STATE_ERROR); spin_unlock_irqrestore(&stats_vdev->irq_lock, flags); - rkispp_free_buffer(stats_vdev->dev, &stats_vdev->dummy_buf); } static int @@ -264,16 +263,10 @@ rkispp_stats_vb2_start_streaming(struct vb2_queue *queue, { struct rkispp_stats_vdev *stats_vdev = queue->drv_priv; unsigned long flags; - int ret; if (stats_vdev->streamon) return -EBUSY; - stats_vdev->dummy_buf.size = sizeof(struct rkispp_stats_buffer); - ret = rkispp_allow_buffer(stats_vdev->dev, &stats_vdev->dummy_buf); - if (ret < 0) - goto free_dummy_buf; - /* config first buf */ rkispp_stats_frame_end(stats_vdev); @@ -282,10 +275,6 @@ rkispp_stats_vb2_start_streaming(struct vb2_queue *queue, spin_unlock_irqrestore(&stats_vdev->irq_lock, flags); return 0; - -free_dummy_buf: - rkispp_free_buffer(stats_vdev->dev, &stats_vdev->dummy_buf); - return ret; } static struct vb2_ops rkispp_stats_vb2_ops = { diff --git a/drivers/media/platform/rockchip/ispp/stats.h b/drivers/media/platform/rockchip/ispp/stats.h index c2163a95883f..e4d43bf25bde 100644 --- a/drivers/media/platform/rockchip/ispp/stats.h +++ b/drivers/media/platform/rockchip/ispp/stats.h @@ -40,7 +40,6 @@ struct rkispp_stats_vdev { struct list_head stat; struct rkispp_buffer *curr_buf; struct rkispp_buffer *next_buf; - struct rkispp_dummy_buffer dummy_buf; struct v4l2_format vdev_fmt; bool streamon; }; diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c index 347bae7b1268..c274d22d6590 100644 --- a/drivers/media/platform/rockchip/ispp/stream.c +++ b/drivers/media/platform/rockchip/ispp/stream.c @@ -713,7 +713,8 @@ static int nr_init_buf(struct rkispp_device *dev, u32 size) } buf = &vdev->nr.buf.tmp_yuv; - buf->size = size >> 2; + cnt = DIV_ROUND_UP(dev->ispp_sdev.out_fmt.width, 32); + buf->size = PAGE_ALIGN(cnt * 42 * 32); ret = rkispp_allow_buffer(dev, buf); if (ret) goto err; @@ -1541,11 +1542,9 @@ static int start_isp(struct rkispp_device *dev) mutex_lock(&dev->hw_dev->dev_lock); mode.work_mode = dev->isp_mode; - mode.buf_num = RKISPP_BUF_MAX; - if (dev->isp_mode & ISP_ISPP_QUICK) - mode.buf_num = ((vdev->module_ens & ISPP_MODULE_TNR_3TO1) == - ISPP_MODULE_TNR_3TO1) ? 2 : 1; - mode.buf_num += 2 * (dev->hw_dev->dev_num - 1); + mode.buf_num = ((vdev->module_ens & ISPP_MODULE_TNR_3TO1) == + ISPP_MODULE_TNR_3TO1) ? 2 : 1; + mode.buf_num += RKISP_BUF_MAX + 2 * (dev->hw_dev->dev_num - 1); ret = v4l2_subdev_call(ispp_sdev->remote_sd, core, ioctl, RKISP_ISPP_CMD_SET_MODE, &mode); if (ret) @@ -2706,6 +2705,15 @@ void rkispp_module_work_event(struct rkispp_device *dev, { bool is_fec_en = (dev->stream_vdev.module_ens & ISPP_MODULE_FEC); + if (dev->ispp_sdev.state != ISPP_STOP) { + if (module & ISPP_MODULE_TNR) + tnr_work_event(dev, buf_rd, buf_wr, is_isr); + else if (module & ISPP_MODULE_NR) + nr_work_event(dev, buf_rd, buf_wr, is_isr); + else + fec_work_event(dev, buf_rd, is_isr); + } + if (is_isr && !buf_rd && !buf_wr && ((is_fec_en && module == ISPP_MODULE_FEC) || (!is_fec_en && module == ISPP_MODULE_NR))) { @@ -2723,15 +2731,7 @@ void rkispp_module_work_event(struct rkispp_device *dev, } if (!dev->hw_dev->is_idle) dev->hw_dev->is_idle = true; - return; } - - if (module & ISPP_MODULE_TNR) - tnr_work_event(dev, buf_rd, buf_wr, is_isr); - else if (module & ISPP_MODULE_NR) - nr_work_event(dev, buf_rd, buf_wr, is_isr); - else - fec_work_event(dev, buf_rd, is_isr); } void rkispp_isr(u32 mis_val, struct rkispp_device *dev)