diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2015-02-10 12:06:10 -0500 |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2015-03-06 19:08:26 -0500 |
commit | ebf2ef8f613433aaffac53aef2f6703445821fc6 (patch) | |
tree | f6e0d87de4c2532d3bab76885038a13159a7c844 | |
parent | 30be774b38d845791b1acbd750f19e56c57f0185 (diff) |
i2c: designware-baytrail: baytrail_i2c_acquire() might sleep
This patch marks baytrail_i2c_acquire() that it might sleep. Also it chages
while-loop to do-while and, though it is matter of taste, gives a chance to
check one more time before report a timeout.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: David E. Box <david.e.box@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r-- | drivers/i2c/busses/i2c-designware-baytrail.c | 6 |
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); |