[PATCH 5/6] media: qcom: camss: tpg: Add support for TPG v2.5.0
From: Wenmeng Liu
Date: Tue Sep 15 2026 - 05:52:17 EST
Add support for TPG v2.5.0, which moves the stream enable bit out of
TPG_CTRL into a dedicated command register (TPG_CTRL_CMD). Branch
tpg_stream_on() on the runtime hw_version so the generator is enabled
through the command register on v2.5.0 and through TPG_CTRL on earlier
revisions; the reset bit is unchanged.
Signed-off-by: Wenmeng Liu <wenmeng.liu@xxxxxxxxxxxxxxxx>
---
drivers/media/platform/qcom/camss/camss-tpg-gen1.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/media/platform/qcom/camss/camss-tpg-gen1.c b/drivers/media/platform/qcom/camss/camss-tpg-gen1.c
index d29de5f93c18ee3c1778dc0626e8c198f354eb1f..de7ef5b8ff5fbd22e5659e5c896c5484a5c818b0 100644
--- a/drivers/media/platform/qcom/camss/camss-tpg-gen1.c
+++ b/drivers/media/platform/qcom/camss/camss-tpg-gen1.c
@@ -22,6 +22,7 @@
#define TPG_HW_VER_2_0_0 TPG_HW_VER(2, 0, 0)
#define TPG_HW_VER_2_1_0 TPG_HW_VER(2, 1, 0)
+#define TPG_HW_VER_2_5_0 TPG_HW_VER(2, 5, 0)
#define TPG_HW_STATUS 0x4
@@ -33,7 +34,14 @@
# define TPG_CTRL_OVERLAP_SHDR_EN BIT(10)
# define TPG_CTRL_NUM_ACTIVE_VC GENMASK(31, 30)
-#define TPG_CLEAR 0x1F4
+/*
+ * Command register at 0x1F4. Earlier TPG revisions only expose HW_RESET[0]
+ * here; v2.5.0 adds TEST_EN[4], moving the generator enable out of TPG_CTRL.
+ * HW_RESET[0] is unchanged, so the reset path is revision-independent.
+ */
+#define TPG_CTRL_CMD 0x1F4
+# define TPG_CTRL_CMD_HW_RESET BIT(0)
+# define TPG_CTRL_CMD_TEST_EN BIT(4)
/* TPG VC-based registers */
#define TPG_VC_n_GAIN_CFG(n) (0x60 + (n) * 0x60)
@@ -164,18 +172,23 @@ static int tpg_stream_on(struct tpg_device *tpg)
}
/* Global TPG control */
- val = FIELD_PREP(TPG_CTRL_TEST_EN, 1) |
- FIELD_PREP(TPG_CTRL_NUM_ACTIVE_LANES, lane_cnt - 1) |
+ val = FIELD_PREP(TPG_CTRL_NUM_ACTIVE_LANES, lane_cnt - 1) |
FIELD_PREP(TPG_CTRL_NUM_ACTIVE_VC, last_vc);
+ if (tpg->hw_version < TPG_HW_VER_2_5_0)
+ val |= FIELD_PREP(TPG_CTRL_TEST_EN, 1);
writel(val, tpg->base + TPG_CTRL);
+ /* v2.5.0 enables the generator through the command register */
+ if (tpg->hw_version >= TPG_HW_VER_2_5_0)
+ writel(TPG_CTRL_CMD_TEST_EN, tpg->base + TPG_CTRL_CMD);
+
return 0;
}
static int tpg_reset(struct tpg_device *tpg)
{
writel(0, tpg->base + TPG_CTRL);
- writel(1, tpg->base + TPG_CLEAR);
+ writel(TPG_CTRL_CMD_HW_RESET, tpg->base + TPG_CTRL_CMD);
return 0;
}
--
2.34.1