diff --git a/drivers/i2c/busses/i2c-rpmsg-imx.c b/drivers/i2c/busses/i2c-rpmsg-imx.c
index 37f39609da2ea5cbf1cd9cefdd3188068448f1fc..a978b61e74178680a0228d268f36d69a7f7b8393 100644
--- a/drivers/i2c/busses/i2c-rpmsg-imx.c
+++ b/drivers/i2c/busses/i2c-rpmsg-imx.c
@@ -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;
 }