Skip to content
Snippets Groups Projects
Commit 222e201b authored by Clark Wang's avatar Clark Wang
Browse files

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: default avatarClark Wang <xiaoning.wang@nxp.com>
parent 871aae0d
No related branches found
No related tags found
No related merge requests found
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
#include <linux/rpmsg.h> #include <linux/rpmsg.h>
#define I2C_RPMSG_MAX_BUF_SIZE 16 #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_CATEGORY 0x09
#define I2C_RPMSG_VERSION 0x0001 #define I2C_RPMSG_VERSION 0x0001
...@@ -109,6 +109,9 @@ struct i2c_rpmsg_info { ...@@ -109,6 +109,9 @@ struct i2c_rpmsg_info {
struct i2c_rpmsg_msg *msg; struct i2c_rpmsg_msg *msg;
struct completion cmd_complete; struct completion cmd_complete;
struct mutex lock; struct mutex lock;
u8 bus_id;
u16 addr;
}; };
static struct i2c_rpmsg_info i2c_rpmsg; static struct i2c_rpmsg_info i2c_rpmsg;
...@@ -125,6 +128,13 @@ static int i2c_rpmsg_cb(struct rpmsg_device *rpdev, void *data, int len, ...@@ -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) if (msg->header.type != I2C_RPMSG_TYPE_RESPONSE)
return -EINVAL; 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) { if (msg->len > I2C_RPMSG_MAX_BUF_SIZE) {
dev_err(&rpdev->dev, dev_err(&rpdev->dev,
"%s failed: data length greater than %d, len=%d\n", "%s failed: data length greater than %d, len=%d\n",
...@@ -319,6 +329,9 @@ static int i2c_rpbus_xfer(struct i2c_adapter *adapter, ...@@ -319,6 +329,9 @@ static int i2c_rpbus_xfer(struct i2c_adapter *adapter,
pmsg = &msgs[i]; pmsg = &msgs[i];
i2c_rpmsg.bus_id = rdata->adapter.nr;
i2c_rpmsg.addr = pmsg->addr;
if (pmsg->flags & I2C_M_RD) { if (pmsg->flags & I2C_M_RD) {
ret = i2c_rpmsg_read(pmsg, &i2c_rpmsg, ret = i2c_rpmsg_read(pmsg, &i2c_rpmsg,
rdata->adapter.nr, is_last); rdata->adapter.nr, is_last);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment