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 <[email protected]>
> Cc: Philipp Zabel <[email protected]>
> Cc: Steve Longerbeam <[email protected]>
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) {
>