The RWPF source pad media bus code can only be different from the sink
pad code when enabling color space conversion, which can only convert
between RGB and YUV. If the sink pad code is HSV, no conversion is
possible. Fix the pad set format handler to reflect this hardware
limitation.

Signed-off-by: Laurent Pinchart <laurent.pinchart+rene...@ideasonboard.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen+rene...@ideasonboard.com>
---
 drivers/media/platform/renesas/vsp1/vsp1_rwpf.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c 
b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
index 9d38203e73d0..1b4bac7b7cfa 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
@@ -76,11 +76,20 @@ static int vsp1_rwpf_set_format(struct v4l2_subdev *subdev,
        format = v4l2_subdev_state_get_format(state, fmt->pad);
 
        if (fmt->pad == RWPF_PAD_SOURCE) {
+               const struct v4l2_mbus_framefmt *sink_format =
+                       v4l2_subdev_state_get_format(state, RWPF_PAD_SINK);
+
                /*
                 * The RWPF performs format conversion but can't scale, only the
-                * format code can be changed on the source pad.
+                * format code can be changed on the source pad when converting
+                * between RGB and YUV.
                 */
-               format->code = fmt->format.code;
+               if (sink_format->code != MEDIA_BUS_FMT_AHSV8888_1X32 &&
+                   fmt->format.code != MEDIA_BUS_FMT_AHSV8888_1X32)
+                       format->code = fmt->format.code;
+               else
+                       format->code = sink_format->code;
+
                fmt->format = *format;
                goto done;
        }
-- 
Regards,

Laurent Pinchart

Reply via email to