Commit ab7d9fed authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab
Browse files

media: imx: capture: Support creating immutable link to capture device



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: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: default avatarRui Miguel Silva <rmfrfs@gmail.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent c24ead99
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;

+5 −2
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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;

+2 −1
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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);