aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/xilinx/xilinx-vip.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/platform/xilinx/xilinx-vip.c')
-rw-r--r--drivers/media/platform/xilinx/xilinx-vip.c177
1 files changed, 169 insertions, 8 deletions
diff --git a/drivers/media/platform/xilinx/xilinx-vip.c b/drivers/media/platform/xilinx/xilinx-vip.c
index 6ad61b08a31a..a9559a518938 100644
--- a/drivers/media/platform/xilinx/xilinx-vip.c
+++ b/drivers/media/platform/xilinx/xilinx-vip.c
@@ -24,22 +24,102 @@
*/
static const struct xvip_video_format xvip_video_formats[] = {
+ { XVIP_VF_YUV_420, 8, NULL, MEDIA_BUS_FMT_VYYUYY8_1X24,
+ 1, 12, V4L2_PIX_FMT_NV12, 2, 1, 1, 2 },
+ { XVIP_VF_YUV_420, 8, NULL, MEDIA_BUS_FMT_VYYUYY8_1X24,
+ 1, 12, V4L2_PIX_FMT_NV12M, 2, 2, 1, 2 },
+ { XVIP_VF_YUV_420, 10, NULL, MEDIA_BUS_FMT_VYYUYY10_4X20,
+ 1, 12, V4L2_PIX_FMT_XV15, 2, 1, 2, 2 },
+ { XVIP_VF_YUV_420, 10, NULL, MEDIA_BUS_FMT_VYYUYY10_4X20,
+ 1, 12, V4L2_PIX_FMT_XV15M, 2, 2, 1, 2 },
+ { XVIP_VF_YUV_420, 12, NULL, MEDIA_BUS_FMT_UYYVYY12_4X24,
+ 1, 12, V4L2_PIX_FMT_X012, 2, 1, 2, 2 },
+ { XVIP_VF_YUV_420, 12, NULL, MEDIA_BUS_FMT_UYYVYY12_4X24,
+ 1, 12, V4L2_PIX_FMT_X012M, 2, 2, 1, 2 },
+ { XVIP_VF_YUV_420, 16, NULL, MEDIA_BUS_FMT_UYYVYY16_4X32,
+ 2, 12, V4L2_PIX_FMT_X016, 2, 1, 2, 2 },
+ { XVIP_VF_YUV_420, 16, NULL, MEDIA_BUS_FMT_UYYVYY16_4X32,
+ 2, 12, V4L2_PIX_FMT_X016M, 2, 2, 1, 2 },
{ XVIP_VF_YUV_422, 8, NULL, MEDIA_BUS_FMT_UYVY8_1X16,
- 2, V4L2_PIX_FMT_YUYV },
+ 1, 16, V4L2_PIX_FMT_NV16, 2, 1, 1, 1 },
+ { XVIP_VF_YUV_422, 8, NULL, MEDIA_BUS_FMT_UYVY8_1X16,
+ 1, 16, V4L2_PIX_FMT_NV16M, 2, 2, 1, 1 },
+ { XVIP_VF_YUV_422, 8, NULL, MEDIA_BUS_FMT_UYVY8_1X16,
+ 2, 16, V4L2_PIX_FMT_YUYV, 1, 1, 2, 1 },
+ { XVIP_VF_VUY_422, 8, NULL, MEDIA_BUS_FMT_UYVY8_1X16,
+ 2, 16, V4L2_PIX_FMT_UYVY, 1, 1, 2, 1 },
+ { XVIP_VF_YUV_422, 10, NULL, MEDIA_BUS_FMT_UYVY10_1X20,
+ 1, 16, V4L2_PIX_FMT_XV20, 2, 1, 2, 1 },
+ { XVIP_VF_YUV_422, 10, NULL, MEDIA_BUS_FMT_UYVY10_1X20,
+ 1, 16, V4L2_PIX_FMT_XV20M, 2, 2, 1, 1 },
+ { XVIP_VF_YUV_422, 12, NULL, MEDIA_BUS_FMT_UYVY12_1X24,
+ 1, 16, V4L2_PIX_FMT_X212, 2, 1, 2, 1 },
+ { XVIP_VF_YUV_422, 12, NULL, MEDIA_BUS_FMT_UYVY12_1X24,
+ 1, 16, V4L2_PIX_FMT_X212M, 2, 2, 1, 1 },
+ { XVIP_VF_YUV_422, 16, NULL, MEDIA_BUS_FMT_UYVY16_2X32,
+ 2, 16, V4L2_PIX_FMT_X216, 2, 1, 2, 1 },
+ { XVIP_VF_YUV_422, 16, NULL, MEDIA_BUS_FMT_UYVY16_2X32,
+ 2, 16, V4L2_PIX_FMT_X216M, 2, 2, 1, 1 },
{ XVIP_VF_YUV_444, 8, NULL, MEDIA_BUS_FMT_VUY8_1X24,
- 3, V4L2_PIX_FMT_YUV444 },
+ 3, 24, V4L2_PIX_FMT_VUY24, 1, 1, 1, 1 },
+ { XVIP_VF_YUVX, 8, NULL, MEDIA_BUS_FMT_VUY8_1X24,
+ 4, 32, V4L2_PIX_FMT_XVUY32, 1, 1, 1, 1 },
+ { XVIP_VF_YUVX, 10, NULL, MEDIA_BUS_FMT_VUY10_1X30,
+ 3, 32, V4L2_PIX_FMT_XVUY10, 1, 1, 1, 1 },
+ { XVIP_VF_YUV_444, 12, NULL, MEDIA_BUS_FMT_VUY12_1X36,
+ 1, 24, V4L2_PIX_FMT_X412, 1, 1, 1, 1 },
+ { XVIP_VF_YUV_444, 12, NULL, MEDIA_BUS_FMT_VUY12_1X36,
+ 1, 24, V4L2_PIX_FMT_X412M, 1, 1, 1, 1 },
+ { XVIP_VF_YUV_444, 16, NULL, MEDIA_BUS_FMT_VUY16_1X48,
+ 2, 24, V4L2_PIX_FMT_X416, 1, 1, 1, 1 },
+ { XVIP_VF_YUV_444, 16, NULL, MEDIA_BUS_FMT_VUY16_1X48,
+ 2, 24, V4L2_PIX_FMT_X416M, 1, 1, 1, 1 },
+ { XVIP_VF_RBG, 8, NULL, MEDIA_BUS_FMT_RBG888_1X24,
+ 3, 24, V4L2_PIX_FMT_BGR24, 1, 1, 1, 1 },
{ XVIP_VF_RBG, 8, NULL, MEDIA_BUS_FMT_RBG888_1X24,
- 3, 0 },
+ 3, 24, V4L2_PIX_FMT_RGB24, 1, 1, 1, 1 },
+ { XVIP_VF_BGRX, 8, NULL, MEDIA_BUS_FMT_RBG888_1X24,
+ 4, 32, V4L2_PIX_FMT_BGRX32, 1, 1, 1, 1 },
+ { XVIP_VF_XRGB, 8, NULL, MEDIA_BUS_FMT_RBG888_1X24,
+ 4, 32, V4L2_PIX_FMT_XBGR32, 1, 1, 1, 1 },
+ { XVIP_VF_XBGR, 10, NULL, MEDIA_BUS_FMT_RBG101010_1X30,
+ 3, 32, V4L2_PIX_FMT_XBGR30, 1, 1, 1, 1 },
+ { XVIP_VF_XBGR, 12, NULL, MEDIA_BUS_FMT_RBG121212_1X36,
+ 3, 40, V4L2_PIX_FMT_XBGR40, 1, 1, 1, 1 },
+ { XVIP_VF_RBG, 16, NULL, MEDIA_BUS_FMT_RBG161616_1X48,
+ 6, 48, V4L2_PIX_FMT_BGR48, 1, 1, 1, 1 },
{ XVIP_VF_MONO_SENSOR, 8, "mono", MEDIA_BUS_FMT_Y8_1X8,
- 1, V4L2_PIX_FMT_GREY },
+ 1, 8, V4L2_PIX_FMT_GREY, 1, 1, 1, 1 },
+ { XVIP_VF_Y_GREY, 10, NULL, MEDIA_BUS_FMT_Y10_1X10,
+ 4, 32, V4L2_PIX_FMT_XY10, 1, 1, 1, 1 },
+ { XVIP_VF_Y_GREY, 12, NULL, MEDIA_BUS_FMT_Y12_1X12,
+ 1, 12, V4L2_PIX_FMT_XY12, 1, 1, 1, 1 },
+ { XVIP_VF_Y_GREY, 16, NULL, MEDIA_BUS_FMT_Y16_1X16,
+ 2, 16, V4L2_PIX_FMT_Y16, 1, 1, 1, 1 },
{ XVIP_VF_MONO_SENSOR, 8, "rggb", MEDIA_BUS_FMT_SRGGB8_1X8,
- 1, V4L2_PIX_FMT_SRGGB8 },
+ 1, 8, V4L2_PIX_FMT_SGRBG8, 1, 1, 1, 1 },
{ XVIP_VF_MONO_SENSOR, 8, "grbg", MEDIA_BUS_FMT_SGRBG8_1X8,
- 1, V4L2_PIX_FMT_SGRBG8 },
+ 1, 8, V4L2_PIX_FMT_SGRBG8, 1, 1, 1, 1 },
{ XVIP_VF_MONO_SENSOR, 8, "gbrg", MEDIA_BUS_FMT_SGBRG8_1X8,
- 1, V4L2_PIX_FMT_SGBRG8 },
+ 1, 8, V4L2_PIX_FMT_SGBRG8, 1, 1, 1, 1 },
{ XVIP_VF_MONO_SENSOR, 8, "bggr", MEDIA_BUS_FMT_SBGGR8_1X8,
- 1, V4L2_PIX_FMT_SBGGR8 },
+ 1, 8, V4L2_PIX_FMT_SBGGR8, 1, 1, 1, 1 },
+ { XVIP_VF_MONO_SENSOR, 12, "rggb", MEDIA_BUS_FMT_SRGGB12_1X12,
+ 1, 12, V4L2_PIX_FMT_SRGGB12, 1, 1, 1, 1 },
+ { XVIP_VF_MONO_SENSOR, 12, "grbg", MEDIA_BUS_FMT_SGRBG12_1X12,
+ 1, 12, V4L2_PIX_FMT_SGRBG12, 1, 1, 1, 1 },
+ { XVIP_VF_MONO_SENSOR, 12, "gbrg", MEDIA_BUS_FMT_SGBRG12_1X12,
+ 1, 12, V4L2_PIX_FMT_SGBRG12, 1, 1, 1, 1 },
+ { XVIP_VF_MONO_SENSOR, 12, "bggr", MEDIA_BUS_FMT_SBGGR12_1X12,
+ 1, 12, V4L2_PIX_FMT_SBGGR12, 1, 1, 1, 1 },
+ { XVIP_VF_MONO_SENSOR, 16, "rggb", MEDIA_BUS_FMT_SRGGB16_1X16,
+ 1, 16, V4L2_PIX_FMT_SRGGB16, 1, 1, 1, 1 },
+ { XVIP_VF_MONO_SENSOR, 16, "grbg", MEDIA_BUS_FMT_SGRBG16_1X16,
+ 1, 12, V4L2_PIX_FMT_SGRBG16, 1, 1, 1, 1 },
+ { XVIP_VF_MONO_SENSOR, 16, "gbrg", MEDIA_BUS_FMT_SGBRG16_1X16,
+ 1, 12, V4L2_PIX_FMT_SGBRG16, 1, 1, 1, 1 },
+ { XVIP_VF_MONO_SENSOR, 16, "bggr", MEDIA_BUS_FMT_SBGGR12_1X12,
+ 1, 12, V4L2_PIX_FMT_SBGGR16, 1, 1, 1, 1 },
};
/**
@@ -89,6 +169,87 @@ const struct xvip_video_format *xvip_get_format_by_fourcc(u32 fourcc)
EXPORT_SYMBOL_GPL(xvip_get_format_by_fourcc);
/**
+ * xvip_bpl_scaling_factor - Retrieve bpl scaling factor for a 4CC
+ * @fourcc: the format 4CC
+ * @numerator: returning numerator of scaling factor
+ * @denominator: returning denominator of scaling factor
+ *
+ * Return: Return numerator and denominator values by address
+ */
+void xvip_bpl_scaling_factor(u32 fourcc, u32 *numerator, u32 *denominator)
+{
+ switch (fourcc) {
+ case V4L2_PIX_FMT_XY10:
+ case V4L2_PIX_FMT_XV15:
+ case V4L2_PIX_FMT_XV20:
+ case V4L2_PIX_FMT_XV15M:
+ case V4L2_PIX_FMT_XV20M:
+ case V4L2_PIX_FMT_XBGR30:
+ case V4L2_PIX_FMT_XVUY10:
+ *numerator = 10;
+ *denominator = 8;
+ break;
+ case V4L2_PIX_FMT_XBGR40:
+ case V4L2_PIX_FMT_XY12:
+ case V4L2_PIX_FMT_X012:
+ case V4L2_PIX_FMT_X012M:
+ case V4L2_PIX_FMT_X212:
+ case V4L2_PIX_FMT_X212M:
+ case V4L2_PIX_FMT_X412:
+ case V4L2_PIX_FMT_X412M:
+ *numerator = 12;
+ *denominator = 8;
+ break;
+ default:
+ *numerator = 1;
+ *denominator = 1;
+ break;
+ }
+}
+EXPORT_SYMBOL_GPL(xvip_bpl_scaling_factor);
+
+/**
+ * xvip_width_padding_factor - Retrieve width's padding factor for a 4CC
+ * @fourcc: the format 4CC
+ * @numerator: returning numerator of padding factor
+ * @denominator: returning denominator of padding factor
+ *
+ * Return: Return numerator and denominator values by address
+ */
+void xvip_width_padding_factor(u32 fourcc, u32 *numerator, u32 *denominator)
+{
+ switch (fourcc) {
+ case V4L2_PIX_FMT_XY10:
+ case V4L2_PIX_FMT_XV15:
+ case V4L2_PIX_FMT_XV20:
+ case V4L2_PIX_FMT_XV15M:
+ case V4L2_PIX_FMT_XV20M:
+ case V4L2_PIX_FMT_XBGR30:
+ case V4L2_PIX_FMT_XVUY10:
+ /* 32 bits are required per 30 bits of data */
+ *numerator = 32;
+ *denominator = 30;
+ break;
+ case V4L2_PIX_FMT_XBGR40:
+ case V4L2_PIX_FMT_XY12:
+ case V4L2_PIX_FMT_X012:
+ case V4L2_PIX_FMT_X012M:
+ case V4L2_PIX_FMT_X212:
+ case V4L2_PIX_FMT_X212M:
+ case V4L2_PIX_FMT_X412:
+ case V4L2_PIX_FMT_X412M:
+ *numerator = 40;
+ *denominator = 36;
+ break;
+ default:
+ *numerator = 1;
+ *denominator = 1;
+ break;
+ }
+}
+EXPORT_SYMBOL_GPL(xvip_width_padding_factor);
+
+/**
* xvip_of_get_format - Parse a device tree node and return format information
* @node: the device tree node
*