Commit dbedd2f4 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

media: v4l2-mc: Add link flags to v4l2_create_fwnode_links_to_pad()

Add a flags argument to the v4l2_create_fwnode_links_to_pad() function
to specify the link flags. This allows drivers to create immutable links
for instance.
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 42849cf0
...@@ -310,7 +310,7 @@ int v4l_vb2q_enable_media_source(struct vb2_queue *q) ...@@ -310,7 +310,7 @@ int v4l_vb2q_enable_media_source(struct vb2_queue *q)
EXPORT_SYMBOL_GPL(v4l_vb2q_enable_media_source); EXPORT_SYMBOL_GPL(v4l_vb2q_enable_media_source);
int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd, int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd,
struct media_pad *sink) struct media_pad *sink, u32 flags)
{ {
struct fwnode_handle *endpoint; struct fwnode_handle *endpoint;
struct v4l2_subdev *sink_sd; struct v4l2_subdev *sink_sd;
...@@ -367,7 +367,7 @@ int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd, ...@@ -367,7 +367,7 @@ int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd,
sink_sd->entity.name, sink_idx); sink_sd->entity.name, sink_idx);
ret = media_create_pad_link(&src_sd->entity, src_idx, ret = media_create_pad_link(&src_sd->entity, src_idx,
&sink_sd->entity, sink_idx, 0); &sink_sd->entity, sink_idx, flags);
if (ret) { if (ret) {
dev_err(sink_sd->dev, dev_err(sink_sd->dev,
"link %s:%d -> %s:%d failed with %d\n", "link %s:%d -> %s:%d failed with %d\n",
...@@ -395,7 +395,7 @@ int v4l2_create_fwnode_links(struct v4l2_subdev *src_sd, ...@@ -395,7 +395,7 @@ int v4l2_create_fwnode_links(struct v4l2_subdev *src_sd,
if (!(pad->flags & MEDIA_PAD_FL_SINK)) if (!(pad->flags & MEDIA_PAD_FL_SINK))
continue; continue;
ret = v4l2_create_fwnode_links_to_pad(src_sd, pad); ret = v4l2_create_fwnode_links_to_pad(src_sd, pad, 0);
if (ret) if (ret)
return ret; return ret;
} }
......
...@@ -1894,7 +1894,7 @@ static int imx_csi_notify_bound(struct v4l2_async_notifier *notifier, ...@@ -1894,7 +1894,7 @@ static int imx_csi_notify_bound(struct v4l2_async_notifier *notifier,
if (sd->entity.function == MEDIA_ENT_F_VID_MUX) if (sd->entity.function == MEDIA_ENT_F_VID_MUX)
sd->grp_id = IMX_MEDIA_GRP_ID_CSI_MUX; sd->grp_id = IMX_MEDIA_GRP_ID_CSI_MUX;
return v4l2_create_fwnode_links_to_pad(sd, sink); return v4l2_create_fwnode_links_to_pad(sd, sink, 0);
} }
static const struct v4l2_async_notifier_operations csi_notify_ops = { static const struct v4l2_async_notifier_operations csi_notify_ops = {
......
...@@ -621,7 +621,7 @@ static int csi2_notify_bound(struct v4l2_async_notifier *notifier, ...@@ -621,7 +621,7 @@ static int csi2_notify_bound(struct v4l2_async_notifier *notifier,
dev_dbg(csi2->dev, "Bound %s pad: %d\n", sd->name, pad); dev_dbg(csi2->dev, "Bound %s pad: %d\n", sd->name, pad);
return v4l2_create_fwnode_links_to_pad(sd, sink); return v4l2_create_fwnode_links_to_pad(sd, sink, 0);
} }
static void csi2_notify_unbind(struct v4l2_async_notifier *notifier, static void csi2_notify_unbind(struct v4l2_async_notifier *notifier,
......
...@@ -1128,7 +1128,7 @@ static int imx7_csi_notify_bound(struct v4l2_async_notifier *notifier, ...@@ -1128,7 +1128,7 @@ static int imx7_csi_notify_bound(struct v4l2_async_notifier *notifier,
if (sd->entity.function == MEDIA_ENT_F_VID_MUX) if (sd->entity.function == MEDIA_ENT_F_VID_MUX)
sd->grp_id = IMX_MEDIA_GRP_ID_CSI_MUX; sd->grp_id = IMX_MEDIA_GRP_ID_CSI_MUX;
return v4l2_create_fwnode_links_to_pad(sd, sink); return v4l2_create_fwnode_links_to_pad(sd, sink, 0);
} }
static const struct v4l2_async_notifier_operations imx7_csi_notify_ops = { static const struct v4l2_async_notifier_operations imx7_csi_notify_ops = {
......
...@@ -962,7 +962,7 @@ static int mipi_csis_notify_bound(struct v4l2_async_notifier *notifier, ...@@ -962,7 +962,7 @@ static int mipi_csis_notify_bound(struct v4l2_async_notifier *notifier,
struct csi_state *state = mipi_notifier_to_csis_state(notifier); struct csi_state *state = mipi_notifier_to_csis_state(notifier);
struct media_pad *sink = &state->mipi_sd.entity.pads[CSIS_PAD_SINK]; struct media_pad *sink = &state->mipi_sd.entity.pads[CSIS_PAD_SINK];
return v4l2_create_fwnode_links_to_pad(sd, sink); return v4l2_create_fwnode_links_to_pad(sd, sink, 0);
} }
static const struct v4l2_async_notifier_operations mipi_csis_notify_ops = { static const struct v4l2_async_notifier_operations mipi_csis_notify_ops = {
......
...@@ -91,6 +91,7 @@ int v4l_vb2q_enable_media_source(struct vb2_queue *q); ...@@ -91,6 +91,7 @@ int v4l_vb2q_enable_media_source(struct vb2_queue *q);
* *
* @src_sd: pointer to a source subdev * @src_sd: pointer to a source subdev
* @sink: pointer to a subdev sink pad * @sink: pointer to a subdev sink pad
* @flags: the link flags
* *
* This function searches for fwnode endpoint connections from a source * This function searches for fwnode endpoint connections from a source
* subdevice to a single sink pad, and if suitable connections are found, * subdevice to a single sink pad, and if suitable connections are found,
...@@ -98,6 +99,11 @@ int v4l_vb2q_enable_media_source(struct vb2_queue *q); ...@@ -98,6 +99,11 @@ int v4l_vb2q_enable_media_source(struct vb2_queue *q);
* called by the sink subdevice, in its v4l2-async notifier subdev bound * called by the sink subdevice, in its v4l2-async notifier subdev bound
* callback, to create links from a bound source subdevice. * callback, to create links from a bound source subdevice.
* *
* The @flags argument specifies the link flags. The caller shall ensure that
* the flags are valid regardless of the number of links that may be created.
* For instance, setting the MEDIA_LNK_FL_ENABLED flag will cause all created
* links to be enabled, which isn't valid if more than one link is created.
*
* .. note:: * .. note::
* *
* Any sink subdevice that calls this function must implement the * Any sink subdevice that calls this function must implement the
...@@ -107,7 +113,7 @@ int v4l_vb2q_enable_media_source(struct vb2_queue *q); ...@@ -107,7 +113,7 @@ int v4l_vb2q_enable_media_source(struct vb2_queue *q);
* Return 0 on success or a negative error code on failure. * Return 0 on success or a negative error code on failure.
*/ */
int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd, int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd,
struct media_pad *sink); struct media_pad *sink, u32 flags);
/** /**
* v4l2_create_fwnode_links - Create fwnode-based links from a source * v4l2_create_fwnode_links - Create fwnode-based links from a source
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment