Skip to content
Snippets Groups Projects
Commit a18db58b authored by Clark Wang's avatar Clark Wang Committed by Dong Aisheng
Browse files

MLK-21023 i2c: rpmsg-imx: add mutex lock when transfer i2c messages


I2c_lock_bus function in i2c-core-base will not stop the transfer to
different devices on different buses at the same time.

Since the multiple rpmsg i2c buses share one rpmsg channel, so it has to
add mutex to protect rpmsg resource accessing.

Signed-off-by: default avatarClark Wang <xiaoning.wang@nxp.com>
(cherry picked from commit d592afe9)
(cherry picked from commit 44622ff8)
parent 95e82052
No related branches found
No related tags found
No related merge requests found
......@@ -108,6 +108,7 @@ struct i2c_rpmsg_info {
struct device *dev;
struct i2c_rpmsg_msg *msg;
struct completion cmd_complete;
struct mutex lock;
};
static struct i2c_rpmsg_info i2c_rpmsg;
......@@ -271,6 +272,7 @@ static int i2c_rpmsg_probe(struct rpmsg_device *rpdev)
i2c_rpmsg.rpdev = rpdev;
mutex_init(&i2c_rpmsg.lock);
init_completion(&i2c_rpmsg.cmd_complete);
dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n",
......@@ -309,6 +311,8 @@ static int i2c_rpbus_xfer(struct i2c_adapter *adapter,
int i, ret;
bool is_last = false;
mutex_lock(&i2c_rpmsg.lock);
for (i = 0; i < num; i++) {
if (i == num - 1)
is_last = true;
......@@ -318,18 +322,23 @@ static int i2c_rpbus_xfer(struct i2c_adapter *adapter,
if (pmsg->flags & I2C_M_RD) {
ret = i2c_rpmsg_read(pmsg, &i2c_rpmsg,
rdata->adapter.nr, is_last);
if (ret < 0)
if (ret < 0) {
mutex_unlock(&i2c_rpmsg.lock);
return ret;
}
pmsg->len = ret;
} else {
ret = i2c_rpmsg_write(pmsg, &i2c_rpmsg,
rdata->adapter.nr, is_last);
if (ret < 0)
if (ret < 0) {
mutex_unlock(&i2c_rpmsg.lock);
return ret;
}
}
}
mutex_unlock(&i2c_rpmsg.lock);
return num;
}
......
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