Hi Jacopo, Thank you for the patch. On Mon, Feb 21, 2022 at 12:04:36PM +0100, Jacopo Mondi wrote: > Due to how pixel components are transmitted on the CSI-2 serial bus > and how they are deserialized by the CSI-2 receiver, the component > ordering might change and the image formats on the sink and source pads > of the receiver should reflect it. > > For RGB24, in example, the component ordering on the wire as described by > the CSI-2 specification matches the BGR888 format, while once > deserialized by the CSIS receiver it matches the RGB888 format. > > Add an additional .output field to struct csis_pix_format to allow > propagating the correct format to the source pad after a format > configuration on the sink. > > The change is only relevant for RGB24 but paves the way for further > format translations in future. > > Signed-off-by: Jacopo Mondi <jacopo@xxxxxxxxxx> Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > --- > drivers/media/platform/imx/imx-mipi-csis.c | 26 ++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/drivers/media/platform/imx/imx-mipi-csis.c b/drivers/media/platform/imx/imx-mipi-csis.c > index a05ab151bebc..6f975b3702bc 100644 > --- a/drivers/media/platform/imx/imx-mipi-csis.c > +++ b/drivers/media/platform/imx/imx-mipi-csis.c > @@ -349,6 +349,7 @@ struct csi_state { > > struct csis_pix_format { > u32 code; > + u32 output; > u32 data_type; > u8 width; > }; > @@ -357,94 +358,116 @@ static const struct csis_pix_format mipi_csis_formats[] = { > /* YUV formats. */ > { > .code = MEDIA_BUS_FMT_UYVY8_1X16, > + .output = MEDIA_BUS_FMT_UYVY8_1X16, > .data_type = MIPI_CSI2_DATA_TYPE_YUV422_8, > .width = 16, > }, > /* RGB formats. */ > { > .code = MEDIA_BUS_FMT_RGB565_1X16, > + .output = MEDIA_BUS_FMT_RGB565_1X16, > .data_type = MIPI_CSI2_DATA_TYPE_RGB565, > .width = 16, > }, { > .code = MEDIA_BUS_FMT_BGR888_1X24, > + .output = MEDIA_BUS_FMT_RGB888_1X24, > .data_type = MIPI_CSI2_DATA_TYPE_RGB888, > .width = 24, > }, > /* RAW (Bayer and greyscale) formats. */ > { > .code = MEDIA_BUS_FMT_SBGGR8_1X8, > + .output = MEDIA_BUS_FMT_SBGGR8_1X8, > .data_type = MIPI_CSI2_DATA_TYPE_RAW8, > .width = 8, > }, { > .code = MEDIA_BUS_FMT_SGBRG8_1X8, > + .output = MEDIA_BUS_FMT_SGBRG8_1X8, > .data_type = MIPI_CSI2_DATA_TYPE_RAW8, > .width = 8, > }, { > .code = MEDIA_BUS_FMT_SGRBG8_1X8, > + .output = MEDIA_BUS_FMT_SGRBG8_1X8, > .data_type = MIPI_CSI2_DATA_TYPE_RAW8, > .width = 8, > }, { > .code = MEDIA_BUS_FMT_SRGGB8_1X8, > + .output = MEDIA_BUS_FMT_SRGGB8_1X8, > .data_type = MIPI_CSI2_DATA_TYPE_RAW8, > .width = 8, > }, { > .code = MEDIA_BUS_FMT_Y8_1X8, > + .output = MEDIA_BUS_FMT_Y8_1X8, > .data_type = MIPI_CSI2_DATA_TYPE_RAW8, > .width = 8, > }, { > .code = MEDIA_BUS_FMT_SBGGR10_1X10, > + .output = MEDIA_BUS_FMT_SBGGR10_1X10, > .data_type = MIPI_CSI2_DATA_TYPE_RAW10, > .width = 10, > }, { > .code = MEDIA_BUS_FMT_SGBRG10_1X10, > + .output = MEDIA_BUS_FMT_SGBRG10_1X10, > .data_type = MIPI_CSI2_DATA_TYPE_RAW10, > .width = 10, > }, { > .code = MEDIA_BUS_FMT_SGRBG10_1X10, > + .output = MEDIA_BUS_FMT_SGRBG10_1X10, > .data_type = MIPI_CSI2_DATA_TYPE_RAW10, > .width = 10, > }, { > .code = MEDIA_BUS_FMT_SRGGB10_1X10, > + .output = MEDIA_BUS_FMT_SRGGB10_1X10, > .data_type = MIPI_CSI2_DATA_TYPE_RAW10, > .width = 10, > }, { > .code = MEDIA_BUS_FMT_Y10_1X10, > + .output = MEDIA_BUS_FMT_Y10_1X10, > .data_type = MIPI_CSI2_DATA_TYPE_RAW10, > .width = 10, > }, { > .code = MEDIA_BUS_FMT_SBGGR12_1X12, > + .output = MEDIA_BUS_FMT_SBGGR12_1X12, > .data_type = MIPI_CSI2_DATA_TYPE_RAW12, > .width = 12, > }, { > .code = MEDIA_BUS_FMT_SGBRG12_1X12, > + .output = MEDIA_BUS_FMT_SGBRG12_1X12, > .data_type = MIPI_CSI2_DATA_TYPE_RAW12, > .width = 12, > }, { > .code = MEDIA_BUS_FMT_SGRBG12_1X12, > + .output = MEDIA_BUS_FMT_SGRBG12_1X12, > .data_type = MIPI_CSI2_DATA_TYPE_RAW12, > .width = 12, > }, { > .code = MEDIA_BUS_FMT_SRGGB12_1X12, > + .output = MEDIA_BUS_FMT_SRGGB12_1X12, > .data_type = MIPI_CSI2_DATA_TYPE_RAW12, > .width = 12, > }, { > .code = MEDIA_BUS_FMT_Y12_1X12, > + .output = MEDIA_BUS_FMT_Y12_1X12, > .data_type = MIPI_CSI2_DATA_TYPE_RAW12, > .width = 12, > }, { > .code = MEDIA_BUS_FMT_SBGGR14_1X14, > + .output = MEDIA_BUS_FMT_SBGGR14_1X14, > .data_type = MIPI_CSI2_DATA_TYPE_RAW14, > .width = 14, > }, { > .code = MEDIA_BUS_FMT_SGBRG14_1X14, > + .output = MEDIA_BUS_FMT_SGBRG14_1X14, > .data_type = MIPI_CSI2_DATA_TYPE_RAW14, > .width = 14, > }, { > .code = MEDIA_BUS_FMT_SGRBG14_1X14, > + .output = MEDIA_BUS_FMT_SGRBG14_1X14, > .data_type = MIPI_CSI2_DATA_TYPE_RAW14, > .width = 14, > }, { > .code = MEDIA_BUS_FMT_SRGGB14_1X14, > + .output = MEDIA_BUS_FMT_SRGGB14_1X14, > .data_type = MIPI_CSI2_DATA_TYPE_RAW14, > .width = 14, > } > @@ -1103,6 +1126,9 @@ static int mipi_csis_set_fmt(struct v4l2_subdev *sd, > CSIS_PAD_SOURCE); > *fmt = sdformat->format; > > + /* The format on the source pad might change due to unpacking. */ > + fmt->code = csis_fmt->output; > + > /* Store the CSIS format descriptor for active formats. */ > if (sdformat->which == V4L2_SUBDEV_FORMAT_ACTIVE) > state->csis_fmt = csis_fmt; -- Regards, Laurent Pinchart