diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index 7894ac109762..9c1e0b6accf9 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -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(¶ms->vnode.vdev.entity, 0); diff --git a/drivers/media/platform/rockchip/isp/isp_params.h b/drivers/media/platform/rockchip/isp/isp_params.h index 9f45d540c048..69c203ac3c96 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.h +++ b/drivers/media/platform/rockchip/isp/isp_params.h @@ -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); }; /* diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c index 4fd4908022df..fa0a8cf65d33 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c @@ -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) diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index f397429bd1d7..4e67186e69f0 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -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) diff --git a/drivers/media/platform/rockchip/ispp/params.c b/drivers/media/platform/rockchip/ispp/params.c index 1ef8741d1417..1911806aa614 100644 --- a/drivers/media/platform/rockchip/ispp/params.c +++ b/drivers/media/platform/rockchip/ispp/params.c @@ -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(¶ms->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; }