From 222e201b520cbd01b611fc45ae2f6b2f0b9d73a1 Mon Sep 17 00:00:00 2001
From: Clark Wang <xiaoning.wang@nxp.com>
Date: Thu, 14 Mar 2019 15:28:59 +0800
Subject: [PATCH] MLK-21140 i2c: rpmsg: ensure received bus_id and addr is same
 as sent

For some chips may need long time to get the response from M4 sometimes,
enlarge timeout to 500ms.

Add a judgement to check if the received data is the current transfer
wanted.

Signed-off-by: Clark Wang <xiaoning.wang@nxp.com>
---
 drivers/i2c/busses/i2c-rpmsg-imx.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/i2c/busses/i2c-rpmsg-imx.c b/drivers/i2c/busses/i2c-rpmsg-imx.c
index a978b61e741786..9d0561f8cb1941 100644
--- a/drivers/i2c/busses/i2c-rpmsg-imx.c
+++ b/drivers/i2c/busses/i2c-rpmsg-imx.c
@@ -79,7 +79,7 @@
 #include <linux/rpmsg.h>
 
 #define I2C_RPMSG_MAX_BUF_SIZE			16
-#define I2C_RPMSG_TIMEOUT			100 /* unit: ms */
+#define I2C_RPMSG_TIMEOUT			500 /* unit: ms */
 
 #define I2C_RPMSG_CATEGORY			0x09
 #define I2C_RPMSG_VERSION			0x0001
@@ -109,6 +109,9 @@ struct i2c_rpmsg_info {
 	struct i2c_rpmsg_msg *msg;
 	struct completion cmd_complete;
 	struct mutex lock;
+
+	u8 bus_id;
+	u16 addr;
 };
 
 static struct i2c_rpmsg_info i2c_rpmsg;
@@ -125,6 +128,13 @@ static int i2c_rpmsg_cb(struct rpmsg_device *rpdev, void *data, int len,
 	if (msg->header.type != I2C_RPMSG_TYPE_RESPONSE)
 		return -EINVAL;
 
+	if (msg->bus_id != i2c_rpmsg.bus_id || msg->addr != i2c_rpmsg.addr) {
+		dev_err(&rpdev->dev,
+		"expected bus_id:%d, addr:%2x, received bus_id:%d, addr:%2x\n",
+		i2c_rpmsg.bus_id, i2c_rpmsg.addr, msg->bus_id, msg->addr);
+		return -EINVAL;
+	}
+
 	if (msg->len > I2C_RPMSG_MAX_BUF_SIZE) {
 		dev_err(&rpdev->dev,
 		"%s failed: data length greater than %d, len=%d\n",
@@ -319,6 +329,9 @@ static int i2c_rpbus_xfer(struct i2c_adapter *adapter,
 
 		pmsg = &msgs[i];
 
+		i2c_rpmsg.bus_id = rdata->adapter.nr;
+		i2c_rpmsg.addr = pmsg->addr;
+
 		if (pmsg->flags & I2C_M_RD) {
 			ret = i2c_rpmsg_read(pmsg, &i2c_rpmsg,
 						rdata->adapter.nr, is_last);
-- 
GitLab