From: John Jacques <john.jacq...@intel.com>

Signed-off-by: John Jacques <john.jacq...@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

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to