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