summaryrefslogtreecommitdiff
path: root/drivers/staging/media/imx/imx8-isi-cap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/media/imx/imx8-isi-cap.c')
-rw-r--r--drivers/staging/media/imx/imx8-isi-cap.c21
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];