[PATCH 18/74] media: qcom: camss: vfe: Add helper vfe_bus_v3_packer_fmt()
From: Bryan O'Donoghue
Date: Mon Oct 05 2026 - 13:22:36 EST
vfe_bus_v3_packer_fmt()'s job in life is to translate a given v4l2 pixel
format and plane into the appropriate bus packing format for v3 class
hardware.
Other versions are currently not covered.
Signed-off-by: Bryan O'Donoghue <bod@xxxxxxxxxx>
---
drivers/media/platform/qcom/camss/camss-vfe.c | 53 +++++++++++++++++++++++++++
drivers/media/platform/qcom/camss/camss-vfe.h | 32 ++++++++++++++++
2 files changed, 85 insertions(+)
diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c
index 5b5201b55a485..c95fe5b0b05fc 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe.c
@@ -370,6 +370,59 @@ const struct camss_formats vfe_formats_pix_845 = {
.formats = formats_pix_845
};
+u32 vfe_bus_v3_packer_fmt(u32 v4l2_fmt, u8 plane, u8 align_shift)
+{
+ switch (v4l2_fmt) {
+ case V4L2_PIX_FMT_NV12:
+ case V4L2_PIX_FMT_NV12M:
+ case V4L2_PIX_FMT_NV16:
+ return VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_LSB_MSB_10;
+ case V4L2_PIX_FMT_NV21:
+ case V4L2_PIX_FMT_NV21M:
+ case V4L2_PIX_FMT_NV61:
+ return plane ? VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_LSB_MSB_10_ODD_EVEN
+ : VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_LSB_MSB_10;
+
+ case V4L2_PIX_FMT_SRGGB10P:
+ case V4L2_PIX_FMT_SGRBG10P:
+ case V4L2_PIX_FMT_SGBRG10P:
+ case V4L2_PIX_FMT_SBGGR10P:
+ return VFE_BUS_WM_PACKER_FMT_V3_MIPI10;
+ case V4L2_PIX_FMT_SRGGB12P:
+ case V4L2_PIX_FMT_SGRBG12P:
+ case V4L2_PIX_FMT_SGBRG12P:
+ case V4L2_PIX_FMT_SBGGR12P:
+ return VFE_BUS_WM_PACKER_FMT_V3_MIPI12;
+ case V4L2_PIX_FMT_SRGGB14P:
+ case V4L2_PIX_FMT_SGRBG14P:
+ case V4L2_PIX_FMT_SGBRG14P:
+ case V4L2_PIX_FMT_SBGGR14P:
+ return VFE_BUS_WM_PACKER_FMT_V3_MIPI14;
+
+ case V4L2_PIX_FMT_SRGGB10:
+ case V4L2_PIX_FMT_SGRBG10:
+ case V4L2_PIX_FMT_SGBRG10:
+ case V4L2_PIX_FMT_SBGGR10:
+ return VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_10BPP |
+ BIT(align_shift);
+ case V4L2_PIX_FMT_SRGGB12:
+ case V4L2_PIX_FMT_SGRBG12:
+ case V4L2_PIX_FMT_SGBRG12:
+ case V4L2_PIX_FMT_SBGGR12:
+ return VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_12BPP |
+ BIT(align_shift);
+
+ case V4L2_PIX_FMT_SRGGB8:
+ case V4L2_PIX_FMT_SGRBG8:
+ case V4L2_PIX_FMT_SGBRG8:
+ case V4L2_PIX_FMT_SBGGR8:
+ return VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8;
+ }
+
+ WARN_ONCE(1, "no packer format for 0x%08x\n", v4l2_fmt);
+ return VFE_BUS_WM_PACKER_FMT_V3_PLAIN_128;
+}
+
static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
unsigned int index, u32 src_req_code)
{
diff --git a/drivers/media/platform/qcom/camss/camss-vfe.h b/drivers/media/platform/qcom/camss/camss-vfe.h
index 089f525b98cf5..98d403a71cf95 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe.h
+++ b/drivers/media/platform/qcom/camss/camss-vfe.h
@@ -56,6 +56,27 @@ enum vfe_line_id {
VFE_LINE_NUM_MAX = 4
};
+enum vfe_packer_format_v3 {
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_128 = 0,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_ODD_EVEN,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_LSB_MSB_10,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_LSB_MSB_10_ODD_EVEN,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_10BPP,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_12BPP,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_14BPP,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_16BPP,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_32,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN_64,
+ VFE_BUS_WM_PACKER_FMT_V3_TP_10,
+ VFE_BUS_WM_PACKER_FMT_V3_MIPI10,
+ VFE_BUS_WM_PACKER_FMT_V3_MIPI12,
+ VFE_BUS_WM_PACKER_FMT_V3_MIPI14,
+ VFE_BUS_WM_PACKER_FMT_V3_MIPI20,
+ VFE_BUS_WM_PACKER_FMT_V3_PLAIN32_20BPP,
+ VFE_BUS_WM_PACKER_FMT_V3_MAX,
+};
+
struct vfe_output {
u8 wm_num;
u8 wm_idx[3];
@@ -315,4 +336,15 @@ int vfe_enable_output_v2(struct vfe_line *line);
int vfe_queue_buffer_v2(struct camss_video *vid,
struct camss_buffer *buf);
+/*
+ * vfe_bus_v3_packer_fmt
+ *
+ * @v4l2_fmt: v4l2 format
+ * @plane: plane for the given format
+ * @align_shift: bit position of the PLAIN16 LSB alignment flag
+ *
+ * Return: the bus packer format for the register
+ */
+u32 vfe_bus_v3_packer_fmt(u32 v4l2_fmt, u8 plane, u8 align_shift);
+
#endif /* QC_MSM_CAMSS_VFE_H */
--
2.55.0