i2c: s3c2410: use exponential back off while polling for bus idle
authorDaniel Kurtz <djkurtz@chromium.org>
Thu, 15 Nov 2012 12:13:32 +0000 (17:43 +0530)
committerWolfram Sang <w.sang@pengutronix.de>
Fri, 16 Nov 2012 12:09:33 +0000 (13:09 +0100)
commitfe724bf9f023384eb14431c0e49ec46017ba8e30
tree8d860dd007fdf966375260697a1f5a1e6ed5400b
parent0da2e7768b4c2b4dbbb148ebe1606b6b4698fca2
i2c: s3c2410: use exponential back off while polling for bus idle

Usually, the i2c controller has finished emitting the i2c STOP before the
driver reaches the bus idle polling loop.  Optimize for this most common
case by reading IICSTAT first and potentially skipping the loop.

If the cpu is faster than the hardware, we wait for bus idle in a polling
loop.  However, since the duration of one iteration of the loop is
dependent on cpu freq, and this i2c IP is used on many different systems,
use a time based loop timeout (5 ms).

We would like very low latencies to detect bus idle for the normal
'fast' case.  However, if a device is slow to release the bus for some
reason, it could hold off the STOP generation for up to several
milliseconds.  Rapidly polling for bus idle would seriously load the CPU
while waiting for it to release the bus.  So, use a partial exponential
backoff as a compromise between idle detection latency and cpu load.

Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Signed-off-by: Naveen Krishna Chatradhi <ch.naveen@samsung.com>
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
drivers/i2c/busses/i2c-s3c2410.c