@@ -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,
This would allow apps to enumerate the supported MBUS formats available on a certain pad. Signed-off-by: Laurentiu Palcu <laurentiu.palcu@oss.nxp.com> --- drivers/staging/media/max96712/max96712.c | 142 ++++++++++++++++++++++ 1 file changed, 142 insertions(+)