On Wed Jun 11 19:37:16 2025 +0100, Dave Stevenson wrote:
> When calling tc358743_set_fmt, the code was calling tc358743_get_fmt
> to choose a valid format. However that sets the colorspace
> based on information read back from the chip, not the colour
> format requested.
> 
> The result was that if you called try or set format for UYVY
> when the current format was RGB3 then you would get told SRGB,
> and try RGB3 when current was UYVY and you would get told
> SMPTE170M.
> 
> The value programmed in the VI_REP register for the colorspace
> is always set by this driver, therefore there is no need to read
> back the value, and never set to REC709.
> Return the colorspace based on the format set/tried instead.
> 
> Signed-off-by: Dave Stevenson <dave.steven...@raspberrypi.com>
> Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/i2c/tc358743.c | 44 +++++++++++++++++---------------------------
 1 file changed, 17 insertions(+), 27 deletions(-)

---

diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c
index 4d3dc61a9b8b..37ebc760f73b 100644
--- a/drivers/media/i2c/tc358743.c
+++ b/drivers/media/i2c/tc358743.c
@@ -1708,12 +1708,23 @@ static int tc358743_enum_mbus_code(struct v4l2_subdev 
*sd,
        return 0;
 }
 
+static u32 tc358743_g_colorspace(u32 code)
+{
+       switch (code) {
+       case MEDIA_BUS_FMT_RGB888_1X24:
+               return V4L2_COLORSPACE_SRGB;
+       case MEDIA_BUS_FMT_UYVY8_1X16:
+               return V4L2_COLORSPACE_SMPTE170M;
+       default:
+               return 0;
+       }
+}
+
 static int tc358743_get_fmt(struct v4l2_subdev *sd,
                struct v4l2_subdev_state *sd_state,
                struct v4l2_subdev_format *format)
 {
        struct tc358743_state *state = to_state(sd);
-       u8 vi_rep = i2c_rd8(sd, VI_REP);
 
        if (format->pad != 0)
                return -EINVAL;
@@ -1723,23 +1734,7 @@ static int tc358743_get_fmt(struct v4l2_subdev *sd,
        format->format.height = state->timings.bt.height;
        format->format.field = V4L2_FIELD_NONE;
 
-       switch (vi_rep & MASK_VOUT_COLOR_SEL) {
-       case MASK_VOUT_COLOR_RGB_FULL:
-       case MASK_VOUT_COLOR_RGB_LIMITED:
-               format->format.colorspace = V4L2_COLORSPACE_SRGB;
-               break;
-       case MASK_VOUT_COLOR_601_YCBCR_LIMITED:
-       case MASK_VOUT_COLOR_601_YCBCR_FULL:
-               format->format.colorspace = V4L2_COLORSPACE_SMPTE170M;
-               break;
-       case MASK_VOUT_COLOR_709_YCBCR_FULL:
-       case MASK_VOUT_COLOR_709_YCBCR_LIMITED:
-               format->format.colorspace = V4L2_COLORSPACE_REC709;
-               break;
-       default:
-               format->format.colorspace = 0;
-               break;
-       }
+       format->format.colorspace = tc358743_g_colorspace(format->format.code);
 
        return 0;
 }
@@ -1753,19 +1748,14 @@ static int tc358743_set_fmt(struct v4l2_subdev *sd,
        u32 code = format->format.code; /* is overwritten by get_fmt */
        int ret = tc358743_get_fmt(sd, sd_state, format);
 
-       format->format.code = code;
+       if (code == MEDIA_BUS_FMT_RGB888_1X24 ||
+           code == MEDIA_BUS_FMT_UYVY8_1X16)
+               format->format.code = code;
+       format->format.colorspace = tc358743_g_colorspace(format->format.code);
 
        if (ret)
                return ret;
 
-       switch (code) {
-       case MEDIA_BUS_FMT_RGB888_1X24:
-       case MEDIA_BUS_FMT_UYVY8_1X16:
-               break;
-       default:
-               return -EINVAL;
-       }
-
        if (format->which == V4L2_SUBDEV_FORMAT_TRY)
                return 0;
 

Reply via email to