[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