diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-02-15 07:27:02 +0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2021-03-11 13:59:50 +0300 |
commit | c6f02291d114b76b081930ba0e0bacd655ad4128 (patch) | |
tree | 18e3397e3fa987d03519029829b6c6dc5d8f953b /drivers | |
parent | 66f469c1b4843b4797c1aba2955c44abc58bdc54 (diff) | |
download | linux-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.c | 44 |
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. */ |