From 96d3682cb425674ef5fccb51684bdb56aba19c25 Mon Sep 17 00:00:00 2001 From: Hu Kejun Date: Fri, 27 Mar 2020 09:35:42 +0800 Subject: [PATCH] media: rockchip: isp: enable clock on when open param/stats/luma node Signed-off-by: Hu Kejun Change-Id: I700a355237b226d77aaac928ec2824005409c7af --- .../platform/rockchip/isp/isp_mipi_luma.c | 35 +++++++++++++++++-- .../media/platform/rockchip/isp/isp_params.c | 35 +++++++++++++++++-- .../media/platform/rockchip/isp/isp_stats.c | 35 +++++++++++++++++-- 3 files changed, 96 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/isp_mipi_luma.c b/drivers/media/platform/rockchip/isp/isp_mipi_luma.c index 18ec7c3f3edb..a6566244c211 100644 --- a/drivers/media/platform/rockchip/isp/isp_mipi_luma.c +++ b/drivers/media/platform/rockchip/isp/isp_mipi_luma.c @@ -77,12 +77,42 @@ static const struct v4l2_ioctl_ops rkisp_luma_ioctl = { .vidioc_querycap = rkisp_luma_querycap }; +static int rkisp_luma_fh_open(struct file *filp) +{ + struct rkisp_luma_vdev *params = video_drvdata(filp); + int ret; + + ret = v4l2_fh_open(filp); + if (!ret) { + ret = v4l2_pipeline_pm_use(¶ms->vnode.vdev.entity, 1); + if (ret < 0) + vb2_fop_release(filp); + } + + return ret; +} + +static int rkisp_luma_fop_release(struct file *file) +{ + struct rkisp_luma_vdev *luma = video_drvdata(file); + int ret; + + ret = vb2_fop_release(file); + if (!ret) { + ret = v4l2_pipeline_pm_use(&luma->vnode.vdev.entity, 0); + if (ret < 0) + v4l2_err(&luma->dev->v4l2_dev, + "set pipeline power failed %d\n", ret); + } + return ret; +} + struct v4l2_file_operations rkisp_luma_fops = { .mmap = vb2_fop_mmap, .unlocked_ioctl = video_ioctl2, .poll = vb2_fop_poll, - .open = v4l2_fh_open, - .release = vb2_fop_release + .open = rkisp_luma_fh_open, + .release = rkisp_luma_fop_release }; static int rkisp_luma_vb2_queue_setup(struct vb2_queue *vq, @@ -405,7 +435,6 @@ int rkisp_register_luma_vdev(struct rkisp_luma_vdev *luma_vdev, strlcpy(vdev->name, "rkisp-mipi-luma", sizeof(vdev->name)); - video_set_drvdata(vdev, luma_vdev); vdev->ioctl_ops = &rkisp_luma_ioctl; vdev->fops = &rkisp_luma_fops; vdev->release = video_device_release_empty; diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index e76da6118991..bc336878c345 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -206,12 +206,42 @@ static struct vb2_ops rkisp_params_vb2_ops = { }; +static int rkisp_params_fh_open(struct file *filp) +{ + struct rkisp_isp_params_vdev *params = video_drvdata(filp); + int ret; + + ret = v4l2_fh_open(filp); + if (!ret) { + ret = v4l2_pipeline_pm_use(¶ms->vnode.vdev.entity, 1); + if (ret < 0) + vb2_fop_release(filp); + } + + return ret; +} + +static int rkisp_params_fop_release(struct file *file) +{ + struct rkisp_isp_params_vdev *params = video_drvdata(file); + int ret; + + ret = vb2_fop_release(file); + if (!ret) { + ret = v4l2_pipeline_pm_use(¶ms->vnode.vdev.entity, 0); + if (ret < 0) + v4l2_err(¶ms->dev->v4l2_dev, + "set pipeline power failed %d\n", ret); + } + return ret; +} + struct v4l2_file_operations rkisp_params_fops = { .mmap = vb2_fop_mmap, .unlocked_ioctl = video_ioctl2, .poll = vb2_fop_poll, - .open = v4l2_fh_open, - .release = vb2_fop_release + .open = rkisp_params_fh_open, + .release = rkisp_params_fop_release }; static int @@ -289,7 +319,6 @@ int rkisp_register_params_vdev(struct rkisp_isp_params_vdev *params_vdev, strlcpy(vdev->name, PARAMS_NAME, sizeof(vdev->name)); - video_set_drvdata(vdev, params_vdev); vdev->ioctl_ops = &rkisp_params_ioctl; vdev->fops = &rkisp_params_fops; vdev->release = video_device_release_empty; diff --git a/drivers/media/platform/rockchip/isp/isp_stats.c b/drivers/media/platform/rockchip/isp/isp_stats.c index f51cffdb1c57..1860746f4be7 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats.c +++ b/drivers/media/platform/rockchip/isp/isp_stats.c @@ -79,12 +79,42 @@ static const struct v4l2_ioctl_ops rkisp_stats_ioctl = { .vidioc_querycap = rkisp_stats_querycap }; +static int rkisp_stats_fh_open(struct file *filp) +{ + struct rkisp_isp_stats_vdev *stats = video_drvdata(filp); + int ret; + + ret = v4l2_fh_open(filp); + if (!ret) { + ret = v4l2_pipeline_pm_use(&stats->vnode.vdev.entity, 1); + if (ret < 0) + vb2_fop_release(filp); + } + + return ret; +} + +static int rkisp_stats_fop_release(struct file *file) +{ + struct rkisp_isp_stats_vdev *stats = video_drvdata(file); + int ret; + + ret = vb2_fop_release(file); + if (!ret) { + ret = v4l2_pipeline_pm_use(&stats->vnode.vdev.entity, 0); + if (ret < 0) + v4l2_err(&stats->dev->v4l2_dev, + "set pipeline power failed %d\n", ret); + } + return ret; +} + struct v4l2_file_operations rkisp_stats_fops = { .mmap = vb2_fop_mmap, .unlocked_ioctl = video_ioctl2, .poll = vb2_fop_poll, - .open = v4l2_fh_open, - .release = vb2_fop_release + .open = rkisp_stats_fh_open, + .release = rkisp_stats_fop_release }; static int rkisp_stats_vb2_queue_setup(struct vb2_queue *vq, @@ -265,7 +295,6 @@ int rkisp_register_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev, strlcpy(vdev->name, STATS_NAME, sizeof(vdev->name)); - video_set_drvdata(vdev, stats_vdev); vdev->ioctl_ops = &rkisp_stats_ioctl; vdev->fops = &rkisp_stats_fops; vdev->release = video_device_release_empty;