Skip to content
Snippets Groups Projects
Commit d592afe9 authored by Clark Wang's avatar Clark Wang
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>
parent 426f0642
No related branches found
No related tags found
No related merge requests found
...@@ -108,6 +108,7 @@ struct i2c_rpmsg_info { ...@@ -108,6 +108,7 @@ struct i2c_rpmsg_info {
struct device *dev; struct device *dev;
struct i2c_rpmsg_msg *msg; struct i2c_rpmsg_msg *msg;
struct completion cmd_complete; struct completion cmd_complete;
struct mutex lock;
}; };
static struct i2c_rpmsg_info i2c_rpmsg; static struct i2c_rpmsg_info i2c_rpmsg;
...@@ -271,6 +272,7 @@ static int i2c_rpmsg_probe(struct rpmsg_device *rpdev) ...@@ -271,6 +272,7 @@ static int i2c_rpmsg_probe(struct rpmsg_device *rpdev)
i2c_rpmsg.rpdev = rpdev; i2c_rpmsg.rpdev = rpdev;
mutex_init(&i2c_rpmsg.lock);
init_completion(&i2c_rpmsg.cmd_complete); init_completion(&i2c_rpmsg.cmd_complete);
dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n", dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n",
...@@ -309,6 +311,8 @@ static int i2c_rpbus_xfer(struct i2c_adapter *adapter, ...@@ -309,6 +311,8 @@ static int i2c_rpbus_xfer(struct i2c_adapter *adapter,
int i, ret; int i, ret;
bool is_last = false; bool is_last = false;
mutex_lock(&i2c_rpmsg.lock);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
if (i == num - 1) if (i == num - 1)
is_last = true; is_last = true;
...@@ -318,18 +322,23 @@ static int i2c_rpbus_xfer(struct i2c_adapter *adapter, ...@@ -318,18 +322,23 @@ static int i2c_rpbus_xfer(struct i2c_adapter *adapter,
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);
if (ret < 0) if (ret < 0) {
mutex_unlock(&i2c_rpmsg.lock);
return ret; return ret;
}
pmsg->len = ret; pmsg->len = ret;
} else { } else {
ret = i2c_rpmsg_write(pmsg, &i2c_rpmsg, ret = i2c_rpmsg_write(pmsg, &i2c_rpmsg,
rdata->adapter.nr, is_last); rdata->adapter.nr, is_last);
if (ret < 0) if (ret < 0) {
mutex_unlock(&i2c_rpmsg.lock);
return ret; return ret;
}
} }
} }
mutex_unlock(&i2c_rpmsg.lock);
return num; 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