2020-11-24 15:10:38

by Robert Foss

[permalink] [raw]
Subject: [PATCH v1] media: ov8856: Fix Bayer format dependance on mode

The Bayer GRBG10 mode used for earlier modes 3280x2460 and
1640x1232 isn't the mode output by the sensor for the
3264x2448 and 1632x1224 modes.

Switch from MEDIA_BUS_FMT_SGRBG10_1X10 to MEDIA_BUS_FMT_SBGGR10_1X10
for 3264x2448 & 1632x1224 modes.

Signed-off-by: Robert Foss <[email protected]>
---

This patch is sent out after Dongchun Zhu clarified the Bayer
modes used by different sensor configuration in the below thread.

https://lkml.org/lkml/2020/11/24/335

drivers/media/i2c/ov8856.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/media/i2c/ov8856.c b/drivers/media/i2c/ov8856.c
index 2f4ceaa80593..a2dcbece558c 100644
--- a/drivers/media/i2c/ov8856.c
+++ b/drivers/media/i2c/ov8856.c
@@ -1281,8 +1281,13 @@ static void ov8856_update_pad_format(const struct ov8856_mode *mode,
{
fmt->width = mode->width;
fmt->height = mode->height;
- fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10;
fmt->field = V4L2_FIELD_NONE;
+
+ if (mode->reg_list.regs == mode_3264x2448_regs ||
+ mode->reg_list.regs == mode_1632x1224_regs)
+ fmt->code = MEDIA_BUS_FMT_SBGGR10_1X10;
+ else
+ fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10;
}

static int ov8856_start_streaming(struct ov8856 *ov8856)
--
2.27.0


2020-11-24 17:17:56

by Sakari Ailus

[permalink] [raw]
Subject: Re: [PATCH v1] media: ov8856: Fix Bayer format dependance on mode

Hi Robert,

On Tue, Nov 24, 2020 at 04:03:32PM +0100, Robert Foss wrote:
> The Bayer GRBG10 mode used for earlier modes 3280x2460 and
> 1640x1232 isn't the mode output by the sensor for the
> 3264x2448 and 1632x1224 modes.
>
> Switch from MEDIA_BUS_FMT_SGRBG10_1X10 to MEDIA_BUS_FMT_SBGGR10_1X10
> for 3264x2448 & 1632x1224 modes.
>
> Signed-off-by: Robert Foss <[email protected]>
> ---
>
> This patch is sent out after Dongchun Zhu clarified the Bayer
> modes used by different sensor configuration in the below thread.
>
> https://lkml.org/lkml/2020/11/24/335
>
> drivers/media/i2c/ov8856.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/i2c/ov8856.c b/drivers/media/i2c/ov8856.c
> index 2f4ceaa80593..a2dcbece558c 100644
> --- a/drivers/media/i2c/ov8856.c
> +++ b/drivers/media/i2c/ov8856.c
> @@ -1281,8 +1281,13 @@ static void ov8856_update_pad_format(const struct ov8856_mode *mode,
> {
> fmt->width = mode->width;
> fmt->height = mode->height;
> - fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10;
> fmt->field = V4L2_FIELD_NONE;
> +
> + if (mode->reg_list.regs == mode_3264x2448_regs ||
> + mode->reg_list.regs == mode_1632x1224_regs)
> + fmt->code = MEDIA_BUS_FMT_SBGGR10_1X10;
> + else
> + fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10;
> }
>
> static int ov8856_start_streaming(struct ov8856 *ov8856)

Could you instead add the mode information to the ov8856_mode struct?

Also enum_mbus_code needs to be updated.

The mbus code also has priority in mode selection, thus only the modes for
the selected mbus code should considered in set_fmt.

--
Regards,

Sakari Ailus