
This still looks a bit strange. Looking at the Linux driver, there is no delay after reading the control register. But its using interrupts and therefore an implicit delay is added before this interrupt service routine is called (instead of the busy loop here in the U-Boot driver).
Exactly my opinion as well.
BTW: Whats the value of "tick" in twsi_wait() in your case?
requested I2C freq is 100000 Hz, actual 97656 Hz (nearest lower possible). This calculates the tick to 10340 ns with calc_tick, and u-boot sleeps for 11 ms (DIV_ROUND_UP).
When tick was 10 ms this bug did not occur, because of the different timing when the control value was read it already was set for a while by the controller, it seems.
Btw should I sent these first 14 patches with Reviewed-by tags?
Marek