media: qcom: camss: Attach formats to VFE resources
authorRadoslav Tsvetkov <quic_rtsvetko@quicinc.com>
Wed, 22 May 2024 15:46:53 +0000 (18:46 +0300)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Sat, 29 Jun 2024 10:20:04 +0000 (12:20 +0200)
Video node formats have direct dependency by the sub-device pad formats.
Remove dependency for SoC version and move format definitions in device
which creates video node.

This commit attaches a struct to the VFE resources that holds format
description, so it is much easier to assign them to the video node.
No need to use a switch-case.

NOTE: The mbus_bpp is used to calculate the clock rates and is different
from bpp which is the bits per pixel written to memory. We need to keep
both values to not break the calcualtions.

Signed-off-by: Radoslav Tsvetkov <quic_rtsvetko@quicinc.com>
Signed-off-by: Gjorgji Rosikopulos <quic_grosikop@quicinc.com>
Acked-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/qcom/camss/camss-format.h [new file with mode: 0644]
drivers/media/platform/qcom/camss/camss-vfe.c
drivers/media/platform/qcom/camss/camss-vfe.h
drivers/media/platform/qcom/camss/camss-video.c
drivers/media/platform/qcom/camss/camss-video.h
drivers/media/platform/qcom/camss/camss.c
drivers/media/platform/qcom/camss/camss.h

diff --git a/drivers/media/platform/qcom/camss/camss-format.h b/drivers/media/platform/qcom/camss/camss-format.h
new file mode 100644 (file)
index 0000000..e0231ca
--- /dev/null
@@ -0,0 +1,57 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * camss-format.h
+ *
+ * Qualcomm MSM Camera Subsystem - Format helpers
+ *
+ * Copyright (c) 2023, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Technologies, Inc.
+ */
+#ifndef __CAMSS_FORMAT_H__
+#define __CAMSS_FORMAT_H__
+
+#include <linux/types.h>
+
+#define PER_PLANE_DATA(plane, h_fract_num, h_fract_den, v_fract_num, v_fract_den, _bpp)         \
+       .hsub[(plane)].numerator        = (h_fract_num),                                        \
+       .hsub[(plane)].denominator      = (h_fract_den),                                        \
+       .vsub[(plane)].numerator        = (v_fract_num),                                        \
+       .vsub[(plane)].denominator      = (v_fract_den),                                        \
+       .bpp[(plane)]                   = (_bpp)
+
+/*
+ * struct fract - Represents a fraction
+ * @numerator: Store the numerator part of the fraction
+ * @denominator: Store the denominator part of the fraction
+ */
+struct fract {
+       u8 numerator;
+       u8 denominator;
+};
+
+/*
+ * struct camss_format_info - ISP media bus format information
+ * @code: V4L2 media bus format code
+ * @mbus_bpp: Media bus bits per pixel
+ * @pixelformat: V4L2 pixel format FCC identifier
+ * @planes: Number of planes
+ * @hsub: Horizontal subsampling (for each plane)
+ * @vsub: Vertical subsampling (for each plane)
+ * @bpp: Bits per pixel when stored in memory (for each plane)
+ */
+struct camss_format_info {
+       u32 code;
+       u32 mbus_bpp;
+       u32 pixelformat;
+       u8 planes;
+       struct fract hsub[3];
+       struct fract vsub[3];
+       unsigned int bpp[3];
+};
+
+struct camss_formats {
+       unsigned int nformats;
+       const struct camss_format_info *formats;
+};
+
+#endif /* __CAMSS_FORMAT_H__ */
index 459c70a4b3199bca67a4316c0cab987ccb3c28c2..2d5a64c055f10a514bbce694e41a7795dbe79cb1 100644 (file)
 
 #define SCALER_RATIO_MAX 16
 
