diff mbox series

[3/4] spmi: msm: introduce SPMI_CHANNEL_VALID flag

Message ID 20250328-topic-sm8x50-spmi-fix-v1-3-a7548d3aef0d@linaro.org
State New
Headers show
Series spmi: msm: fix pid mapping for v5 & v7 controllers | expand

Commit Message

Neil Armstrong March 28, 2025, 8:53 a.m. UTC
Introduce the SPMI_CHANNEL_VALID flag so we can check if
a mapping exists for a SPMI command.

Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
 drivers/spmi/spmi-msm.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/drivers/spmi/spmi-msm.c b/drivers/spmi/spmi-msm.c
index 9b2be1c1b9e381985b621297774500dd97844963..ee3feaf8b5049d51665330a63110ed4949e59bd6 100644
--- a/drivers/spmi/spmi-msm.c
+++ b/drivers/spmi/spmi-msm.c
@@ -63,6 +63,7 @@  DECLARE_GLOBAL_DATA_PTR;
 #define SPMI_MAX_PERIPH 256
 
 #define SPMI_CHANNEL_READ_ONLY	BIT(31)
+#define SPMI_CHANNEL_VALID	BIT(30)
 #define SPMI_CHANNEL_MASK	0xffff
 
 enum arb_ver {
@@ -117,6 +118,8 @@  static int msm_spmi_write(struct udevice *dev, int usid, int pid, int off,
 		return -EIO;
 	if (pid >= SPMI_MAX_PERIPH)
 		return -EIO;
+	if (!(priv->channel_map[usid][pid] & SPMI_CHANNEL_VALID))
+		return -EINVAL;
 	if (priv->channel_map[usid][pid] & SPMI_CHANNEL_READ_ONLY)
 		return -EPERM;
 
@@ -186,6 +189,8 @@  static int msm_spmi_read(struct udevice *dev, int usid, int pid, int off)
 		return -EIO;
 	if (pid >= SPMI_MAX_PERIPH)
 		return -EIO;
+	if (!(priv->channel_map[usid][pid] & SPMI_CHANNEL_VALID))
+		return -EINVAL;
 
 	channel = priv->channel_map[usid][pid] & SPMI_CHANNEL_MASK;
 
@@ -256,7 +261,7 @@  static void msm_spmi_channel_map_v5(struct msm_spmi_priv *priv, unsigned int i,
 	uint32_t cnfg = readl(priv->spmi_cnfg + ARB_CHANNEL_OFFSET(i));
 	uint8_t owner = SPMI_OWNERSHIP_PERIPH2OWNER(cnfg);
 
-	priv->channel_map[slave_id][pid] = i;
+	priv->channel_map[slave_id][pid] = i | SPMI_CHANNEL_VALID;
 	if (owner != priv->owner)
 		priv->channel_map[slave_id][pid] |= SPMI_CHANNEL_READ_ONLY;
 }
@@ -319,7 +324,7 @@  static int msm_spmi_probe(struct udevice *dev)
 		switch (priv->arb_ver) {
 		case V2:
 		case V3:
-			priv->channel_map[slave_id][pid] = i;
+			priv->channel_map[slave_id][pid] = i | SPMI_CHANNEL_VALID;
 			break;
 
 		case V5: