From 9409e07a0110d8ea0f1a89df5f9b767106b935e6 Mon Sep 17 00:00:00 2001 From: Jianwei Fan Date: Thu, 24 Nov 2022 08:43:46 +0000 Subject: [PATCH] media: rockchip: cif: add BGR888 format support Change-Id: I1368917d0899f4f972c9ea3548b01dd9b9d1d6e8 Signed-off-by: Jianwei Fan --- drivers/media/platform/rockchip/cif/capture.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 2f5cd3d3b2fa..740e3dab25d1 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -149,6 +149,13 @@ static const struct cif_output_fmt out_fmts[] = { .bpp = { 24 }, .csi_fmt_val = CSI_WRDDR_TYPE_RGB888, .fmt_type = CIF_FMT_TYPE_RAW, + }, { + .fourcc = V4L2_PIX_FMT_BGR24, + .cplanes = 1, + .mplanes = 1, + .bpp = { 24 }, + .csi_fmt_val = CSI_WRDDR_TYPE_RGB888, + .fmt_type = CIF_FMT_TYPE_RAW, }, { .fourcc = V4L2_PIX_FMT_RGB565, .cplanes = 1, @@ -476,6 +483,10 @@ static const struct cif_input_fmt in_fmts[] = { .mbus_code = MEDIA_BUS_FMT_RGB888_1X24, .csi_fmt_val = CSI_WRDDR_TYPE_RGB888, .field = V4L2_FIELD_NONE, + }, { + .mbus_code = MEDIA_BUS_FMT_BGR888_1X24, + .csi_fmt_val = CSI_WRDDR_TYPE_RGB888, + .field = V4L2_FIELD_NONE, }, { .mbus_code = MEDIA_BUS_FMT_RGB565_1X16, .csi_fmt_val = CSI_WRDDR_TYPE_RGB565, @@ -630,6 +641,7 @@ static unsigned char get_data_type(u32 pixelformat, u8 cmd_mode_en, u8 dsi_input case MEDIA_BUS_FMT_YVYU8_2X8: return 0x1e; case MEDIA_BUS_FMT_RGB888_1X24: + case MEDIA_BUS_FMT_BGR888_1X24: if (dsi_input) { if (cmd_mode_en) /* dsi command mode*/ return 0x39; @@ -3002,6 +3014,7 @@ static int rkcif_csi_get_output_type_mask(struct rkcif_stream *stream) mask = CSI_WRDDR_TYPE_YUV_PACKET | CSI_YUV_OUTPUT_ORDER_VYUY; break; case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_BGR24: case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_BGR666: mask = CSI_WRDDR_TYPE_RAW_COMPACT; @@ -3086,6 +3099,7 @@ static int rkcif_lvds_get_output_type_mask(struct rkcif_stream *stream) (CSI_YUV_OUTPUT_ORDER_VYUY << yuvout_offset); break; case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_BGR24: case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_BGR666: mask = CSI_WRDDR_TYPE_RAW_COMPACT << wr_type_offset; @@ -3875,7 +3889,8 @@ static int rkcif_create_dummy_buf(struct rkcif_stream *stream) if (tmp_dev->terminal_sensor.sd) { input_fmt = get_input_fmt(tmp_dev->terminal_sensor.sd, &rect, i, &csi_info); - if (input_fmt && input_fmt->mbus_code == MEDIA_BUS_FMT_RGB888_1X24) + if (input_fmt && (input_fmt->mbus_code == MEDIA_BUS_FMT_RGB888_1X24 || + input_fmt->mbus_code == MEDIA_BUS_FMT_BGR888_1X24)) size = rect.width * rect.height * 3; else size = rect.width * rect.height * 2; @@ -4375,6 +4390,7 @@ static u32 rkcif_align_bits_per_pixel(struct rkcif_stream *stream, bpp = fmt->bpp[plane_index + 1]; break; case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_BGR24: case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_BGR666: case V4L2_PIX_FMT_SRGGB8: @@ -4679,6 +4695,7 @@ static int rkcif_dvp_get_output_type_mask(struct rkcif_stream *stream) (CSI_YUV_OUTPUT_ORDER_VYUY << 1); break; case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_BGR24: case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_BGR666: mask = CSI_WRDDR_TYPE_RAW_COMPACT << 11;