---
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) {