Switch the R-Mobile A1, R-Mobile APE6, and SH-Mobile AG5 SoCs to the new frequency calculation formula, to (a) avoid running the I2C bus too fast, and (b) bring the low/high ratio closer to the recommended ratio 5/4. Measurement results on R-Mobile APE6 and SH-Mobile AG5 (fck=104 MHz, clks_per_count=2): 100 kHz: 106 kHz LH=1.12 before, 99.6 kHz L/H=1.22 after 400 kHz: 384 kHz LH=1.67 before, 392 kHz L/H=1.27 after Measurement results on R-Mobile A1 (fck=49.5 MHz, clks_per_count=1): 100 kHz: 106 kHz L/H=1.09 before, 99.6 kHz L/H=1.20 after Signed-off-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> --- Measurements after applying "[PATCH 1/3] ARM: dts: renesas: r8a73a4: Fix external clocks and clock rate"[1]. Before, the clock rates were even 4% higher. Notes: - fast_clock_dt_config is now unused, so I guess we should drop it, and rename v2_freq_calc_dt_config to fast_clock_dt_config? - The formulas in the documentation for R-Mobile A1 do not include the "-1" and "-5", presumably this is for rounding? - The formulas in the documentation for SH-Mobile AG5 include the "-1" and "-5" in the example for 400 kHz, but not in the example for 100 kHz. - The SH-Mobile AG5 documentation suggests to use an L/H ratio of 5/3 instead of 5/4 for 400 kHz, which means the old formula is better for 400 kHz? - Remaining users of the old formula are sh7343, sh7366, and sh772[234]. At least for sh772[234], the "Transfer Rate" formula in the documentation is the same as for R-Mobile A1. Hence probably we should switch the default_dt_config and the default fallback to the "v2" formula, too? - I am still a bit puzzled, as the "v2" formula introduced in commit 4ecfb9d3b229fff5 ("i2c: sh_mobile: add new frequency calculation for later SoC") is basically what the driver did before commit 23a612916a51cc37 ("i2c: i2c-sh_mobile: optimize ICCH/ICCL values according to I2C bus speed")? [1] https://lore.kernel.org/r/1692bc8cd465d62168cbf110522ad62a7af3f606.1705315614.git.geert+renesas@xxxxxxxxx --- drivers/i2c/busses/i2c-sh_mobile.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index 5adbe62cf6212865..9e2e12d482d8e640 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c @@ -773,7 +773,7 @@ static int sh_mobile_i2c_r8a7740_workaround(struct sh_mobile_i2c_data *pd) iic_wr(pd, ICCR, ICCR_TRS); udelay(10); - return sh_mobile_i2c_init(pd); + return sh_mobile_i2c_v2_init(pd); } static const struct sh_mobile_dt_config default_dt_config = { @@ -797,7 +797,7 @@ static const struct sh_mobile_dt_config r8a7740_dt_config = { }; static const struct of_device_id sh_mobile_i2c_dt_ids[] = { - { .compatible = "renesas,iic-r8a73a4", .data = &fast_clock_dt_config }, + { .compatible = "renesas,iic-r8a73a4", .data = &v2_freq_calc_dt_config }, { .compatible = "renesas,iic-r8a7740", .data = &r8a7740_dt_config }, { .compatible = "renesas,iic-r8a774c0", .data = &v2_freq_calc_dt_config }, { .compatible = "renesas,iic-r8a7790", .data = &v2_freq_calc_dt_config }, @@ -807,7 +807,7 @@ static const struct of_device_id sh_mobile_i2c_dt_ids[] = { { .compatible = "renesas,iic-r8a7794", .data = &v2_freq_calc_dt_config }, { .compatible = "renesas,iic-r8a7795", .data = &v2_freq_calc_dt_config }, { .compatible = "renesas,iic-r8a77990", .data = &v2_freq_calc_dt_config }, - { .compatible = "renesas,iic-sh73a0", .data = &fast_clock_dt_config }, + { .compatible = "renesas,iic-sh73a0", .data = &v2_freq_calc_dt_config }, { .compatible = "renesas,rcar-gen2-iic", .data = &v2_freq_calc_dt_config }, { .compatible = "renesas,rcar-gen3-iic", .data = &v2_freq_calc_dt_config }, { .compatible = "renesas,rmobile-iic", .data = &default_dt_config }, -- 2.34.1