[linux-yocto] [PATCH 2/4] drivers/i2c: Add a Lock to the Axxia Driver

Daniel Dragomir daniel.dragomir at windriver.com
Wed Jun 1 08:12:30 PDT 2016


From: John Jacques <john.jacques at intel.com>

Signed-off-by: John Jacques <john.jacques at intel.com>
---
 drivers/i2c/busses/i2c-axxia.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/i2c/busses/i2c-axxia.c b/drivers/i2c/busses/i2c-axxia.c
index 6c84826..598cc4e 100644
--- a/drivers/i2c/busses/i2c-axxia.c
+++ b/drivers/i2c/busses/i2c-axxia.c
@@ -127,6 +127,8 @@ struct axxia_i2c_dev {
 	int irq;
 	/* current i2c bus clock rate */
 	u32 bus_clk_rate;
+	/* transaction lock */
+	struct mutex i2c_lock;
 };
 
 static void
@@ -406,6 +408,8 @@ axxia_i2c_xfer_msg(struct axxia_i2c_dev *idev, struct i2c_msg *msg)
 	if (msg->len == 0 || msg->len > 255)
 		return -EINVAL;
 
+	mutex_lock(&idev->i2c_lock);
+
 	idev->msg      = msg;
 	idev->msg_xfrd = 0;
 	idev->msg_err  = 0;
@@ -476,14 +480,17 @@ axxia_i2c_xfer_msg(struct axxia_i2c_dev *idev, struct i2c_msg *msg)
 	if (ret == 0) {
 		dev_warn(idev->dev, "xfer timeout (%#x)\n", msg->addr);
 		axxia_i2c_init(idev);
+		mutex_unlock(&idev->i2c_lock);
 		return -ETIMEDOUT;
 	}
 
 	if (unlikely(idev->msg_err != 0)) {
 		axxia_i2c_init(idev);
+		mutex_unlock(&idev->i2c_lock);
 		return -EIO;
 	}
 
+	mutex_unlock(&idev->i2c_lock);
 	return 0;
 }
 
@@ -600,6 +607,8 @@ axxia_i2c_probe(struct platform_device *pdev)
 	idev->adapter.dev.parent = &pdev->dev;
 	idev->adapter.dev.of_node = pdev->dev.of_node;
 
+	mutex_init(&idev->i2c_lock);
+
 	ret = i2c_add_adapter(&idev->adapter);
 	if (ret) {
 		dev_err(&pdev->dev, "Failed to add I2C adapter\n");
-- 
1.9.1



More information about the linux-yocto mailing list