[PATCH v3 7/7] media: imx: imx-mipi-csis: Add output format
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Feb 21 03:56:03 PST 2022
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 at jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> 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
More information about the linux-arm-kernel
mailing list