
Hello Marek,
Am 01.05.2019 um 23:09 schrieb Marek BehĂșn:
The twsi_wait function reads the control register for interrupt flag, and if interrupt flag is present, it immediately reads status register.
On our device this sometimes causes bad value being read from status register, as if the value was not yet updated.
My theory is that the controller does approximately this:
- sets interrupt flag in control register,
- sets the value of status register,
- causes an interrupt
In U-Boot we do not use interrupts, so I think that it is possible that sometimes the status register in the twsi_wait function is read between points 1 and 2.
The bug does not appear if I add a small delay before reading status register.
Wait 100ns (which in U-Boot currently means 1 us, because ndelay(i) function calls udelay(DIV_ROUND_UP(i, 1000))) before reading the status register.
Signed-off-by: Marek BehĂșn marek.behun@nic.cz Acked-by: Heiko Schocher hs@denx.de Cc: Mario Six mario.six@gdsys.cc Cc: Stefan Roese sr@denx.de Cc: Baruch Siach baruch@tkos.co.il
drivers/i2c/mvtwsi.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
Thanks for adding the comment
Reviewed-by: Heiko Schocher hs@denx.de
bye, Heiko