| From 5d4a4a0ca1b0133dcb784cd8d3ae65b4ed1c6feb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 25 Oct 2021 09:06:52 +0100 |
| Subject: media: atomisp: fix enum formats logic |
| |
| From: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| |
| [ Upstream commit fae46cb0531b45c789e39128f676f2bafa3a7b47 ] |
| |
| Changeset 374d62e7aa50 ("media: v4l2-subdev: Verify v4l2_subdev_call() pad config argument") |
| added an extra verification for a pads parameter for enum mbus |
| format code. |
| |
| Such change broke atomisp, because now the V4L2 core |
| refuses to enum MBUS formats if the state is empty. |
| |
| So, add .which field in order to select the active formats, |
| in order to make it work again. |
| |
| While here, improve error messages. |
| |
| Fixes: 374d62e7aa50 ("media: v4l2-subdev: Verify v4l2_subdev_call() pad config argument") |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../staging/media/atomisp/pci/atomisp_ioctl.c | 23 ++++++++++++++----- |
| 1 file changed, 17 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c |
| index 35717a91cbd15..830df02626634 100644 |
| --- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c |
| +++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c |
| @@ -773,7 +773,10 @@ static int atomisp_enum_fmt_cap(struct file *file, void *fh, |
| struct video_device *vdev = video_devdata(file); |
| struct atomisp_device *isp = video_get_drvdata(vdev); |
| struct atomisp_sub_device *asd = atomisp_to_video_pipe(vdev)->asd; |
| - struct v4l2_subdev_mbus_code_enum code = { 0 }; |
| + struct v4l2_subdev_mbus_code_enum code = { |
| + .which = V4L2_SUBDEV_FORMAT_ACTIVE, |
| + }; |
| + struct v4l2_subdev *camera; |
| unsigned int i, fi = 0; |
| int rval; |
| |
| @@ -783,14 +786,20 @@ static int atomisp_enum_fmt_cap(struct file *file, void *fh, |
| return -EINVAL; |
| } |
| |
| + camera = isp->inputs[asd->input_curr].camera; |
| + if(!camera) { |
| + dev_err(isp->dev, "%s(): camera is NULL, device is %s\n", |
| + __func__, vdev->name); |
| + return -EINVAL; |
| + } |
| + |
| rt_mutex_lock(&isp->mutex); |
| - rval = v4l2_subdev_call(isp->inputs[asd->input_curr].camera, pad, |
| - enum_mbus_code, NULL, &code); |
| + |
| + rval = v4l2_subdev_call(camera, pad, enum_mbus_code, NULL, &code); |
| if (rval == -ENOIOCTLCMD) { |
| dev_warn(isp->dev, |
| - "enum_mbus_code pad op not supported. Please fix your sensor driver!\n"); |
| - // rval = v4l2_subdev_call(isp->inputs[asd->input_curr].camera, |
| - // video, enum_mbus_fmt, 0, &code.code); |
| + "enum_mbus_code pad op not supported by %s. Please fix your sensor driver!\n", |
| + camera->name); |
| } |
| rt_mutex_unlock(&isp->mutex); |
| |
| @@ -820,6 +829,8 @@ static int atomisp_enum_fmt_cap(struct file *file, void *fh, |
| f->pixelformat = format->pixelformat; |
| return 0; |
| } |
| + dev_err(isp->dev, "%s(): format for code %x not found.\n", |
| + __func__, code.code); |
| |
| return -EINVAL; |
| } |
| -- |
| 2.34.1 |
| |