[PATCH RESEND 06/45] media: qcom: camss: sm8250: add IFE CamIF v10x

From: Gjorgji . Rosikopulos . gjorgji . rosikopulos

Date: Wed Oct 07 2026 - 05:03:59 EST


From: Atanas Filipov <atanas.filipov@xxxxxxxxxxxxxxxx>

Add the IFE camera input interface used by the SM8250 pixel path.

Signed-off-by: Atanas Filipov <atanas.filipov@xxxxxxxxxxxxxxxx>
---
drivers/media/platform/qcom/camss/Makefile | 1 +
.../qcom/camss/camss-ife-camif-v10x.c | 59 +++++++++++++++++++
.../qcom/camss/camss-ife-camif-v10x.h | 42 +++++++++++++
3 files changed, 102 insertions(+)
create mode 100644 drivers/media/platform/qcom/camss/camss-ife-camif-v10x.c
create mode 100644 drivers/media/platform/qcom/camss/camss-ife-camif-v10x.h

diff --git a/drivers/media/platform/qcom/camss/Makefile b/drivers/media/platform/qcom/camss/Makefile
index e30fe07b16f4..2da998444554 100644
--- a/drivers/media/platform/qcom/camss/Makefile
+++ b/drivers/media/platform/qcom/camss/Makefile
@@ -15,6 +15,7 @@ qcom-camss-objs += \
camss-csiphy-3ph-1-0.o \
camss-format.o \
camss-ife-bus-v20x.o \
+ camss-ife-camif-v10x.o \
camss-ispif.o \
camss-tpg.o \
camss-tpg-gen1.o \
diff --git a/drivers/media/platform/qcom/camss/camss-ife-camif-v10x.c b/drivers/media/platform/qcom/camss/camss-ife-camif-v10x.c
new file mode 100644
index 000000000000..c89caf38fb8c
--- /dev/null
+++ b/drivers/media/platform/qcom/camss/camss-ife-camif-v10x.c
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2023, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Technologies, Inc.
+ */
+
+#include "camss.h"
+#include "camss-ife.h"
+#include "camss-ife-camif-v10x.h"
+
+static int camif_v10x_config(void __iomem *camif_base, enum camss_ife_hw_pipe hw_pipe,
+ const struct camss_ife_pipeline_cfg *sink_cfg)
+{
+ u32 period = 0, pattern = 1, epoch;
+
+ epoch = FIELD_PREP(CAMIF_V10X_CFG_EPOCH0_LINE, sink_cfg->in_height / 3) |
+ FIELD_PREP(CAMIF_V10X_CFG_EPOCH1_LINE, sink_cfg->in_height / 2);
+
+ if (hw_pipe == CAMSS_IFE_HW_PIPE_PP) {
+ writel_relaxed(period, camif_base + CAMIF_V10X_PP_PERIOD_CFG);
+ writel_relaxed(pattern, camif_base + CAMIF_V10X_PP_PATTERN_CFG);
+ writel_relaxed(epoch, camif_base + CAMIF_V10X_PP_EPOCH_IRQ_CFG);
+ } else {
+ writel_relaxed(epoch, camif_base + CAMIF_V10X_RDI_EPOCH_IRQ_CFG);
+ writel_relaxed(period, camif_base + CAMIF_V10X_RDI_PERIOD_CFG);
+ writel_relaxed(pattern, camif_base + CAMIF_V10X_RDI_PATTERN_CFG);
+ }
+
+ return 0;
+}
+
+static void camif_v10x_enable(void __iomem *camif_base, enum camss_ife_hw_pipe hw_pipe)
+{
+ u32 rval = readl_relaxed(camif_base + CAMIF_V10X_MODULE_CFG);
+
+ if (hw_pipe == CAMSS_IFE_HW_PIPE_PP)
+ rval |= CAMIF_V10X_PP_CFG_EN | CAMIF_V10X_PP_CFG_OUTPUT_EN;
+ else
+ rval |= CAMIF_V10X_RDI_CFG_EN;
+
+ writel_relaxed(rval, camif_base + CAMIF_V10X_MODULE_CFG);
+}
+
+static void camif_v10x_disable(void __iomem *camif_base, enum camss_ife_hw_pipe hw_pipe)
+{
+ u32 rval = readl_relaxed(camif_base + CAMIF_V10X_MODULE_CFG);
+
+ if (hw_pipe == CAMSS_IFE_HW_PIPE_PP)
+ rval &= ~(CAMIF_V10X_PP_CFG_EN | CAMIF_V10X_PP_CFG_OUTPUT_EN);
+ else
+ rval &= ~CAMIF_V10X_RDI_CFG_EN;
+
+ writel_relaxed(rval, camif_base + CAMIF_V10X_MODULE_CFG);
+}
+
+const struct ife_hw_camif_ops ife_camif_v10x_ops = {
+ .config = camif_v10x_config,
+ .enable = camif_v10x_enable,
+ .disable = camif_v10x_disable,
+};
diff --git a/drivers/media/platform/qcom/camss/camss-ife-camif-v10x.h b/drivers/media/platform/qcom/camss/camss-ife-camif-v10x.h
new file mode 100644
index 000000000000..87faa5776c31
--- /dev/null
+++ b/drivers/media/platform/qcom/camss/camss-ife-camif-v10x.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (c) 2023, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Technologies, Inc.
+ */
+
+#ifndef _CAMSS_IFE_CAMIF_V10X_H_
+#define _CAMSS_IFE_CAMIF_V10X_H_
+
+#include <linux/bits.h>
+
+#include "camss-ife.h"
+
+/* Per-RDI register offset */
+#define IFE_CAMIF_V10X_RDIX_OFFS(n) ((n) * 0x200)
+
+/* PP config bits */
+#define CAMIF_V10X_PP_CFG_EN BIT(0)
+#define CAMIF_V10X_PP_CFG_OUTPUT_EN BIT(8)
+
+/* RDI config bit */
+#define CAMIF_V10X_RDI_CFG_EN BIT(0)
+
+/* EPOCH line fields */
+#define CAMIF_V10X_CFG_EPOCH0_LINE GENMASK(13, 0)
+#define CAMIF_V10X_CFG_EPOCH1_LINE GENMASK(29, 16)
+
+/* Module config register offset */
+#define CAMIF_V10X_MODULE_CFG 0x00000060
+
+/* RDI register offsets */
+#define CAMIF_V10X_RDI_PERIOD_CFG 0x00000068
+#define CAMIF_V10X_RDI_PATTERN_CFG 0x0000006c
+#define CAMIF_V10X_RDI_EPOCH_IRQ_CFG 0x00000070
+
+/* PP (pixel path) register offsets */
+#define CAMIF_V10X_PP_PERIOD_CFG 0x00000078
+#define CAMIF_V10X_PP_PATTERN_CFG 0x0000007c
+#define CAMIF_V10X_PP_EPOCH_IRQ_CFG 0x00000080
+
+extern const struct ife_hw_camif_ops ife_camif_v10x_ops;
+
+#endif /* _CAMSS_IFE_CAMIF_V10X_H_ */
--
2.34.1