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