[U-Boot] [PATCH] i2c: mvtwsi: Fix delay time for Turris Omnia
Stefan Roese
sr at denx.de
Mon Apr 29 07:28:44 UTC 2019
Hi Marek,
(added Heiko to Cc)
On 25.04.19 15:22, Marek BehĂșn wrote:
> Commit c68c6243 ("i2c: mvtwsi: Make delay times frequency-dependent")
> broke the default configuration of the Turris Omnia target.
>
> With i2c frequency at 100kHz the twsi_wait function call to ndelay(tick)
> the tick variable is computed to 10340 (nanoseconds). Since ndelay
> calls udelay(DIV_ROUND_UP(10340, 1000), the result is udelay(11).
>
> For some reason this sometimes (cca every third boot) breaks the i2c
> controller on Turris Omnia completely (even kernel cannot use it, and
> soft reset does not help, only complete power off).
>
> Microcontroller watchdog cannot be disabled without i2c and the device
> is unusable.
>
> The original commit message mentions erratum FE-8471889. This is weird
> since Linux does not enable this erratum workaround for armada-38x. But
> the commit message says that it was tested on Armada MV88F6820.
>
> I therefore fix this in this unclean way only for Turris Omnia, because
> I do not know if it would not break other devices.
>
> Signed-off-by: Marek BehĂșn <marek.behun at nic.cz>
> Cc: Mario Six <mario.six at gdsys.cc>
> Cc: Stefan Roese <sr at denx.de>
> ---
> drivers/i2c/mvtwsi.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/i2c/mvtwsi.c b/drivers/i2c/mvtwsi.c
> index b0f7c3e057..ef269f3b0c 100644
> --- a/drivers/i2c/mvtwsi.c
> +++ b/drivers/i2c/mvtwsi.c
> @@ -176,9 +176,13 @@ enum mvtwsi_ack_flags {
> */
> inline uint calc_tick(uint speed)
> {
> +#ifdef CONFIG_TARGET_TURRIS_OMNIA
> + return 10000;
> +#else
> /* One tick = the duration of a period at the specified speed in ns (we
> * add 100 ns to be on the safe side) */
> return (1000000000u / speed) + 100;
> +#endif
> }
>
> #ifndef CONFIG_DM_I2C
>
I would really like not to see such board specific code added to this
driver.
Frankly, I fail to understand why used udelay(11) instead of udelay(10)
should result in such a difference on your board. Could you please
investigate a bit more and hopefully come up with a "better" solution
for this issue?
Thanks,
Stefan
More information about the U-Boot
mailing list