int v4l2_subdev_link_validate(struct media_link *link) { struct v4l2_subdev *sink; struct v4l2_subdev_format sink_fmt, source_fmt; int rval; rval = v4l2_subdev_link_validate_get_format( link->source, &source_fmt); if (rval < 0) return 0; rval = v4l2_subdev_link_validate_get_format( link->sink, &sink_fmt); if (rval < 0) return 0; sink = media_entity_to_v4l2_subdev(link->sink->entity); rval = v4l2_subdev_call(sink, pad, link_validate, link, &source_fmt, &sink_fmt); if (rval != -ENOIOCTLCMD) return rval; return v4l2_subdev_link_validate_default( sink, link, &source_fmt, &sink_fmt); }
static int imx7_csi_pad_link_validate(struct v4l2_subdev *sd, struct media_link *link, struct v4l2_subdev_format *source_fmt, struct v4l2_subdev_format *sink_fmt) { struct imx7_csi *csi = v4l2_get_subdevdata(sd); struct v4l2_fwnode_endpoint upstream_ep = {}; int ret; ret = v4l2_subdev_link_validate_default(sd, link, source_fmt, sink_fmt); if (ret) return ret; ret = imx7_csi_get_upstream_endpoint(csi, &upstream_ep, true); if (ret) { v4l2_err(&csi->sd, "failed to find upstream endpoint\n"); return ret; } mutex_lock(&csi->lock); csi->upstream_ep = upstream_ep; csi->is_csi2 = (upstream_ep.bus_type == V4L2_MBUS_CSI2_DPHY); mutex_unlock(&csi->lock); return 0; }
static int csi2_link_validate(struct v4l2_subdev *sd, struct media_link *link, struct v4l2_subdev_format *source_fmt, struct v4l2_subdev_format *sink_fmt) { struct iss_csi2_device *csi2 = v4l2_get_subdevdata(sd); struct iss_pipeline *pipe = to_iss_pipeline(&csi2->subdev.entity); int rval; pipe->external = media_entity_to_v4l2_subdev(link->source->entity); rval = omap4iss_get_external_info(pipe, link); if (rval < 0) return rval; return v4l2_subdev_link_validate_default(sd, link, source_fmt, sink_fmt); }
static int vdic_link_validate(struct v4l2_subdev *sd, struct media_link *link, struct v4l2_subdev_format *source_fmt, struct v4l2_subdev_format *sink_fmt) { struct vdic_priv *priv = v4l2_get_subdevdata(sd); int ret; ret = v4l2_subdev_link_validate_default(sd, link, source_fmt, sink_fmt); if (ret) return ret; mutex_lock(&priv->lock); if (priv->csi_direct && priv->motion != HIGH_MOTION) { v4l2_err(&priv->sd, "direct CSI pipeline requires high motion\n"); ret = -EINVAL; } mutex_unlock(&priv->lock); return ret; }