diff --git a/drivers/media/platform/rockchip/vpss/dev.c b/drivers/media/platform/rockchip/vpss/dev.c index bf48377b9d96..3748a19909e8 100644 --- a/drivers/media/platform/rockchip/vpss/dev.c +++ b/drivers/media/platform/rockchip/vpss/dev.c @@ -78,9 +78,20 @@ void rkvpss_pipeline_default_fmt(struct rkvpss_device *dev) int rkvpss_pipeline_open(struct rkvpss_device *dev) { + int isp_working = 0; + if (atomic_inc_return(&dev->pipe_power_cnt) > 1) return 0; - + if (!atomic_read(&dev->hw_dev->refcnt)) { + v4l2_subdev_call(dev->remote_sd, core, ioctl, + RKISP_VPSS_GET_ISP_WORKING, &isp_working); + if (isp_working) { + atomic_dec(&dev->pipe_power_cnt); + v4l2_err(&dev->v4l2_dev, + "no support isp working then vpss start, make sure vpss stream on first\n"); + return -EINVAL; + } + } return 0; } diff --git a/drivers/media/platform/rockchip/vpss/stream_v10.c b/drivers/media/platform/rockchip/vpss/stream_v10.c index b0b35f26c661..6ac0a5a4e50c 100644 --- a/drivers/media/platform/rockchip/vpss/stream_v10.c +++ b/drivers/media/platform/rockchip/vpss/stream_v10.c @@ -1871,7 +1871,8 @@ static int rkvpss_start_streaming(struct vb2_queue *queue, unsigned int count) goto free_buf_queue; } - rkvpss_pipeline_open(dev); + if (rkvpss_pipeline_open(dev) < 0) + goto free_buf_queue; ret = rkvpss_stream_start(stream); if (ret < 0) { diff --git a/drivers/media/platform/rockchip/vpss/stream_v20.c b/drivers/media/platform/rockchip/vpss/stream_v20.c index 5038086c7ead..420e292c43ef 100644 --- a/drivers/media/platform/rockchip/vpss/stream_v20.c +++ b/drivers/media/platform/rockchip/vpss/stream_v20.c @@ -2094,7 +2094,8 @@ static int rkvpss_start_streaming(struct vb2_queue *queue, unsigned int count) goto free_buf_queue; } - rkvpss_pipeline_open(dev); + if (rkvpss_pipeline_open(dev) < 0) + goto free_buf_queue; ret = rkvpss_stream_start(stream); if (ret < 0) {