i2c: designware: fix race between subsequent xfers
authorChristian Ruppert <christian.ruppert@abilis.com>
Fri, 7 Jun 2013 08:51:23 +0000 (10:51 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Sat, 15 Jun 2013 11:04:32 +0000 (13:04 +0200)
commit38d7fadef4973bb94e36897fcb6bb6a12fdd10c9
tree3f42a138a920735fcdfad05862636903ff13c827
parent8419c8debdc600b71fb89f0ffad80a6f436d80fe
i2c: designware: fix race between subsequent xfers

The designware block is not always properly disabled in the case of
transfer errors. Interrupts from aborted transfers might be handled
after the data structures for the following transfer are initialised but
before the hardware is set up. This can corrupt the data structures to
the point that the system is stuck in an infinite interrupt loop (where
FIFOs are never emptied because dev->msg_read_idx == dev->msgs_num).

This patch cleanly disables the designware-i2c hardware at the end of
every transfer, be it successful or not.

Signed-off-by: Christian Ruppert <christian.ruppert@abilis.com>
[wsa: extended the comment]
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-designware-core.c