diff options
Diffstat (limited to 'drivers/media/platform/xilinx/xilinx-vip.c')
-rw-r--r-- | drivers/media/platform/xilinx/xilinx-vip.c | 177 |
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 * |