diff --git a/drivers/media/platform/rockchip/aiisp/aiisp.c b/drivers/media/platform/rockchip/aiisp/aiisp.c index c8ada9ea0c6e..59152964b7e6 100644 --- a/drivers/media/platform/rockchip/aiisp/aiisp.c +++ b/drivers/media/platform/rockchip/aiisp/aiisp.c @@ -1623,7 +1623,7 @@ static void rkaiisp_run_start(struct rkaiisp_device *aidev) rkaiisp_update_list_reg(aidev); } -static void rkaiisp_get_new_iqparam(struct rkaiisp_device *aidev) +static int rkaiisp_get_new_iqparam(struct rkaiisp_device *aidev) { struct rkaiisp_params *iq_params, *old_params; struct rkaiisp_buffer *cur_buf = NULL; @@ -1637,7 +1637,7 @@ static void rkaiisp_get_new_iqparam(struct rkaiisp_device *aidev) struct rkaiisp_buffer, queue); if (!cur_buf) { spin_unlock_irqrestore(&aidev->config_lock, flags); - return; + return -1; } list_del(&cur_buf->queue); @@ -1672,8 +1672,22 @@ static void rkaiisp_get_new_iqparam(struct rkaiisp_device *aidev) aidev->model_runcnt = iq_params->model_runcnt; rkaiisp_cfg_other_iqparam(aidev, &iq_params->other_cfg); } + + return 0; } +static int rkaiisp_clear_iqparams(struct rkaiisp_device *aidev) +{ + int i; + + for (i = 0; i < aidev->iq_parambuf_num; i++) { + if (rkaiisp_get_new_iqparam(aidev) != 0) + break; + } + v4l2_dbg(1, rkaiisp_debug, &aidev->v4l2_dev, + "clear unused iq params\n"); + return 0; +} void rkaiisp_trigger(struct rkaiisp_device *aidev) { @@ -1947,6 +1961,9 @@ static long rkaiisp_ioctl_default(struct file *file, void *fh, ret = 0; } break; + case RKAIISP_CMD_CLEAR_IQPARAMS: + ret = rkaiisp_clear_iqparams(aidev); + break; default: ret = -EINVAL; } @@ -1988,6 +2005,7 @@ static int rkaiisp_vb2_queue_setup(struct vb2_queue *vq, sizes[0] = sizeof(struct rkaiisp_params) + aidev->para_size * aidev->max_runcnt; aidev->vdev_fmt.fmt.meta.buffersize = sizes[0]; + aidev->iq_parambuf_num = *num_buffers; INIT_LIST_HEAD(&aidev->params); diff --git a/drivers/media/platform/rockchip/aiisp/aiisp.h b/drivers/media/platform/rockchip/aiisp/aiisp.h index 6b5c390fcbf2..deff2f8f9735 100644 --- a/drivers/media/platform/rockchip/aiisp/aiisp.h +++ b/drivers/media/platform/rockchip/aiisp/aiisp.h @@ -170,6 +170,8 @@ struct rkaiisp_device { bool showreg; bool init_buf; bool is_state_err; + + u8 iq_parambuf_num; }; extern int rkaiisp_debug; diff --git a/include/uapi/linux/rk-aiisp-config.h b/include/uapi/linux/rk-aiisp-config.h index 1aab05f8206b..980884f66bea 100644 --- a/include/uapi/linux/rk-aiisp-config.h +++ b/include/uapi/linux/rk-aiisp-config.h @@ -38,6 +38,9 @@ #define RKAIISP_CMD_SET_MEMORY_MODE \ _IOW('V', BASE_VIDIOC_PRIVATE + 6, enum rkaiisp_mem_mode) +#define RKAIISP_CMD_CLEAR_IQPARAMS \ + _IO('V', BASE_VIDIOC_PRIVATE + 7) + /**********************EVENT_PRIVATE***************************/ #define RKAIISP_V4L2_EVENT_AIISP_DONE (V4L2_EVENT_PRIVATE_START + 1)