[PATCH v1] spmi: msm: Fix V5 ownership table offset

Aswin Murugan aswin.murugan at oss.qualcomm.com
Thu Jun 18 18:27:18 CEST 2026


The driver reads ownership registers from the wrong address for V5.
The ownership table is at offset 0x700 from spmi_cnfg base, not 0x0.
This causes incorrect peripheral ownership detection and potential
access violations.

Add the missing 0x700 offset to match the kernel driver [1]

[1] https://github.com/torvalds/linux/blob/4b99990cdf9560e8a071640baf19f312e6ae02f4/drivers/spmi/spmi-pmic-arb.c#L1737

Signed-off-by: Aswin Murugan <aswin.murugan at oss.qualcomm.com>
---
 drivers/spmi/spmi-msm.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/spmi/spmi-msm.c b/drivers/spmi/spmi-msm.c
index b89dd0b406b..a665850cd65 100644
--- a/drivers/spmi/spmi-msm.c
+++ b/drivers/spmi/spmi-msm.c
@@ -260,11 +260,21 @@ static struct dm_spmi_ops msm_spmi_ops = {
 static void msm_spmi_channel_map_v5(struct msm_spmi_priv *priv, unsigned int i,
 				    uint8_t slave_id, uint8_t pid)
 {
-	/* Mark channels read-only when from different owner */
-	uint32_t cnfg = readl(priv->spmi_cnfg + ARB_CHANNEL_OFFSET(i));
-	uint8_t owner = SPMI_OWNERSHIP_PERIPH2OWNER(cnfg);
-	bool prev_valid = priv->channel_map[slave_id][pid] & SPMI_CHANNEL_VALID;
-	uint32_t prev_read_only = priv->channel_map[slave_id][pid] & SPMI_CHANNEL_READ_ONLY;
+	phys_addr_t owner_addr;
+	uint32_t cnfg;
+	uint8_t owner;
+	bool prev_valid;
+	uint32_t prev_read_only;
+
+	if (priv->arb_ver == V5)
+		owner_addr = priv->spmi_cnfg + 0x700 + ARB_CHANNEL_OFFSET(i);
+	else /* V7 */
+		owner_addr = priv->spmi_cnfg + ARB_CHANNEL_OFFSET(i);
+
+	cnfg = readl(owner_addr);
+	owner = SPMI_OWNERSHIP_PERIPH2OWNER(cnfg);
+	prev_valid = priv->channel_map[slave_id][pid] & SPMI_CHANNEL_VALID;
+	prev_read_only = priv->channel_map[slave_id][pid] & SPMI_CHANNEL_READ_ONLY;
 
 	if (!prev_valid) {
 		/* First PPID mapping */
-- 
2.34.1



More information about the U-Boot mailing list