diff options
Diffstat (limited to 'drivers/staging/media/imx/imx8-isi-cap.c')
-rw-r--r-- | drivers/staging/media/imx/imx8-isi-cap.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/staging/media/imx/imx8-isi-cap.c b/drivers/staging/media/imx/imx8-isi-cap.c index cbf82bae0eaf..662780bfbb76 100644 --- a/drivers/staging/media/imx/imx8-isi-cap.c +++ b/drivers/staging/media/imx/imx8-isi-cap.c @@ -166,7 +166,8 @@ struct mxc_isi_fmt *mxc_isi_get_src_fmt(struct v4l2_subdev_format *sd_fmt) if (sd_fmt->format.code == MEDIA_BUS_FMT_YUYV8_1X16 || sd_fmt->format.code == MEDIA_BUS_FMT_YVYU8_2X8 || sd_fmt->format.code == MEDIA_BUS_FMT_AYUV8_1X32 || - sd_fmt->format.code == MEDIA_BUS_FMT_UYVY8_2X8) + sd_fmt->format.code == MEDIA_BUS_FMT_UYVY8_2X8 || + sd_fmt->format.code == MEDIA_BUS_FMT_YUYV8_2X8) index = 1; else index = 0; @@ -1134,6 +1135,7 @@ static int mxc_isi_cap_enum_framesizes(struct file *file, void *priv, struct v4l2_frmsizeenum *fsize) { struct mxc_isi_cap_dev *isi_cap = video_drvdata(file); + struct device_node *parent; struct v4l2_subdev *sd; struct mxc_isi_fmt *fmt; struct v4l2_subdev_frame_size_enum fse = { @@ -1157,6 +1159,11 @@ static int mxc_isi_cap_enum_framesizes(struct file *file, void *priv, if (ret) return ret; + parent = of_get_parent(isi_cap->pdev->dev.of_node); + if ((of_device_is_compatible(parent, "fsl,imx8mn-isi")) && + (fse.max_width > ISI_2K || fse.min_width > ISI_2K)) + return -EINVAL; + if (fse.min_width == fse.max_width && fse.min_height == fse.max_height) { fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE; @@ -1180,6 +1187,7 @@ static int mxc_isi_cap_enum_frameintervals(struct file *file, void *fh, struct v4l2_frmivalenum *interval) { struct mxc_isi_cap_dev *isi_cap = video_drvdata(file); + struct device_node *parent; struct v4l2_subdev *sd; struct mxc_isi_fmt *fmt; struct v4l2_subdev_frame_interval_enum fie = { @@ -1203,6 +1211,11 @@ static int mxc_isi_cap_enum_frameintervals(struct file *file, void *fh, if (ret) return ret; + parent = of_get_parent(isi_cap->pdev->dev.of_node); + if (of_device_is_compatible(parent, "fsl,imx8mn-isi") && + fie.width > ISI_2K) + return -EINVAL; + interval->type = V4L2_FRMIVAL_TYPE_DISCRETE; interval->discrete = fie.interval; @@ -1353,6 +1366,7 @@ static int mxc_isi_subdev_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_format *fmt) { struct mxc_isi_cap_dev *isi_cap = v4l2_get_subdevdata(sd); + struct device_node *parent; struct v4l2_mbus_framefmt *mf = &fmt->format; struct mxc_isi_frame *dst_f = &isi_cap->dst_f; struct mxc_isi_fmt *out_fmt; @@ -1373,6 +1387,11 @@ static int mxc_isi_subdev_set_fmt(struct v4l2_subdev *sd, return -EINVAL; } + parent = of_get_parent(isi_cap->pdev->dev.of_node); + if (of_device_is_compatible(parent, "fsl,imx8mn-isi") && + mf->width > ISI_2K) + return -EINVAL; + mutex_lock(&isi_cap->lock); /* update out put frame size and formate */ dst_f->fmt = &mxc_isi_out_formats[i]; |