media: rockchip: isp/ispp: release ldch/fec buffer when close video

Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
Change-Id: I527e2658e69c11c415f3df4b604693d1ef18b360
This commit is contained in:
Hu Kejun
2020-12-11 14:44:17 +08:00
committed by Tao Huang
parent fd06e4f6d5
commit 09cdad0647
5 changed files with 23 additions and 1 deletions

View File

@@ -232,8 +232,12 @@ static int rkisp_params_fh_open(struct file *filp)
static int rkisp_params_fop_release(struct file *file)
{
struct rkisp_isp_params_vdev *params = video_drvdata(file);
struct video_device *vdev = video_devdata(file);
int ret;
if (file->private_data == vdev->queue->owner && params->ops->fop_release)
params->ops->fop_release(params);
ret = vb2_fop_release(file);
if (!ret) {
ret = v4l2_pipeline_pm_use(&params->vnode.vdev.entity, 0);

View File

@@ -30,6 +30,7 @@ struct rkisp_isp_params_ops {
void (*set_ldchbuf_size)(struct rkisp_isp_params_vdev *params_vdev,
struct rkisp_ldchbuf_size *ldchsize);
void (*stream_stop)(struct rkisp_isp_params_vdev *params_vdev);
void (*fop_release)(struct rkisp_isp_params_vdev *params_vdev);
};
/*

View File

@@ -4033,6 +4033,12 @@ rkisp_params_stream_stop_v2x(struct rkisp_isp_params_vdev *params_vdev)
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr);
}
static void
rkisp_params_fop_release_v2x(struct rkisp_isp_params_vdev *params_vdev)
{
rkisp_deinit_ldch_buf(params_vdev);
}
/* Not called when the camera active, thus not isr protection. */
static void
rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev)
@@ -4196,6 +4202,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {
.get_ldchbuf_inf = rkisp_params_get_ldchbuf_inf_v2x,
.set_ldchbuf_size = rkisp_params_set_ldchbuf_size_v2x,
.stream_stop = rkisp_params_stream_stop_v2x,
.fop_release = rkisp_params_fop_release_v2x,
};
int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev)

View File

@@ -4333,6 +4333,12 @@ rkisp_params_set_ldchbuf_size_v2x(struct rkisp_isp_params_vdev *params_vdev,
rkisp_init_ldch_buf(params_vdev, ldchsize);
}
static void
rkisp_params_fop_release_v2x(struct rkisp_isp_params_vdev *params_vdev)
{
rkisp_deinit_ldch_buf(params_vdev);
}
/* Not called when the camera active, thus not isr protection. */
static void
rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev)
@@ -4482,6 +4488,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {
.param_cfgsram = rkisp_params_cfgsram_v2x,
.get_ldchbuf_inf = rkisp_params_get_ldchbuf_inf_v2x,
.set_ldchbuf_size = rkisp_params_set_ldchbuf_size_v2x,
.fop_release = rkisp_params_fop_release_v2x,
};
int rkisp_init_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev)

View File

@@ -909,9 +909,13 @@ static int
rkispp_param_fh_release(struct file *filp)
{
struct rkispp_params_vdev *params = video_drvdata(filp);
struct video_device *vdev = video_devdata(filp);
struct rkispp_device *isppdev = params->dev;
int ret;
if (filp->private_data == vdev->queue->owner)
rkispp_param_deinit_fecbuf(params);
ret = vb2_fop_release(filp);
if (!ret) {
ret = v4l2_pipeline_pm_use(&params->vnode.vdev.entity, 0);
@@ -919,7 +923,6 @@ rkispp_param_fh_release(struct file *filp)
v4l2_err(&isppdev->v4l2_dev,
"pipeline power off failed %d\n", ret);
}
rkispp_param_deinit_fecbuf(params);
return ret;
}