aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/busses/i2c-designware-baytrail.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/i2c/busses/i2c-designware-baytrail.c')
-rw-r--r--drivers/i2c/busses/i2c-designware-baytrail.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-designware-baytrail.c b/drivers/i2c/busses/i2c-designware-baytrail.c
index 036d9bdc0aaa..7d7ae97476e2 100644
--- a/drivers/i2c/busses/i2c-designware-baytrail.c
+++ b/drivers/i2c/busses/i2c-designware-baytrail.c
@@ -68,6 +68,8 @@ static int baytrail_i2c_acquire(struct dw_i2c_dev *dev)
68 int ret; 68 int ret;
69 unsigned long start, end; 69 unsigned long start, end;
70 70
71 might_sleep();
72
71 if (!dev || !dev->dev) 73 if (!dev || !dev->dev)
72 return -ENODEV; 74 return -ENODEV;
73 75
@@ -85,7 +87,7 @@ static int baytrail_i2c_acquire(struct dw_i2c_dev *dev)
85 /* host driver waits for bit 0 to be set in semaphore register */ 87 /* host driver waits for bit 0 to be set in semaphore register */
86 start = jiffies; 88 start = jiffies;
87 end = start + msecs_to_jiffies(SEMAPHORE_TIMEOUT); 89 end = start + msecs_to_jiffies(SEMAPHORE_TIMEOUT);
88 while (!time_after(jiffies, end)) { 90 do {
89 ret = get_sem(dev->dev, &sem); 91 ret = get_sem(dev->dev, &sem);
90 if (!ret && sem) { 92 if (!ret && sem) {
91 acquired = jiffies; 93 acquired = jiffies;
@@ -95,7 +97,7 @@ static int baytrail_i2c_acquire(struct dw_i2c_dev *dev)
95 } 97 }
96 98
97 usleep_range(1000, 2000); 99 usleep_range(1000, 2000);
98 } 100 } while (time_before(jiffies, end));
99 101
100 dev_err(dev->dev, "punit semaphore timed out, resetting\n"); 102 dev_err(dev->dev, "punit semaphore timed out, resetting\n");
101 reset_semaphore(dev->dev); 103 reset_semaphore(dev->dev);