diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index 631d787324fd..aa305a5510fe 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -261,6 +261,8 @@ static void rkisp_params_vb2_stop_streaming(struct vb2_queue *vq) /* clean module params */ params_vdev->ops->clear_first_param(params_vdev); params_vdev->rdbk_times = 0; + if (!(dev->isp_state & ISP_START)) + rkisp_params_stream_stop(params_vdev); } static int @@ -305,7 +307,8 @@ static int rkisp_params_fh_open(struct file *filp) if (ret < 0) vb2_fop_release(filp); } - + if (!ret) + atomic_inc(¶ms->open_cnt); return ret; } @@ -317,6 +320,10 @@ static int rkisp_params_fop_release(struct file *file) ret = vb2_fop_release(file); if (!ret) v4l2_pipeline_pm_put(¶ms->vnode.vdev.entity); + if (!atomic_dec_return(¶ms->open_cnt) && + !(params->dev->isp_state & ISP_START) && + params->ops->fop_release) + params->ops->fop_release(params); return ret; } @@ -491,8 +498,6 @@ void rkisp_params_stream_stop(struct rkisp_isp_params_vdev *params_vdev) /* isp stop to free buf */ if (params_vdev->ops->stream_stop) params_vdev->ops->stream_stop(params_vdev); - if (params_vdev->ops->fop_release) - params_vdev->ops->fop_release(params_vdev); params_vdev->first_cfg_params = false; } @@ -573,7 +578,7 @@ int rkisp_register_params_vdev(struct rkisp_isp_params_vdev *params_vdev, RKISP_ISP_PAD_SINK_PARAMS, MEDIA_LNK_FL_ENABLED); if (ret < 0) goto err_unregister_video; - + atomic_set(¶ms_vdev->open_cnt, 0); return 0; err_unregister_video: diff --git a/drivers/media/platform/rockchip/isp/isp_params.h b/drivers/media/platform/rockchip/isp/isp_params.h index 1a386b3e4cff..fe31b627259a 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.h +++ b/drivers/media/platform/rockchip/isp/isp_params.h @@ -90,6 +90,8 @@ struct rkisp_isp_params_vdev { struct sensor_exposure_cfg exposure; + atomic_t open_cnt; + bool is_subs_evt; bool is_first_cfg; };