[media] v4l: vsp1: Make the userspace API optional
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Tue, 28 Jul 2015 19:16:05 +0000 (16:16 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Fri, 19 Feb 2016 11:19:55 +0000 (09:19 -0200)
The R-Car Gen3 SoCs include VSP instances dedicated to the DU that will
be controlled entirely by the rcar-du-drm driver through the KMS API. To
support that use case make the userspace V4L2 API optional.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/vsp1/vsp1.h
drivers/media/platform/vsp1/vsp1_drv.c
drivers/media/platform/vsp1/vsp1_entity.c
drivers/media/platform/vsp1/vsp1_sru.c
drivers/media/platform/vsp1/vsp1_wpf.c

index d980f32aac0b63de6debbd7a311d187c6f19ccff..4fd4386a704989154a320ff08f857becdf647344 100644 (file)
@@ -50,6 +50,7 @@ struct vsp1_platform_data {
        unsigned int uds_count;
        unsigned int wpf_count;
        unsigned int num_bru_inputs;
+       bool uapi;
 };
 
 struct vsp1_device {
index 8d67a06c86ea4ca20a360d3951777bdcfb576861..63892b2f448406e338174a31d34392a734c5108b 100644 (file)
@@ -143,6 +143,9 @@ static int vsp1_create_links(struct vsp1_device *vsp1)
                        return ret;
        }
 
+       if (!vsp1->pdata.uapi)
+               return 0;
+
        for (i = 0; i < vsp1->pdata.rpf_count; ++i) {
                struct vsp1_rwpf *rpf = vsp1->rpf[i];
 
@@ -267,7 +270,6 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
        }
 
        for (i = 0; i < vsp1->pdata.rpf_count; ++i) {
-               struct vsp1_video *video;
                struct vsp1_rwpf *rpf;
 
                rpf = vsp1_rpf_create(vsp1, i);
@@ -279,13 +281,16 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
                vsp1->rpf[i] = rpf;
                list_add_tail(&rpf->entity.list_dev, &vsp1->entities);
 
-               video = vsp1_video_create(vsp1, rpf);
-               if (IS_ERR(video)) {
-                       ret = PTR_ERR(video);
-                       goto done;
-               }
+               if (vsp1->pdata.uapi) {
+                       struct vsp1_video *video = vsp1_video_create(vsp1, rpf);
 
-               list_add_tail(&video->list, &vsp1->videos);
+                       if (IS_ERR(video)) {
+                               ret = PTR_ERR(video);
+                               goto done;
+                       }
+
+                       list_add_tail(&video->list, &vsp1->videos);
+               }
        }
 
        if (vsp1->pdata.features & VSP1_HAS_SRU) {
@@ -312,7 +317,6 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
        }
 
        for (i = 0; i < vsp1->pdata.wpf_count; ++i) {
-               struct vsp1_video *video;
                struct vsp1_rwpf *wpf;
 
                wpf = vsp1_wpf_create(vsp1, i);
@@ -324,14 +328,17 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
                vsp1->wpf[i] = wpf;
                list_add_tail(&wpf->entity.list_dev, &vsp1->entities);
 
-               video = vsp1_video_create(vsp1, wpf);
-               if (IS_ERR(video)) {
-                       ret = PTR_ERR(video);
-                       goto done;
-               }
+               if (vsp1->pdata.uapi) {
+                       struct vsp1_video *video = vsp1_video_create(vsp1, wpf);
 
-               list_add_tail(&video->list, &vsp1->videos);
-               wpf->entity.sink = &video->video.entity;
+                       if (IS_ERR(video)) {
+                               ret = PTR_ERR(video);
+                               goto done;
+                       }
+
+                       list_add_tail(&video->list, &vsp1->videos);
+                       wpf->entity.sink = &video->video.entity;
+               }
        }
 
        /* Register all subdevs. */
@@ -347,9 +354,11 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
        if (ret < 0)
                goto done;
 
-       ret = v4l2_device_register_subdev_nodes(&vsp1->v4l2_dev);
-       if (ret < 0)
-               goto done;
+       if (vsp1->pdata.uapi) {
+               ret = v4l2_device_register_subdev_nodes(&vsp1->v4l2_dev);
+               if (ret < 0)
+                       goto done;
+       }
 
        ret = media_device_register(mdev);
 
@@ -545,6 +554,7 @@ static int vsp1_parse_dt(struct vsp1_device *vsp1)
 
        pdata->features |= VSP1_HAS_BRU;
        pdata->num_bru_inputs = 4;
+       pdata->uapi = true;
 
        return 0;
 }
index 479029fd4e9039231b0accb3550adda1f15aa863..338a1b0b4fadedf80c0cc09bc43ae871a20fc642 100644 (file)
@@ -45,7 +45,7 @@ int vsp1_entity_set_streaming(struct vsp1_entity *entity, bool streaming)
        if (!streaming)
                return 0;
 
-       if (!entity->subdev.ctrl_handler)
+       if (!entity->vsp1->pdata.uapi || !entity->subdev.ctrl_handler)
                return 0;
 
        ret = v4l2_ctrl_handler_setup(entity->subdev.ctrl_handler);
index d41ae950d1a13a923a1f3d372a5ffa1884435ae6..cff4a1d82e3b62aed33ec020b6a606262b34f0d0 100644 (file)
@@ -151,11 +151,13 @@ static int sru_s_stream(struct v4l2_subdev *subdev, int enable)
        /* Take the control handler lock to ensure that the CTRL0 value won't be
         * changed behind our back by a set control operation.
         */
-       mutex_lock(sru->ctrls.lock);
+       if (sru->entity.vsp1->pdata.uapi)
+               mutex_lock(sru->ctrls.lock);
        ctrl0 |= vsp1_sru_read(sru, VI6_SRU_CTRL0)
               & (VI6_SRU_CTRL0_PARAM0_MASK | VI6_SRU_CTRL0_PARAM1_MASK);
        vsp1_sru_write(sru, VI6_SRU_CTRL0, ctrl0);
-       mutex_unlock(sru->ctrls.lock);
+       if (sru->entity.vsp1->pdata.uapi)
+               mutex_unlock(sru->ctrls.lock);
 
        vsp1_sru_write(sru, VI6_SRU_CTRL1, VI6_SRU_CTRL1_PARAM5);
 
index d2537b46fc469e39ab49c5b1917d676a7e0c215a..184a7e01aad525401ca812949ffe202b9b1cc563 100644 (file)
@@ -151,10 +151,12 @@ static int wpf_s_stream(struct v4l2_subdev *subdev, int enable)
        /* Take the control handler lock to ensure that the PDV value won't be
         * changed behind our back by a set control operation.
         */
-       mutex_lock(wpf->ctrls.lock);
+       if (vsp1->pdata.uapi)
+               mutex_lock(wpf->ctrls.lock);
        outfmt |= vsp1_wpf_read(wpf, VI6_WPF_OUTFMT) & VI6_WPF_OUTFMT_PDV_MASK;
        vsp1_wpf_write(wpf, VI6_WPF_OUTFMT, outfmt);
-       mutex_unlock(wpf->ctrls.lock);
+       if (vsp1->pdata.uapi)
+               mutex_unlock(wpf->ctrls.lock);
 
        vsp1_write(vsp1, VI6_DPR_WPF_FPORCH(wpf->entity.index),
                   VI6_DPR_WPF_FPORCH_FP_WPFN);