Type "UM10204" into Google, download and read this cover to cover if you haven't already:
https://www.nxp.com/docs/en/user-guide/UM10204.pdf
That explains the SMBUS timeout and the minimum frequency requirements (of that variant).
You can get noise causing errors on I2C that can cause lockups. The only way out of this is to have software timeouts. That's what some of those timeouts are for.
It also explains the need for special Resets in I2C. If the CPU is reset part way through an I2C transaction, the bus is now solidly locked. You either need reset pins on all I2C peripherals (almost none have these), or you need to force at least 9 clocks on the bus to clear it on power-on. Pretty much no I2C controller supports this feature, so you have to have separate hardware to do this, or an I2C interface you can program as a GPIO and bit-bang that sequence. This is an original "design bug" in I2C that has taken over 30 years to get fixed in the drivers in Linux. And in many distributions it hasn't been fixed yet.
You can find details on this and more in this post here that I responded to (2013 to 2017):
I2C reset
Also an earlier (2012) one:
Problems with I2C on MCF5208
> _i2c_delay_1bit()
Interesting. No idea. Is there anything like that in the Linux sources? Yes, there is:
/*
* There dummy delay is calculated.
* It should be about one I2C clock period long.
* This delay is used in I2C bus disable function
* to fix chip hardware bug.
*/
i2c_imx->disable_delay = (500000U * i2c_clk_div[i].div
+ (i2c_clk_rate / 2) - 1) / (i2c_clk_rate / 2);
...
/*
* This delay caused by an i.MXL hardware bug.
* If no (or too short) delay, no "STOP" bit will be generated.
*/
udelay(i2c_imx->disable_delay);
It is possible the I2C controller is so old it was being used in the days of 1 MHz 6800's and also in slow 68HC11's, and those CPUs weren't fast enough to show these problems. Nobody would have expected the same hardware to be driven by a 1.2GHz i.MX CPU, or a 150MHz MCF52xx chip.
> I don't see anything about that in the specs
There are quite a few examples of things like that posted in these forums. You should search to see if anyone else has asked that question, and post back here if you find anything.
> Digging around some more in the forums, I found a file called AN4342
Could you add links to any interesting posts you found to this post? Searching for "AN4342" I found 18.
Tom