tmp_suning_uos_patched/drivers/i2c
Paul Walmsley 0cbbcffdf5 i2c-omap: Close suspected race between omap_i2c_idle() and omap_i2c_isr()
omap_i2c_idle() sets an internal flag, "dev->idle", instructing its
ISR to decline interrupts.  It sets this flag before it actually masks
the interrupts on the I2C controller.  This is problematic, since an
I2C interrupt could arrive after dev->idle is set, but before the
interrupt source is masked.  When this happens, Linux disables the I2C
controller's IRQ, causing all future transactions on the bus to fail.

Symptoms, happening on about 7% of boots:

   irq 56: nobody cared (try booting with the "irqpoll" option)
   <warning traceback here>
   Disabling IRQ #56
   i2c_omap i2c_omap.1: controller timed out

In omap_i2c_idle(), this patch sets dev->idle only after the interrupt
mask write to the I2C controller has left the ARM write buffer.
That's probably the major offender.  For additional prophylaxis, in
omap_i2c_unidle(), the patch clears the dev->idle flag before
interrupts are enabled, rather than afterwards.

The patch has survived twenty-two reboots on the 3430SDP here without
wedging I2C1.  Not absolutely dispositive, but promising!

Signed-off-by: Paul Walmsley <paul@pwsan.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2008-11-21 13:39:45 -08:00
..
algos i2c-algo-pcf: Fix typo in debugging log message 2008-10-22 20:21:30 +02:00
busses i2c-omap: Close suspected race between omap_i2c_idle() and omap_i2c_isr() 2008-11-21 13:39:45 -08:00
chips i2c: Inform about deprecated chips directory 2008-10-22 20:21:33 +02:00
i2c-boardinfo.c i2c: Add i2c_board_info and i2c_new_device() 2007-05-01 23:26:31 +02:00
i2c-core.c i2c: Add info->archdata field 2008-10-22 20:21:33 +02:00
i2c-core.h i2c: Add i2c_board_info and i2c_new_device() 2007-05-01 23:26:31 +02:00
i2c-dev.c device create: misc: convert device_create_drvdata to device_create 2008-10-16 09:24:43 -07:00
Kconfig i2c: Let users select algorithm drivers manually again 2008-08-10 22:56:15 +02:00
Makefile i2c: Add i2c_board_info and i2c_new_device() 2007-05-01 23:26:31 +02:00