This would allow apps to enumerate the supported MBUS formats available on a certain pad. Signed-off-by: Laurentiu Palcu <laurentiu.palcu@xxxxxxxxxxx> --- drivers/staging/media/max96712/max96712.c | 142 ++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index a078e4c67c360..d735798effa5c 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -199,6 +199,107 @@ struct max96712_priv { enum max96712_pattern pattern; }; +struct max96712_format_info { + u32 code; + u8 data_type; +}; + +static const struct max96712_format_info max96712_formats[] = { + /* YUV formats */ + { + .code = MEDIA_BUS_FMT_UYVY8_1X16, + .data_type = MIPI_CSI2_DT_YUV422_8B, + }, { + .code = MEDIA_BUS_FMT_VYUY8_1X16, + .data_type = MIPI_CSI2_DT_YUV422_8B, + }, { + .code = MEDIA_BUS_FMT_YUYV8_1X16, + .data_type = MIPI_CSI2_DT_YUV422_8B, + }, { + .code = MEDIA_BUS_FMT_YVYU8_1X16, + .data_type = MIPI_CSI2_DT_YUV422_8B, + }, { + .code = MEDIA_BUS_FMT_UYVY10_1X20, + .data_type = MIPI_CSI2_DT_YUV422_10B, + }, { + .code = MEDIA_BUS_FMT_VYUY10_1X20, + .data_type = MIPI_CSI2_DT_YUV422_10B, + }, { + .code = MEDIA_BUS_FMT_YUYV10_1X20, + .data_type = MIPI_CSI2_DT_YUV422_10B, + }, { + .code = MEDIA_BUS_FMT_YVYU10_1X20, + .data_type = MIPI_CSI2_DT_YUV422_10B, + }, + /* RGB formats */ + { + .code = MEDIA_BUS_FMT_RGB565_1X16, + .data_type = MIPI_CSI2_DT_RGB565, + }, { + .code = MEDIA_BUS_FMT_BGR888_1X24, + .data_type = MIPI_CSI2_DT_RGB888, + }, { + .code = MEDIA_BUS_FMT_RGB888_1X24, + .data_type = MIPI_CSI2_DT_RGB888, + }, { + .code = MEDIA_BUS_FMT_RBG888_1X24, + .data_type = MIPI_CSI2_DT_RGB888, + }, { + .code = MEDIA_BUS_FMT_GBR888_1X24, + .data_type = MIPI_CSI2_DT_RGB888, + }, + /* RAW formats */ + { + .code = MEDIA_BUS_FMT_SBGGR8_1X8, + .data_type = MIPI_CSI2_DT_RAW8, + }, { + .code = MEDIA_BUS_FMT_SGBRG8_1X8, + .data_type = MIPI_CSI2_DT_RAW8, + }, { + .code = MEDIA_BUS_FMT_SGRBG8_1X8, + .data_type = MIPI_CSI2_DT_RAW8, + }, { + .code = MEDIA_BUS_FMT_SRGGB8_1X8, + .data_type = MIPI_CSI2_DT_RAW8, + }, { + .code = MEDIA_BUS_FMT_SBGGR12_1X12, + .data_type = MIPI_CSI2_DT_RAW12, + }, { + .code = MEDIA_BUS_FMT_SGBRG12_1X12, + .data_type = MIPI_CSI2_DT_RAW12, + }, { + .code = MEDIA_BUS_FMT_SGRBG12_1X12, + .data_type = MIPI_CSI2_DT_RAW12, + }, { + .code = MEDIA_BUS_FMT_SRGGB12_1X12, + .data_type = MIPI_CSI2_DT_RAW12, + }, { + .code = MEDIA_BUS_FMT_SBGGR14_1X14, + .data_type = MIPI_CSI2_DT_RAW14, + }, { + .code = MEDIA_BUS_FMT_SGBRG14_1X14, + .data_type = MIPI_CSI2_DT_RAW14, + }, { + .code = MEDIA_BUS_FMT_SGRBG14_1X14, + .data_type = MIPI_CSI2_DT_RAW14, + }, { + .code = MEDIA_BUS_FMT_SRGGB14_1X14, + .data_type = MIPI_CSI2_DT_RAW14, + }, { + .code = MEDIA_BUS_FMT_SBGGR16_1X16, + .data_type = MIPI_CSI2_DT_RAW16, + }, { + .code = MEDIA_BUS_FMT_SGBRG16_1X16, + .data_type = MIPI_CSI2_DT_RAW16, + }, { + .code = MEDIA_BUS_FMT_SGRBG16_1X16, + .data_type = MIPI_CSI2_DT_RAW16, + }, { + .code = MEDIA_BUS_FMT_SRGGB16_1X16, + .data_type = MIPI_CSI2_DT_RAW16, + }, +}; + static inline bool max96712_pad_is_sink(u32 pad) { return pad < MAX96712_FIRST_SOURCE_PAD || pad == MAX96712_VPG_PAD; @@ -379,6 +480,46 @@ static void max96712_pattern_enable(struct max96712_priv *priv, bool enable) } } +static int max96712_enum_mbus_code(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_mbus_code_enum *code) +{ + if (code->pad > MAX96712_VPG_PAD) + return -EINVAL; + + if (max96712_pad_is_source(code->pad)) { + struct v4l2_mbus_framefmt *fmt; + + if (code->index > 0) + return -EINVAL; + + fmt = v4l2_subdev_state_get_opposite_stream_format(sd_state, code->pad, + code->stream); + if (!fmt) + return -EINVAL; + + code->code = fmt->code; + + return 0; + } + + /* Internal VPG pad only supprts RGB888 */ + if (code->pad == MAX96712_VPG_PAD) { + if (code->index > 0) + return -EINVAL; + + code->code = MEDIA_BUS_FMT_RGB888_1X24; + + return 0; + } + + if (code->index >= ARRAY_SIZE(max96712_formats)) + return -EINVAL; + + code->code = max96712_formats[code->index].code; + + return 0; +} + static int max96712_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad, struct v4l2_mbus_frame_desc *fd) { @@ -547,6 +688,7 @@ static const struct v4l2_subdev_internal_ops max96712_internal_ops = { }; static const struct v4l2_subdev_pad_ops max96712_pad_ops = { + .enum_mbus_code = max96712_enum_mbus_code, .get_fmt = v4l2_subdev_get_fmt, .set_fmt = v4l2_subdev_get_fmt, .enable_streams = max96712_enable_streams, -- 2.44.1