MLK-22130: media: ISI: Return error when the output width more than 2048
authorGuoniu.Zhou <guoniu.zhou@nxp.com>
Fri, 28 Jun 2019 09:36:25 +0000 (17:36 +0800)
committerGuoniu.Zhou <guoniu.zhou@nxp.com>
Wed, 7 Aug 2019 06:29:03 +0000 (14:29 +0800)
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 <guoniu.zhou@nxp.com>
drivers/media/platform/imx8/mxc-isi-cap.c

index 7935e49..f81b2d7 100644 (file)
@@ -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];