mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 11:50:43 +09:00
media: rockchip: ispp: reduce buf count
Change-Id: Ie719d3cee9c638335af0edf45aa4b59e6c601f7b Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
@@ -9,8 +9,9 @@
|
||||
#include <linux/rkisp1-config.h>
|
||||
#include <linux/rkispp-config.h>
|
||||
|
||||
#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
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user