From bf1fd5fd8fd8ab3f541125e329394fd794585847 Mon Sep 17 00:00:00 2001 From: "Guoniu.Zhou" Date: Fri, 28 Jun 2019 17:36:25 +0800 Subject: [PATCH] MLK-22130: media: ISI: Return error when the output width more than 2048 Because ISI of imx815 only have one channel, so the line buffer chain function can not be used. The maximum supported line width is 2048. Signed-off-by: Guoniu.Zhou --- drivers/media/platform/imx8/mxc-isi-cap.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/media/platform/imx8/mxc-isi-cap.c b/drivers/media/platform/imx8/mxc-isi-cap.c index 7935e4989d85..f81b2d72a99a 100644 --- a/drivers/media/platform/imx8/mxc-isi-cap.c +++ b/drivers/media/platform/imx8/mxc-isi-cap.c @@ -1222,6 +1222,7 @@ static int mxc_isi_cap_enum_framesizes(struct file *file, void *priv, struct v4l2_frmsizeenum *fsize) { struct mxc_isi_dev *mxc_isi = video_drvdata(file); + struct device_node *node = mxc_isi->pdev->dev.of_node; struct v4l2_subdev *sd; struct mxc_isi_fmt *fmt; struct media_pad *source_pad; @@ -1258,6 +1259,11 @@ static int mxc_isi_cap_enum_framesizes(struct file *file, void *priv, if (ret) return ret; + if (of_device_is_compatible(node, "fsl,imx8mn-isi") && + (fse.max_width > 2048 || fse.min_width > 2048)) + return -EINVAL; + + if (fse.min_width == fse.max_width && fse.min_height == fse.max_height) { fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE; @@ -1281,6 +1287,7 @@ static int mxc_isi_cap_enum_frameintervals(struct file *file, void *fh, struct v4l2_frmivalenum *interval) { struct mxc_isi_dev *mxc_isi = video_drvdata(file); + struct device_node *node = mxc_isi->pdev->dev.of_node; struct v4l2_subdev *sd; struct mxc_isi_fmt *fmt; struct media_pad *source_pad; @@ -1314,6 +1321,9 @@ static int mxc_isi_cap_enum_frameintervals(struct file *file, void *fh, if (ret) return ret; + if (of_device_is_compatible(node, "fsl,imx8mn-isi") && fie.width > 2048) + return -EINVAL; + interval->type = V4L2_FRMIVAL_TYPE_DISCRETE; interval->discrete = fie.interval; @@ -1467,6 +1477,7 @@ static int mxc_isi_subdev_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_format *fmt) { struct mxc_isi_dev *mxc_isi = v4l2_get_subdevdata(sd); + struct device_node *node = mxc_isi->pdev->dev.of_node; struct v4l2_mbus_framefmt *mf = &fmt->format; struct mxc_isi_frame *dst_f = &mxc_isi->isi_cap.dst_f; struct mxc_isi_fmt *out_fmt; @@ -1486,6 +1497,9 @@ static int mxc_isi_subdev_set_fmt(struct v4l2_subdev *sd, return -EINVAL; } + if (of_device_is_compatible(node, "fsl,imx8mn-isi") && mf->width > 2048) + return -EINVAL; + mutex_lock(&mxc_isi->lock); /* update out put frame size and formate */ dst_f->fmt = &mxc_isi_out_formats[i]; -- 2.17.1