]> pilppa.com Git - linux-2.6-omap-h63xx.git/commit
i2c-omap: fix I2C timeouts due to recursive omap_i2c_{un,}idle()
authorPaul Walmsley <paul@pwsan.com>
Fri, 10 Oct 2008 16:58:30 +0000 (10:58 -0600)
committerTony Lindgren <tony@atomide.com>
Sat, 11 Oct 2008 14:43:27 +0000 (17:43 +0300)
commit663715fc55ea5d292171c6934a2b91d8f4874171
treefbe792b59b3aac33a66413b29b2929addcb83df0
parent3c0134484bd5fe3c3d9611aab1983881efc894c0
i2c-omap: fix I2C timeouts due to recursive omap_i2c_{un,}idle()

omap_i2c_unidle() and omap_i2c_idle() are called recursively during
omap_i2c_probe().  This is evidently unexpected and will wipe
out the I2C interrupt enable register the second time that
omap_i2c_idle() is called consecutively.  Any I2C transactions
following a probe of a bus with at least one device on it will then
time out.

Fix by moving omap_i2c_idle() further up in omap_i2c_probe().  Ensure
the I2C controller is marked as idle before the probe starts.  Also
attempt to catch future reappearances of this bug early in development
by warning in omap_i2c_{un,}idle() when they are called recursively.

Problem reported by David Brownell <david-b@pacbell.net>.

Tested on 3430SDP and 2430SDP.

Signed-off-by: Paul Walmsley <paul@pwsan.com>
Cc: David Brownell <david-b@pacbell.net>
Cc: Richard Woodruff <r-woodruff2@ti.com>
Acked-by; Steve Sakoman <steve@sakoman.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
drivers/i2c/busses/i2c-omap.c