lede/target/linux/silicon/patches-5.19/0155-spmi-apple-Properly-wait-for-status-data-after-write.patch

54 lines
1.5 KiB
Diff

From 0324791a3cdc3e93df57f6293e2cfaaadc264aeb Mon Sep 17 00:00:00 2001
From: Hector Martin <marcan@marcan.st>
Date: Sat, 2 Jul 2022 00:24:15 +0900
Subject: [PATCH 155/171] spmi: apple: Properly wait for status data after
write
Signed-off-by: Hector Martin <marcan@marcan.st>
---
drivers/spmi/spmi-apple-controller.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/drivers/spmi/spmi-apple-controller.c b/drivers/spmi/spmi-apple-controller.c
index 3b6de8069396..5b49d6c609f5 100644
--- a/drivers/spmi/spmi-apple-controller.c
+++ b/drivers/spmi/spmi-apple-controller.c
@@ -96,6 +96,7 @@ static int spmi_write_cmd(struct spmi_controller *ctrl,
struct apple_spmi *spmi;
u32 spmi_cmd = opc|slave_id<<8|slave_addr<<16|(bc-1)|(1<<15);
volatile u32 rsp;
+ volatile u32 status;
size_t i=0,j;
spmi = spmi_controller_get_drvdata(ctrl);
@@ -111,12 +112,21 @@ static int spmi_write_cmd(struct spmi_controller *ctrl,
write_reg(spmi_cmd, spmi, SPMI_CMD_REG);
}
- /* Read SPMI reply status */
- /* do we need this while loop ?
- if yes what for ? */
+ /* Wait for Rx FIFO to have something */
+ /* Quite ugly msleep, need to find a better way to do it */
+ i=0;
do {
- rsp=read_reg(spmi, SPMI_RSP_REG);
- } while (rsp==0);
+ status=read_reg(spmi, SPMI_STATUS_REG);
+ msleep(10);
+ i+=1;
+ } while ((status & SPMI_RX_FIFO_EMPTY) && i<5);
+
+ if(i>=5){
+ dev_err(&ctrl->dev,"spmi_write_cmd:took to long to get the status");
+ return -1;
+ }
+
+ rsp = read_reg(spmi, SPMI_RSP_REG);
return 0;
}
--
2.34.1