[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