-struct vfe_format {
-       u32 code;
-       u8 bpp;
+static const struct camss_format_info formats_rdi_8x16[] = {
+       { MEDIA_BUS_FMT_UYVY8_1X16, 8, V4L2_PIX_FMT_UYVY, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_VYUY8_1X16, 8, V4L2_PIX_FMT_VYUY, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_YUYV8_1X16, 8, V4L2_PIX_FMT_YUYV, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_YVYU8_1X16, 8, V4L2_PIX_FMT_YVYU, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_SBGGR8_1X8, 8, V4L2_PIX_FMT_SBGGR8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SGBRG8_1X8, 8, V4L2_PIX_FMT_SGBRG8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SGRBG8_1X8, 8, V4L2_PIX_FMT_SGRBG8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SRGGB8_1X8, 8, V4L2_PIX_FMT_SRGGB8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SBGGR10_1X10, 10, V4L2_PIX_FMT_SBGGR10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SGBRG10_1X10, 10, V4L2_PIX_FMT_SGBRG10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SGRBG10_1X10, 10, V4L2_PIX_FMT_SGRBG10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SRGGB10_1X10, 10, V4L2_PIX_FMT_SRGGB10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SBGGR12_1X12, 12, V4L2_PIX_FMT_SBGGR12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SGBRG12_1X12, 12, V4L2_PIX_FMT_SGBRG12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SGRBG12_1X12, 12, V4L2_PIX_FMT_SGRBG12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SRGGB12_1X12, 12, V4L2_PIX_FMT_SRGGB12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_Y10_1X10, 10, V4L2_PIX_FMT_Y10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+};
+
+static const struct camss_format_info formats_rdi_8x96[] = {
+       { MEDIA_BUS_FMT_UYVY8_1X16, 8, V4L2_PIX_FMT_UYVY, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_VYUY8_1X16, 8, V4L2_PIX_FMT_VYUY, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_YUYV8_1X16, 8, V4L2_PIX_FMT_YUYV, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_YVYU8_1X16, 8, V4L2_PIX_FMT_YVYU, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_SBGGR8_1X8, 8, V4L2_PIX_FMT_SBGGR8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SGBRG8_1X8, 8, V4L2_PIX_FMT_SGBRG8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SGRBG8_1X8, 8, V4L2_PIX_FMT_SGRBG8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SRGGB8_1X8, 8, V4L2_PIX_FMT_SRGGB8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SBGGR10_1X10, 10, V4L2_PIX_FMT_SBGGR10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SGBRG10_1X10, 10, V4L2_PIX_FMT_SGBRG10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SGRBG10_1X10, 10, V4L2_PIX_FMT_SGRBG10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SRGGB10_1X10, 10, V4L2_PIX_FMT_SRGGB10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, 16, V4L2_PIX_FMT_SBGGR10, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_SBGGR12_1X12, 12, V4L2_PIX_FMT_SBGGR12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SGBRG12_1X12, 12, V4L2_PIX_FMT_SGBRG12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SGRBG12_1X12, 12, V4L2_PIX_FMT_SGRBG12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SRGGB12_1X12, 12, V4L2_PIX_FMT_SRGGB12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SBGGR14_1X14, 14, V4L2_PIX_FMT_SBGGR14P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 14) },
+       { MEDIA_BUS_FMT_SGBRG14_1X14, 14, V4L2_PIX_FMT_SGBRG14P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 14) },
+       { MEDIA_BUS_FMT_SGRBG14_1X14, 14, V4L2_PIX_FMT_SGRBG14P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 14) },
+       { MEDIA_BUS_FMT_SRGGB14_1X14, 14, V4L2_PIX_FMT_SRGGB14P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 14) },
+       { MEDIA_BUS_FMT_Y10_1X10, 10, V4L2_PIX_FMT_Y10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_Y10_2X8_PADHI_LE, 16, V4L2_PIX_FMT_Y10, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+};
+
+static const struct camss_format_info formats_rdi_845[] = {
+       { MEDIA_BUS_FMT_UYVY8_1X16, 8, V4L2_PIX_FMT_UYVY, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_VYUY8_1X16, 8, V4L2_PIX_FMT_VYUY, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_YUYV8_1X16, 8, V4L2_PIX_FMT_YUYV, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_YVYU8_1X16, 8, V4L2_PIX_FMT_YVYU, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_SBGGR8_1X8, 8, V4L2_PIX_FMT_SBGGR8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SGBRG8_1X8, 8, V4L2_PIX_FMT_SGBRG8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SGRBG8_1X8, 8, V4L2_PIX_FMT_SGRBG8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SRGGB8_1X8, 8, V4L2_PIX_FMT_SRGGB8, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_SBGGR10_1X10, 10, V4L2_PIX_FMT_SBGGR10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SGBRG10_1X10, 10, V4L2_PIX_FMT_SGBRG10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SGRBG10_1X10, 10, V4L2_PIX_FMT_SGRBG10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SRGGB10_1X10, 10, V4L2_PIX_FMT_SRGGB10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, 16, V4L2_PIX_FMT_SBGGR10, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_SBGGR12_1X12, 12, V4L2_PIX_FMT_SBGGR12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SGBRG12_1X12, 12, V4L2_PIX_FMT_SGBRG12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SGRBG12_1X12, 12, V4L2_PIX_FMT_SGRBG12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SRGGB12_1X12, 12, V4L2_PIX_FMT_SRGGB12P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 12) },
+       { MEDIA_BUS_FMT_SBGGR14_1X14, 14, V4L2_PIX_FMT_SBGGR14P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 14) },
+       { MEDIA_BUS_FMT_SGBRG14_1X14, 14, V4L2_PIX_FMT_SGBRG14P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 14) },
+       { MEDIA_BUS_FMT_SGRBG14_1X14, 14, V4L2_PIX_FMT_SGRBG14P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 14) },
+       { MEDIA_BUS_FMT_SRGGB14_1X14, 14, V4L2_PIX_FMT_SRGGB14P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 14) },
+       { MEDIA_BUS_FMT_Y8_1X8, 8, V4L2_PIX_FMT_GREY, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 8) },
+       { MEDIA_BUS_FMT_Y10_1X10, 10, V4L2_PIX_FMT_Y10P, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 10) },
+       { MEDIA_BUS_FMT_Y10_2X8_PADHI_LE, 16, V4L2_PIX_FMT_Y10, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+};
+
+static const struct camss_format_info formats_pix_8x16[] = {
+       { MEDIA_BUS_FMT_YUYV8_1_5X8, 8, V4L2_PIX_FMT_NV12, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_YVYU8_1_5X8, 8, V4L2_PIX_FMT_NV12, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_UYVY8_1_5X8, 8, V4L2_PIX_FMT_NV12, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_VYUY8_1_5X8, 8, V4L2_PIX_FMT_NV12, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_YUYV8_1_5X8, 8, V4L2_PIX_FMT_NV21, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_YVYU8_1_5X8, 8, V4L2_PIX_FMT_NV21, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_UYVY8_1_5X8, 8, V4L2_PIX_FMT_NV21, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_VYUY8_1_5X8, 8, V4L2_PIX_FMT_NV21, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_YUYV8_1X16, 8, V4L2_PIX_FMT_NV16, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_YVYU8_1X16, 8, V4L2_PIX_FMT_NV16, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_UYVY8_1X16, 8, V4L2_PIX_FMT_NV16, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_VYUY8_1X16, 8, V4L2_PIX_FMT_NV16, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_YUYV8_1X16, 8, V4L2_PIX_FMT_NV61, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_YVYU8_1X16, 8, V4L2_PIX_FMT_NV61, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_UYVY8_1X16, 8, V4L2_PIX_FMT_NV61, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_VYUY8_1X16, 8, V4L2_PIX_FMT_NV61, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+};
+
+static const struct camss_format_info formats_pix_8x96[] = {
+       { MEDIA_BUS_FMT_YUYV8_1_5X8, 8, V4L2_PIX_FMT_NV12, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_YVYU8_1_5X8, 8, V4L2_PIX_FMT_NV12, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_UYVY8_1_5X8, 8, V4L2_PIX_FMT_NV12, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_VYUY8_1_5X8, 8, V4L2_PIX_FMT_NV12, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_YUYV8_1_5X8, 8, V4L2_PIX_FMT_NV21, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_YVYU8_1_5X8, 8, V4L2_PIX_FMT_NV21, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_UYVY8_1_5X8, 8, V4L2_PIX_FMT_NV21, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_VYUY8_1_5X8, 8, V4L2_PIX_FMT_NV21, 1,
+         PER_PLANE_DATA(0, 1, 1, 2, 3, 8) },
+       { MEDIA_BUS_FMT_YUYV8_1X16, 8, V4L2_PIX_FMT_NV16, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_YVYU8_1X16, 8, V4L2_PIX_FMT_NV16, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_UYVY8_1X16, 8, V4L2_PIX_FMT_NV16, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_VYUY8_1X16, 8, V4L2_PIX_FMT_NV16, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_YUYV8_1X16, 8, V4L2_PIX_FMT_NV61, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_YVYU8_1X16, 8, V4L2_PIX_FMT_NV61, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_UYVY8_1X16, 8, V4L2_PIX_FMT_NV61, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_VYUY8_1X16, 8, V4L2_PIX_FMT_NV61, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 2, 8) },
+       { MEDIA_BUS_FMT_UYVY8_1X16, 8, V4L2_PIX_FMT_UYVY, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_VYUY8_1X16, 8, V4L2_PIX_FMT_VYUY, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_YUYV8_1X16, 8, V4L2_PIX_FMT_YUYV, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+       { MEDIA_BUS_FMT_YVYU8_1X16, 8, V4L2_PIX_FMT_YVYU, 1,
+         PER_PLANE_DATA(0, 1, 1, 1, 1, 16) },
+};
+
+const struct camss_formats vfe_formats_rdi_8x16 = {
+       .nformats = ARRAY_SIZE(formats_rdi_8x16),
+       .formats = formats_rdi_8x16
 };
 
-static const struct vfe_format formats_rdi_8x16[] = {
-       { MEDIA_BUS_FMT_UYVY8_1X16, 8 },
-       { MEDIA_BUS_FMT_VYUY8_1X16, 8 },
-       { MEDIA_BUS_FMT_YUYV8_1X16, 8 },
-       { MEDIA_BUS_FMT_YVYU8_1X16, 8 },
-       { MEDIA_BUS_FMT_SBGGR8_1X8, 8 },
-       { MEDIA_BUS_FMT_SGBRG8_1X8, 8 },
-       { MEDIA_BUS_FMT_SGRBG8_1X8, 8 },
-       { MEDIA_BUS_FMT_SRGGB8_1X8, 8 },
-       { MEDIA_BUS_FMT_SBGGR10_1X10, 10 },
-       { MEDIA_BUS_FMT_SGBRG10_1X10, 10 },
-       { MEDIA_BUS_FMT_SGRBG10_1X10, 10 },
-       { MEDIA_BUS_FMT_SRGGB10_1X10, 10 },
-       { MEDIA_BUS_FMT_SBGGR12_1X12, 12 },
-       { MEDIA_BUS_FMT_SGBRG12_1X12, 12 },
-       { MEDIA_BUS_FMT_SGRBG12_1X12, 12 },
-       { MEDIA_BUS_FMT_SRGGB12_1X12, 12 },
-       { MEDIA_BUS_FMT_Y10_1X10, 10 },
+const struct camss_formats vfe_formats_pix_8x16 = {
+       .nformats = ARRAY_SIZE(formats_pix_8x16),
+       .formats = formats_pix_8x16
 };
 
-static const struct vfe_format formats_pix_8x16[] = {
-       { MEDIA_BUS_FMT_UYVY8_1X16, 8 },
-       { MEDIA_BUS_FMT_VYUY8_1X16, 8 },
-       { MEDIA_BUS_FMT_YUYV8_1X16, 8 },
-       { MEDIA_BUS_FMT_YVYU8_1X16, 8 },
+const struct camss_formats vfe_formats_rdi_8x96 = {
+       .nformats = ARRAY_SIZE(formats_rdi_8x96),
+       .formats = formats_rdi_8x96
 };
 
-static const struct vfe_format formats_rdi_8x96[] = {
-       { MEDIA_BUS_FMT_UYVY8_1X16, 8 },
-       { MEDIA_BUS_FMT_VYUY8_1X16, 8 },
-       { MEDIA_BUS_FMT_YUYV8_1X16, 8 },
-       { MEDIA_BUS_FMT_YVYU8_1X16, 8 },
-       { MEDIA_BUS_FMT_SBGGR8_1X8, 8 },
-       { MEDIA_BUS_FMT_SGBRG8_1X8, 8 },
-       { MEDIA_BUS_FMT_SGRBG8_1X8, 8 },
-       { MEDIA_BUS_FMT_SRGGB8_1X8, 8 },
-       { MEDIA_BUS_FMT_SBGGR10_1X10, 10 },
-       { MEDIA_BUS_FMT_SGBRG10_1X10, 10 },
-       { MEDIA_BUS_FMT_SGRBG10_1X10, 10 },
-       { MEDIA_BUS_FMT_SRGGB10_1X10, 10 },
-       { MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, 16 },
-       { MEDIA_BUS_FMT_SBGGR12_1X12, 12 },
-       { MEDIA_BUS_FMT_SGBRG12_1X12, 12 },
-       { MEDIA_BUS_FMT_SGRBG12_1X12, 12 },
-       { MEDIA_BUS_FMT_SRGGB12_1X12, 12 },
-       { MEDIA_BUS_FMT_SBGGR14_1X14, 14 },
-       { MEDIA_BUS_FMT_SGBRG14_1X14, 14 },
-       { MEDIA_BUS_FMT_SGRBG14_1X14, 14 },
-       { MEDIA_BUS_FMT_SRGGB14_1X14, 14 },
-       { MEDIA_BUS_FMT_Y10_1X10, 10 },
-       { MEDIA_BUS_FMT_Y10_2X8_PADHI_LE, 16 },
+const struct camss_formats vfe_formats_pix_8x96 = {
+       .nformats = ARRAY_SIZE(formats_pix_8x96),
+       .formats = formats_pix_8x96
 };
 
-static const struct vfe_format formats_pix_8x96[] = {
-       { MEDIA_BUS_FMT_UYVY8_1X16, 8 },
-       { MEDIA_BUS_FMT_VYUY8_1X16, 8 },
-       { MEDIA_BUS_FMT_YUYV8_1X16, 8 },
-       { MEDIA_BUS_FMT_YVYU8_1X16, 8 },
+const struct camss_formats vfe_formats_rdi_845 = {
+       .nformats = ARRAY_SIZE(formats_rdi_845),
+       .formats = formats_rdi_845
 };
 
-static const struct vfe_format formats_rdi_845[] = {
-       { MEDIA_BUS_FMT_UYVY8_1X16, 8 },
-       { MEDIA_BUS_FMT_VYUY8_1X16, 8 },
-       { MEDIA_BUS_FMT_YUYV8_1X16, 8 },
-       { MEDIA_BUS_FMT_YVYU8_1X16, 8 },
-       { MEDIA_BUS_FMT_SBGGR8_1X8, 8 },
-       { MEDIA_BUS_FMT_SGBRG8_1X8, 8 },
-       { MEDIA_BUS_FMT_SGRBG8_1X8, 8 },
-       { MEDIA_BUS_FMT_SRGGB8_1X8, 8 },
-       { MEDIA_BUS_FMT_SBGGR10_1X10, 10 },
-       { MEDIA_BUS_FMT_SGBRG10_1X10, 10 },
-       { MEDIA_BUS_FMT_SGRBG10_1X10, 10 },
-       { MEDIA_BUS_FMT_SRGGB10_1X10, 10 },
-       { MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, 16 },
-       { MEDIA_BUS_FMT_SBGGR12_1X12, 12 },
-       { MEDIA_BUS_FMT_SGBRG12_1X12, 12 },
-       { MEDIA_BUS_FMT_SGRBG12_1X12, 12 },
-       { MEDIA_BUS_FMT_SRGGB12_1X12, 12 },
-       { MEDIA_BUS_FMT_SBGGR14_1X14, 14 },
-       { MEDIA_BUS_FMT_SGBRG14_1X14, 14 },
-       { MEDIA_BUS_FMT_SGRBG14_1X14, 14 },
-       { MEDIA_BUS_FMT_SRGGB14_1X14, 14 },
-       { MEDIA_BUS_FMT_Y8_1X8, 8 },
-       { MEDIA_BUS_FMT_Y10_1X10, 10 },
-       { MEDIA_BUS_FMT_Y10_2X8_PADHI_LE, 16 },
+/* TODO: Replace with pix formats */
+const struct camss_formats vfe_formats_pix_845 = {
+       .nformats = ARRAY_SIZE(formats_rdi_845),
+       .formats = formats_rdi_845
 };
 
 /*
@@ -132,18 +286,18 @@ static const struct vfe_format formats_rdi_845[] = {
  *
  * Return number of bits per pixel
  */
-static u8 vfe_get_bpp(const struct vfe_format *formats,
+static u8 vfe_get_bpp(const struct camss_format_info *formats,
                      unsigned int nformats, u32 code)
 {
        unsigned int i;
 
        for (i = 0; i < nformats; i++)
                if (code == formats[i].code)
-                       return formats[i].bpp;
+                       return formats[i].mbus_bpp;
 
        WARN(1, "Unknown format\n");
 
-       return formats[0].bpp;
+       return formats[0].mbus_bpp;
 }
 
 static u32 vfe_find_code(u32 *code, unsigned int n_code,
@@ -1495,32 +1649,12 @@ int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe,
                init_completion(&l->output.sof);
                init_completion(&l->output.reg_update);
 
-               switch (camss->res->version) {
-               case CAMSS_8x16:
-                       if (i == VFE_LINE_PIX) {
-                               l->formats = formats_pix_8x16;
-                               l->nformats = ARRAY_SIZE(formats_pix_8x16);
-                       } else {
-                               l->formats = formats_rdi_8x16;
-                               l->nformats = ARRAY_SIZE(formats_rdi_8x16);
-                       }
-                       break;
-               case CAMSS_8x96:
-               case CAMSS_660:
-                       if (i == VFE_LINE_PIX) {
-                               l->formats = formats_pix_8x96;
-                               l->nformats = ARRAY_SIZE(formats_pix_8x96);
-                       } else {
-                               l->formats = formats_rdi_8x96;
-                               l->nformats = ARRAY_SIZE(formats_rdi_8x96);
-                       }
-                       break;
-               case CAMSS_845:
-               case CAMSS_8250:
-               case CAMSS_8280XP:
-                       l->formats = formats_rdi_845;
-                       l->nformats = ARRAY_SIZE(formats_rdi_845);
-                       break;
+               if (i == VFE_LINE_PIX) {
+                       l->nformats = res->vfe.formats_pix->nformats;
+                       l->formats = res->vfe.formats_pix->formats;
+               } else {
+                       l->nformats = res->vfe.formats_rdi->nformats;
+                       l->formats = res->vfe.formats_rdi->formats;
                }
        }
 
@@ -1684,10 +1818,13 @@ int msm_vfe_register_entities(struct vfe_device *vfe,
                        video_out->bpl_alignment = 16;
                        video_out->line_based = 1;
                }
+
+               video_out->nformats = vfe->line[i].nformats;
+               video_out->formats = vfe->line[i].formats;
+
                snprintf(name, ARRAY_SIZE(name), "%s%d_%s%d",
                         MSM_VFE_NAME, vfe->id, "video", i);
-               ret = msm_video_register(video_out, v4l2_dev, name,
-                                        i == VFE_LINE_PIX ? 1 : 0);
+               ret = msm_video_register(video_out, v4l2_dev, name);
                if (ret < 0) {
                        dev_err(dev, "Failed to register video node: %d\n",
                                ret);
index 87fc159c48cc55b4f4e7aed281d0b960ce08bf18..10e2cc3c0b8398e137cb1968fce8dfaa921f4c96 100644 (file)
@@ -92,7 +92,7 @@ struct vfe_line {
        struct v4l2_rect crop;
        struct camss_video video_out;
        struct vfe_output output;
-       const struct vfe_format *formats;
+       const struct camss_format_info *formats;
        unsigned int nformats;
 };
 
@@ -132,6 +132,8 @@ struct vfe_subdev_resources {
        bool has_pd;
        char *pd_name;
        const struct vfe_hw_ops *hw_ops;
+       const struct camss_formats *formats_rdi;
+       const struct camss_formats *formats_pix;
 };
 
 struct vfe_device {
@@ -224,6 +226,13 @@ void vfe_pm_domain_off(struct vfe_device *vfe);
  */
 int vfe_pm_domain_on(struct vfe_device *vfe);
 
+extern const struct camss_formats vfe_formats_rdi_8x16;
+extern const struct camss_formats vfe_formats_pix_8x16;
+extern const struct camss_formats vfe_formats_rdi_8x96;
+extern const struct camss_formats vfe_formats_pix_8x96;
+extern const struct camss_formats vfe_formats_rdi_845;
+extern const struct camss_formats vfe_formats_pix_845;
+
 extern const struct vfe_hw_ops vfe_ops_4_1;
 extern const struct vfe_hw_ops vfe_ops_4_7;
 extern const struct vfe_hw_ops vfe_ops_4_8;
index 54cd82f741154c6eb61a1d6fa6d8ca16934990cf..2fe70683846991e966afac046bcec4f19497363d 100644 (file)
 #define CAMSS_FRAME_MAX_HEIGHT_RDI     8191
 #define CAMSS_FRAME_MAX_HEIGHT_PIX     4096
 
-struct fract {
-       u8 numerator;
-       u8 denominator;
-};
-
-/*
- * struct camss_format_info - ISP media bus format information
- * @code: V4L2 media bus format code
- * @pixelformat: V4L2 pixel format FCC identifier
- * @planes: Number of planes
- * @hsub: Horizontal subsampling (for each plane)
- * @vsub: Vertical subsampling (for each plane)
- * @bpp: Bits per pixel when stored in memory (for each plane)
- */
-struct camss_format_info {
-       u32 code;
-       u32 pixelformat;
-       u8 planes;
-       struct fract hsub[3];
-       struct fract vsub[3];
-       unsigned int bpp[3];
-};
-
-static const struct camss_format_info formats_rdi_8x16[] = {
-       { MEDIA_BUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_UYVY, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_VYUY8_1X16, V4L2_PIX_FMT_VYUY, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_YUYV, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_YVYU8_1X16, V4L2_PIX_FMT_YVYU, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_PIX_FMT_SBGGR8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SGBRG8_1X8, V4L2_PIX_FMT_SGBRG8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SGRBG8_1X8, V4L2_PIX_FMT_SGRBG8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SRGGB8_1X8, V4L2_PIX_FMT_SRGGB8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SBGGR10_1X10, V4L2_PIX_FMT_SBGGR10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SGBRG10_1X10, V4L2_PIX_FMT_SGBRG10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SGRBG10_1X10, V4L2_PIX_FMT_SGRBG10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SRGGB10_1X10, V4L2_PIX_FMT_SRGGB10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SBGGR12_1X12, V4L2_PIX_FMT_SBGGR12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SGBRG12_1X12, V4L2_PIX_FMT_SGBRG12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SGRBG12_1X12, V4L2_PIX_FMT_SGRBG12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SRGGB12_1X12, V4L2_PIX_FMT_SRGGB12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_Y10_1X10, V4L2_PIX_FMT_Y10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-};
-
-static const struct camss_format_info formats_rdi_8x96[] = {
-       { MEDIA_BUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_UYVY, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_VYUY8_1X16, V4L2_PIX_FMT_VYUY, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_YUYV, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_YVYU8_1X16, V4L2_PIX_FMT_YVYU, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_PIX_FMT_SBGGR8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SGBRG8_1X8, V4L2_PIX_FMT_SGBRG8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SGRBG8_1X8, V4L2_PIX_FMT_SGRBG8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SRGGB8_1X8, V4L2_PIX_FMT_SRGGB8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SBGGR10_1X10, V4L2_PIX_FMT_SBGGR10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SGBRG10_1X10, V4L2_PIX_FMT_SGBRG10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SGRBG10_1X10, V4L2_PIX_FMT_SGRBG10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SRGGB10_1X10, V4L2_PIX_FMT_SRGGB10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_PIX_FMT_SBGGR10, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_SBGGR12_1X12, V4L2_PIX_FMT_SBGGR12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SGBRG12_1X12, V4L2_PIX_FMT_SGBRG12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SGRBG12_1X12, V4L2_PIX_FMT_SGRBG12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SRGGB12_1X12, V4L2_PIX_FMT_SRGGB12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SBGGR14_1X14, V4L2_PIX_FMT_SBGGR14P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 14 } },
-       { MEDIA_BUS_FMT_SGBRG14_1X14, V4L2_PIX_FMT_SGBRG14P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 14 } },
-       { MEDIA_BUS_FMT_SGRBG14_1X14, V4L2_PIX_FMT_SGRBG14P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 14 } },
-       { MEDIA_BUS_FMT_SRGGB14_1X14, V4L2_PIX_FMT_SRGGB14P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 14 } },
-       { MEDIA_BUS_FMT_Y10_1X10, V4L2_PIX_FMT_Y10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_Y10_2X8_PADHI_LE, V4L2_PIX_FMT_Y10, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-};
-
-static const struct camss_format_info formats_rdi_845[] = {
-       { MEDIA_BUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_UYVY, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_VYUY8_1X16, V4L2_PIX_FMT_VYUY, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_YUYV, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_YVYU8_1X16, V4L2_PIX_FMT_YVYU, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_PIX_FMT_SBGGR8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SGBRG8_1X8, V4L2_PIX_FMT_SGBRG8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SGRBG8_1X8, V4L2_PIX_FMT_SGRBG8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SRGGB8_1X8, V4L2_PIX_FMT_SRGGB8, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_SBGGR10_1X10, V4L2_PIX_FMT_SBGGR10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SGBRG10_1X10, V4L2_PIX_FMT_SGBRG10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SGRBG10_1X10, V4L2_PIX_FMT_SGRBG10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SRGGB10_1X10, V4L2_PIX_FMT_SRGGB10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_PIX_FMT_SBGGR10, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_SBGGR12_1X12, V4L2_PIX_FMT_SBGGR12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SGBRG12_1X12, V4L2_PIX_FMT_SGBRG12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SGRBG12_1X12, V4L2_PIX_FMT_SGRBG12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SRGGB12_1X12, V4L2_PIX_FMT_SRGGB12P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 12 } },
-       { MEDIA_BUS_FMT_SBGGR14_1X14, V4L2_PIX_FMT_SBGGR14P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 14 } },
-       { MEDIA_BUS_FMT_SGBRG14_1X14, V4L2_PIX_FMT_SGBRG14P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 14 } },
-       { MEDIA_BUS_FMT_SGRBG14_1X14, V4L2_PIX_FMT_SGRBG14P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 14 } },
-       { MEDIA_BUS_FMT_SRGGB14_1X14, V4L2_PIX_FMT_SRGGB14P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 14 } },
-       { MEDIA_BUS_FMT_Y8_1X8, V4L2_PIX_FMT_GREY, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 8 } },
-       { MEDIA_BUS_FMT_Y10_1X10, V4L2_PIX_FMT_Y10P, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 10 } },
-       { MEDIA_BUS_FMT_Y10_2X8_PADHI_LE, V4L2_PIX_FMT_Y10, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-};
-
-static const struct camss_format_info formats_pix_8x16[] = {
-       { MEDIA_BUS_FMT_YUYV8_1_5X8, V4L2_PIX_FMT_NV12, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_YVYU8_1_5X8, V4L2_PIX_FMT_NV12, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_UYVY8_1_5X8, V4L2_PIX_FMT_NV12, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_VYUY8_1_5X8, V4L2_PIX_FMT_NV12, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_YUYV8_1_5X8, V4L2_PIX_FMT_NV21, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_YVYU8_1_5X8, V4L2_PIX_FMT_NV21, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_UYVY8_1_5X8, V4L2_PIX_FMT_NV21, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_VYUY8_1_5X8, V4L2_PIX_FMT_NV21, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_NV16, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_YVYU8_1X16, V4L2_PIX_FMT_NV16, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_NV16, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_VYUY8_1X16, V4L2_PIX_FMT_NV16, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_NV61, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_YVYU8_1X16, V4L2_PIX_FMT_NV61, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_NV61, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_VYUY8_1X16, V4L2_PIX_FMT_NV61, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-};
-
-static const struct camss_format_info formats_pix_8x96[] = {
-       { MEDIA_BUS_FMT_YUYV8_1_5X8, V4L2_PIX_FMT_NV12, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_YVYU8_1_5X8, V4L2_PIX_FMT_NV12, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_UYVY8_1_5X8, V4L2_PIX_FMT_NV12, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_VYUY8_1_5X8, V4L2_PIX_FMT_NV12, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_YUYV8_1_5X8, V4L2_PIX_FMT_NV21, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_YVYU8_1_5X8, V4L2_PIX_FMT_NV21, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_UYVY8_1_5X8, V4L2_PIX_FMT_NV21, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_VYUY8_1_5X8, V4L2_PIX_FMT_NV21, 1,
-         { { 1, 1 } }, { { 2, 3 } }, { 8 } },
-       { MEDIA_BUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_NV16, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_YVYU8_1X16, V4L2_PIX_FMT_NV16, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_NV16, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_VYUY8_1X16, V4L2_PIX_FMT_NV16, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_NV61, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_YVYU8_1X16, V4L2_PIX_FMT_NV61, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_NV61, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_VYUY8_1X16, V4L2_PIX_FMT_NV61, 1,
-         { { 1, 1 } }, { { 1, 2 } }, { 8 } },
-       { MEDIA_BUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_UYVY, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_VYUY8_1X16, V4L2_PIX_FMT_VYUY, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_YUYV, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-       { MEDIA_BUS_FMT_YVYU8_1X16, V4L2_PIX_FMT_YVYU, 1,
-         { { 1, 1 } }, { { 1, 1 } }, { 16 } },
-};
-
 /* -----------------------------------------------------------------------------
  * Helper functions
  */
@@ -969,7 +731,7 @@ static int msm_video_init_format(struct camss_video *video)
  */
 
 int msm_video_register(struct camss_video *video, struct v4l2_device *v4l2_dev,
-                      const char *name, int is_pix)
+                      const char *name)
 {
        struct media_pad *pad = &video->pad;
        struct video_device *vdev;
@@ -1006,34 +768,6 @@ int msm_video_register(struct camss_video *video, struct v4l2_device *v4l2_dev,
 
        mutex_init(&video->lock);
 
-       switch (video->camss->res->version) {
-       case CAMSS_8x16:
-               if (is_pix) {
-                       video->formats = formats_pix_8x16;
-                       video->nformats = ARRAY_SIZE(formats_pix_8x16);
-               } else {
-                       video->formats = formats_rdi_8x16;
-                       video->nformats = ARRAY_SIZE(formats_rdi_8x16);
-               }
-               break;
-       case CAMSS_8x96:
-       case CAMSS_660:
-               if (is_pix) {
-                       video->formats = formats_pix_8x96;
-                       video->nformats = ARRAY_SIZE(formats_pix_8x96);
-               } else {
-                       video->formats = formats_rdi_8x96;
-                       video->nformats = ARRAY_SIZE(formats_rdi_8x96);
-               }
-               break;
-       case CAMSS_845:
-       case CAMSS_8250:
-       case CAMSS_8280XP:
-               video->formats = formats_rdi_845;
-               video->nformats = ARRAY_SIZE(formats_rdi_845);
-               break;
-       }
-
        ret = msm_video_init_format(video);
        if (ret < 0) {
                dev_err(v4l2_dev->dev, "Failed to init format: %d\n", ret);
index bdbae84241403d014bfc0bd905eb4c7bce4a52f1..d3e56e240a8880e0c1779085bd90b8ce43306a64 100644 (file)
@@ -33,8 +33,6 @@ struct camss_video_ops {
                             enum vb2_buffer_state state);
 };
 
-struct camss_format_info;
-
 struct camss_video {
        struct camss *camss;
        struct vb2_queue vb2_q;
@@ -53,7 +51,7 @@ struct camss_video {
 };
 
 int msm_video_register(struct camss_video *video, struct v4l2_device *v4l2_dev,
-                      const char *name, int is_pix);
+                      const char *name);
 
 void msm_video_unregister(struct camss_video *video);
 
index 34bac001073c0d20d9ab9a030bfccc88a256fd1f..8f2414eed89d480a2eab73525989104c3c4eea60 100644 (file)
@@ -137,7 +137,9 @@ static const struct camss_subdev_resources vfe_res_8x16[] = {
                .interrupt = { "vfe0" },
                .vfe = {
                        .line_num = 3,
-                       .hw_ops = &vfe_ops_4_1
+                       .hw_ops = &vfe_ops_4_1,
+                       .formats_rdi = &vfe_formats_rdi_8x16,
+                       .formats_pix = &vfe_formats_pix_8x16
                }
        }
 };
@@ -303,7 +305,9 @@ static const struct camss_subdev_resources vfe_res_8x96[] = {
                .vfe = {
                        .line_num = 3,
                        .has_pd = true,
-                       .hw_ops = &vfe_ops_4_7
+                       .hw_ops = &vfe_ops_4_7,
+                       .formats_rdi = &vfe_formats_rdi_8x96,
+                       .formats_pix = &vfe_formats_pix_8x96
                }
        },
 
@@ -326,7 +330,9 @@ static const struct camss_subdev_resources vfe_res_8x96[] = {
                .vfe = {
                        .line_num = 3,
                        .has_pd = true,
-                       .hw_ops = &vfe_ops_4_7
+                       .hw_ops = &vfe_ops_4_7,
+                       .formats_rdi = &vfe_formats_rdi_8x96,
+                       .formats_pix = &vfe_formats_pix_8x96
                }
        }
 };
@@ -513,7 +519,9 @@ static const struct camss_subdev_resources vfe_res_660[] = {
                .vfe = {
                        .line_num = 3,
                        .has_pd = true,
-                       .hw_ops = &vfe_ops_4_8
+                       .hw_ops = &vfe_ops_4_8,
+                       .formats_rdi = &vfe_formats_rdi_8x96,
+                       .formats_pix = &vfe_formats_pix_8x96
                }
        },
 
@@ -539,7 +547,9 @@ static const struct camss_subdev_resources vfe_res_660[] = {
                .vfe = {
                        .line_num = 3,
                        .has_pd = true,
-                       .hw_ops = &vfe_ops_4_8
+                       .hw_ops = &vfe_ops_4_8,
+                       .formats_rdi = &vfe_formats_rdi_8x96,
+                       .formats_pix = &vfe_formats_pix_8x96
                }
        }
 };
@@ -724,7 +734,9 @@ static const struct camss_subdev_resources vfe_res_845[] = {
                .vfe = {
                        .line_num = 4,
                        .has_pd = true,
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
 
@@ -749,7 +761,9 @@ static const struct camss_subdev_resources vfe_res_845[] = {
                .vfe = {
                        .line_num = 4,
                        .has_pd = true,
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
 
@@ -773,7 +787,9 @@ static const struct camss_subdev_resources vfe_res_845[] = {
                .vfe = {
                        .is_lite = true,
                        .line_num = 4,
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        }
 };
@@ -938,7 +954,9 @@ static const struct camss_subdev_resources vfe_res_8250[] = {
                        .line_num = 3,
                        .has_pd = true,
                        .pd_name = "ife0",
-                       .hw_ops = &vfe_ops_480
+                       .hw_ops = &vfe_ops_480,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
        /* VFE1 */
@@ -962,7 +980,9 @@ static const struct camss_subdev_resources vfe_res_8250[] = {
                        .line_num = 3,
                        .has_pd = true,
                        .pd_name = "ife1",
-                       .hw_ops = &vfe_ops_480
+                       .hw_ops = &vfe_ops_480,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
        /* VFE2 (lite) */
@@ -984,7 +1004,9 @@ static const struct camss_subdev_resources vfe_res_8250[] = {
                .vfe = {
                        .is_lite = true,
                        .line_num = 4,
-                       .hw_ops = &vfe_ops_480
+                       .hw_ops = &vfe_ops_480,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
        /* VFE3 (lite) */
@@ -1006,7 +1028,9 @@ static const struct camss_subdev_resources vfe_res_8250[] = {
                .vfe = {
                        .is_lite = true,
                        .line_num = 4,
-                       .hw_ops = &vfe_ops_480
+                       .hw_ops = &vfe_ops_480,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
 };
@@ -1216,7 +1240,9 @@ static const struct camss_subdev_resources vfe_res_sc8280xp[] = {
                .vfe = {
                        .line_num = 4,
                        .pd_name = "ife0",
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
        /* VFE1 */
@@ -1234,7 +1260,9 @@ static const struct camss_subdev_resources vfe_res_sc8280xp[] = {
                .vfe = {
                        .line_num = 4,
                        .pd_name = "ife1",
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
        /* VFE2 */
@@ -1252,7 +1280,9 @@ static const struct camss_subdev_resources vfe_res_sc8280xp[] = {
                .vfe = {
                        .line_num = 4,
                        .pd_name = "ife2",
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
        /* VFE3 */
@@ -1270,7 +1300,9 @@ static const struct camss_subdev_resources vfe_res_sc8280xp[] = {
                .vfe = {
                        .line_num = 4,
                        .pd_name = "ife3",
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
        /* VFE_LITE_0 */
@@ -1287,7 +1319,9 @@ static const struct camss_subdev_resources vfe_res_sc8280xp[] = {
                .vfe = {
                        .is_lite = true,
                        .line_num = 4,
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
        /* VFE_LITE_1 */
@@ -1304,7 +1338,9 @@ static const struct camss_subdev_resources vfe_res_sc8280xp[] = {
                .vfe = {
                        .is_lite = true,
                        .line_num = 4,
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
        /* VFE_LITE_2 */
@@ -1321,7 +1357,9 @@ static const struct camss_subdev_resources vfe_res_sc8280xp[] = {
                .vfe = {
                        .is_lite = true,
                        .line_num = 4,
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
        /* VFE_LITE_3 */
@@ -1338,7 +1376,9 @@ static const struct camss_subdev_resources vfe_res_sc8280xp[] = {
                .vfe = {
                        .is_lite = true,
                        .line_num = 4,
-                       .hw_ops = &vfe_ops_170
+                       .hw_ops = &vfe_ops_170,
+                       .formats_rdi = &vfe_formats_rdi_845,
+                       .formats_pix = &vfe_formats_pix_845
                }
        },
 };
index e6d9fba646a10fc2444f2c5204dfd9888bfaf5e0..9e73a55a257b58f7da41a54b31c924936a394305 100644 (file)
@@ -22,6 +22,7 @@
 #include "camss-csiphy.h"
 #include "camss-ispif.h"
 #include "camss-vfe.h"
+#include "camss-format.h"
 
 #define to_camss(ptr_module)   \
        container_of(ptr_module, struct camss, ptr_module)