OSDN Git Service

media: imx: capture: Support creating immutable link to capture device
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Mon, 15 Feb 2021 04:26:54 +0000 (05:26 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 11 Mar 2021 10:59:49 +0000 (11:59 +0100)
When the subdevice connected to the capture device has a single possible
sink, there's no point in making the link mutable. Support creating
immutable links.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Rui Miguel Silva <rmfrfs@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/imx/imx-ic-prpencvf.c
drivers/staging/media/imx/imx-media-capture.c
drivers/staging/media/imx/imx-media-csi.c
drivers/staging/media/imx/imx-media.h
drivers/staging/media/imx/imx7-media-csi.c

index 88d6942..d990553 100644 (file)
@@ -1269,7 +1269,7 @@ static int prp_registered(struct v4l2_subdev *sd)
        if (IS_ERR(priv->vdev))
                return PTR_ERR(priv->vdev);
 
-       ret = imx_media_capture_device_register(priv->vdev);
+       ret = imx_media_capture_device_register(priv->vdev, 0);
        if (ret)
                goto remove_vdev;
 
index c436086..93ba092 100644 (file)
@@ -898,7 +898,8 @@ static int capture_init_format(struct capture_priv *priv)
        return 0;
 }
 
-int imx_media_capture_device_register(struct imx_media_video_dev *vdev)
+int imx_media_capture_device_register(struct imx_media_video_dev *vdev,
+                                     u32 link_flags)
 {
        struct capture_priv *priv = to_capture_priv(vdev);
        struct v4l2_subdev *sd = priv->src_sd;
@@ -927,8 +928,10 @@ int imx_media_capture_device_register(struct imx_media_video_dev *vdev)
                 video_device_node_name(vfd));
 
        /* Create the link from the src_sd devnode pad to device node. */
+       if (link_flags & MEDIA_LNK_FL_IMMUTABLE)
+               link_flags |= MEDIA_LNK_FL_ENABLED;
        ret = media_create_pad_link(&sd->entity, priv->src_sd_pad,
-                                   &vfd->entity, 0, 0);
+                                   &vfd->entity, 0, link_flags);
        if (ret) {
                dev_err(priv->dev, "failed to create link to device node\n");
                video_unregister_device(vfd);
index 45c9281..8d02939 100644 (file)
@@ -1788,7 +1788,7 @@ static int csi_registered(struct v4l2_subdev *sd)
                goto free_fim;
        }
 
-       ret = imx_media_capture_device_register(priv->vdev);
+       ret = imx_media_capture_device_register(priv->vdev, 0);
        if (ret)
                goto remove_vdev;
 
index 2ea2e62..492d9a6 100644 (file)
@@ -288,7 +288,8 @@ struct imx_media_video_dev *
 imx_media_capture_device_init(struct device *dev, struct v4l2_subdev *src_sd,
                              int pad, bool legacy_api);
 void imx_media_capture_device_remove(struct imx_media_video_dev *vdev);
-int imx_media_capture_device_register(struct imx_media_video_dev *vdev);
+int imx_media_capture_device_register(struct imx_media_video_dev *vdev,
+                                     u32 link_flags);
 void imx_media_capture_device_unregister(struct imx_media_video_dev *vdev);
 struct imx_media_buffer *
 imx_media_capture_device_next_buf(struct imx_media_video_dev *vdev);
index 3bf2505..90cf4b8 100644 (file)
@@ -1104,7 +1104,7 @@ static int imx7_csi_registered(struct v4l2_subdev *sd)
        if (IS_ERR(csi->vdev))
                return PTR_ERR(csi->vdev);
 
-       ret = imx_media_capture_device_register(csi->vdev);
+       ret = imx_media_capture_device_register(csi->vdev, 0);
        if (ret)
                imx_media_capture_device_remove(csi->vdev);