diff --git a/drivers/i2c/busses/i2c-rpmsg-imx.c b/drivers/i2c/busses/i2c-rpmsg-imx.c index a978b61e74178680a0228d268f36d69a7f7b8393..9d0561f8cb194106db32b88f5a70ed26ae810129 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);