summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-02-15 07:27:02 +0300
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2021-03-11 13:59:50 +0300
commitc6f02291d114b76b081930ba0e0bacd655ad4128 (patch)
tree18e3397e3fa987d03519029829b6c6dc5d8f953b /drivers
parent66f469c1b4843b4797c1aba2955c44abc58bdc54 (diff)
downloadlinux-c6f02291d114b76b081930ba0e0bacd655ad4128.tar.xz
media: imx: imx7-media-csi: Fix source type identification
The code in imx7_csi_pad_link_validate() that checks the type of the source incorrectly handles devices that have no parallel input. In that case, the source entity of the CSI is the CSI-2 receiver, not the video mux, and the driver will proceed to check the type of the source of the CSI-2 receiver. Make the code more explicit to fix this, by handling the three cases (parallel input only, CSI-2 receiver only, and video mux) separately. Note that the driver will not correctly handle the case where only a parallel input is present, and the external entity connected to the parallel input reports a MEDIA_ENT_F_VID_IF_BRIDGE or MEDIA_ENT_F_VID_MUX function. This was broken already, and should be fixed separately. Fixes: f5ffb81f5137 ("media: imx7: csi: Fix pad link validation") Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Rui Miguel Silva <rmfrfs@gmail.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/staging/media/imx/imx7-media-csi.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/drivers/staging/media/imx/imx7-media-csi.c b/drivers/staging/media/imx/imx7-media-csi.c
index de7b93317a47..2a4b69cc0178 100644
--- a/drivers/staging/media/imx/imx7-media-csi.c
+++ b/drivers/staging/media/imx/imx7-media-csi.c
@@ -1000,39 +1000,47 @@ static int imx7_csi_pad_link_validate(struct v4l2_subdev *sd,
struct imx7_csi *csi = v4l2_get_subdevdata(sd);
struct imx_media_video_dev *vdev = csi->vdev;
const struct v4l2_pix_format *out_pix = &vdev->fmt;
- struct media_entity *src;
struct media_pad *pad;
+ bool is_csi2;
int ret;
+ if (!csi->src_sd)
+ return -EPIPE;
+
/*
- * Validate the source link, and record whether the CSI mux selects the
+ * Validate the source link, and record whether the source uses the
* parallel input or the CSI-2 receiver.
*/
ret = v4l2_subdev_link_validate_default(sd, link, source_fmt, sink_fmt);
if (ret)
return ret;
- if (!csi->src_sd)
- return -EPIPE;
+ switch (csi->src_sd->entity.function) {
+ case MEDIA_ENT_F_VID_IF_BRIDGE:
+ /* The input is the CSI-2 receiver. */
+ is_csi2 = true;
+ break;
- src = &csi->src_sd->entity;
+ case MEDIA_ENT_F_VID_MUX:
+ /* The input is the mux, check its input. */
+ pad = imx_media_pipeline_pad(&csi->src_sd->entity, 0, 0, true);
+ if (!pad)
+ return -ENODEV;
- /*
- * if the source is neither a CSI MUX or CSI-2 get the one directly
- * upstream from this CSI
- */
- if (src->function != MEDIA_ENT_F_VID_IF_BRIDGE &&
- src->function != MEDIA_ENT_F_VID_MUX)
- src = &csi->sd.entity;
+ is_csi2 = pad->entity->function == MEDIA_ENT_F_VID_IF_BRIDGE;
+ break;
- pad = imx_media_pipeline_pad(src, 0, 0, true);
- if (!pad)
- return -ENODEV;
+ default:
+ /*
+ * The input is an external entity, it must use the parallel
+ * bus.
+ */
+ is_csi2 = false;
+ break;
+ }
mutex_lock(&csi->lock);
-
- csi->is_csi2 = (pad->entity->function == MEDIA_ENT_F_VID_IF_BRIDGE);
-
+ csi->is_csi2 = is_csi2;
mutex_unlock(&csi->lock);
/* Validate the sink link, ensure the pixel format is supported. */