On 07/04/18 15:05, Marek Vasut wrote: > In case the PRPVF is not connected directly to CSI, the PRPVF subdev > driver won't find the CSI subdev and will not configure the CSI input > mux. This is not noticable on the IPU1-CSI0 interface with parallel > camera, since the mux is set "correctly" by default and the parallel > camera will work just fine. This is however noticable on IPU2-CSI1, > where the mux is not set to the correct position by default and the > pipeline will fail. > > Add similar code to what is in PRPVF to VDIC driver, so that the VDIC > can locate the CSI subdev and configure the mux correctly if the CSI > is connected to the VDIC. Make the PRPVF driver configure the CSI mux > only in case it's connected directly to CSI and not in case it is > connected to VDIC. > > Signed-off-by: Marek Vasut <marex@xxxxxxx> > Cc: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> > Cc: Steve Longerbeam <steve_longerbeam@xxxxxxxxxx> Same here, I cannot merge with out Acks since I don't know the details of the imx hardware. Regards, Hans > --- > drivers/staging/media/imx/imx-ic-prp.c | 6 ++---- > drivers/staging/media/imx/imx-media-vdic.c | 24 ++++++++++++++++++++++++ > 2 files changed, 26 insertions(+), 4 deletions(-) > > diff --git a/drivers/staging/media/imx/imx-ic-prp.c b/drivers/staging/media/imx/imx-ic-prp.c > index 98923fc844ce..84fa66dae21a 100644 > --- a/drivers/staging/media/imx/imx-ic-prp.c > +++ b/drivers/staging/media/imx/imx-ic-prp.c > @@ -72,14 +72,12 @@ static inline struct prp_priv *sd_to_priv(struct v4l2_subdev *sd) > static int prp_start(struct prp_priv *priv) > { > struct imx_ic_priv *ic_priv = priv->ic_priv; > - bool src_is_vdic; > > priv->ipu = priv->md->ipu[ic_priv->ipu_id]; > > /* set IC to receive from CSI or VDI depending on source */ > - src_is_vdic = !!(priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_VDIC); > - > - ipu_set_ic_src_mux(priv->ipu, priv->csi_id, src_is_vdic); > + if (!(priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_VDIC)) > + ipu_set_ic_src_mux(priv->ipu, priv->csi_id, false); > > return 0; > } > diff --git a/drivers/staging/media/imx/imx-media-vdic.c b/drivers/staging/media/imx/imx-media-vdic.c > index b538bbebedc5..e660911e7024 100644 > --- a/drivers/staging/media/imx/imx-media-vdic.c > +++ b/drivers/staging/media/imx/imx-media-vdic.c > @@ -117,6 +117,9 @@ struct vdic_priv { > > bool csi_direct; /* using direct CSI->VDIC->IC pipeline */ > > + /* the CSI id at link validate */ > + int csi_id; > + > /* motion select control */ > struct v4l2_ctrl_handler ctrl_hdlr; > enum ipu_motion_sel motion; > @@ -388,6 +391,9 @@ static int vdic_start(struct vdic_priv *priv) > if (ret) > return ret; > > + /* set IC to receive from CSI or VDI depending on source */ > + ipu_set_ic_src_mux(priv->ipu, priv->csi_id, true); > + > /* > * init the VDIC. > * > @@ -778,6 +784,7 @@ static int vdic_link_validate(struct v4l2_subdev *sd, > struct v4l2_subdev_format *sink_fmt) > { > struct vdic_priv *priv = v4l2_get_subdevdata(sd); > + struct imx_media_subdev *csi; > int ret; > > ret = v4l2_subdev_link_validate_default(sd, link, > @@ -785,6 +792,23 @@ static int vdic_link_validate(struct v4l2_subdev *sd, > if (ret) > return ret; > > + csi = imx_media_find_upstream_subdev(priv->md, priv->src, > + IMX_MEDIA_GRP_ID_CSI); > + if (!IS_ERR(csi)) { > + switch (csi->sd->grp_id) { > + case IMX_MEDIA_GRP_ID_CSI0: > + priv->csi_id = 0; > + break; > + case IMX_MEDIA_GRP_ID_CSI1: > + priv->csi_id = 1; > + break; > + default: > + ret = -EINVAL; > + } > + } else { > + priv->csi_id = 0; > + } > + > mutex_lock(&priv->lock); > > if (priv->csi_direct && priv->motion != HIGH_MOTION) { >