[U-Boot,1/1] i2c: mvtwsi.c: Fix set speed

Message ID 1518506860-4734-1-git-send-email-stefan@olimex.com
State Awaiting Upstream
Delegated to: Heiko Schocher
Headers show
Series
  • [U-Boot,1/1] i2c: mvtwsi.c: Fix set speed
Related show

Commit Message

Stefan Mavrodiev Feb. 13, 2018, 7:27 a.m.
Previous patch for this driver breaks i2c initialization.

commit 8bcf12ccce89 ("i2c: mvtwsi.c: Avoid NULL dereference")

If actual_speed is passed as NULL in this function:
static void __twsi_i2c_init(struct mvtwsi_registers *twsi, int speed,
			    int slaveadd, uint *actual_speed)
than __twsi_i2c_set_bus_speed never get called. This causes i2c clock
to run on default speed - 2MHz (measured with oscilloscope). This is issue
on some boards, sunxi for example, since on I2C0 bus PMU is connected.

The bootlogs with and without the patch are as follows:

Wihtout the patch:
U-Boot SPL 2018.03-rc2 (Feb 13 2018 - 09:23:17 +0200)
DRAM: 1024 MiB
Failed to set core voltage! Can't set CPU frequency
Trying to boot from FEL

U-Boot 2018.03-rc2 (Feb 13 2018 - 09:23:17 +0200) Allwinner Technology

CPU:   Allwinner A20 (SUN7I)
Model: Olimex A20-OLinuXino-LIME2
I2C:   ready
DRAM:  1 GiB
MMC:   SUNXI SD/MMC: 0

With the patch:
U-Boot SPL 2018.03-rc2-00001-g838ff85 (Feb 13 2018 - 09:24:34 +0200)
DRAM: 1024 MiB
CPU: 912000000Hz, AXI/AHB/APB: 3/2/2
Trying to boot from FEL

U-Boot 2018.03-rc2-00001-g838ff85 (Feb 13 2018 - 09:24:34 +0200) Allwinner Technology

CPU:   Allwinner A20 (SUN7I)
Model: Olimex A20-OLinuXino-LIME2
I2C:   ready
DRAM:  1 GiB
MMC:   SUNXI SD/MMC: 0

Signed-off-by: Stefan Mavrodiev <stefan@olimex.com>
---
 drivers/i2c/mvtwsi.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Heiko Schocher Feb. 13, 2018, 9:01 a.m. | #1
Hello Stefan,

Am 13.02.2018 um 08:27 schrieb Stefan Mavrodiev:
> Previous patch for this driver breaks i2c initialization.
> 
> commit 8bcf12ccce89 ("i2c: mvtwsi.c: Avoid NULL dereference")
> 
> If actual_speed is passed as NULL in this function:
> static void __twsi_i2c_init(struct mvtwsi_registers *twsi, int speed,
> 			    int slaveadd, uint *actual_speed)
> than __twsi_i2c_set_bus_speed never get called. This causes i2c clock
> to run on default speed - 2MHz (measured with oscilloscope). This is issue
> on some boards, sunxi for example, since on I2C0 bus PMU is connected.
> 
> The bootlogs with and without the patch are as follows:
> 
> Wihtout the patch:
> U-Boot SPL 2018.03-rc2 (Feb 13 2018 - 09:23:17 +0200)
> DRAM: 1024 MiB
> Failed to set core voltage! Can't set CPU frequency
> Trying to boot from FEL
> 
> U-Boot 2018.03-rc2 (Feb 13 2018 - 09:23:17 +0200) Allwinner Technology
> 
> CPU:   Allwinner A20 (SUN7I)
> Model: Olimex A20-OLinuXino-LIME2
> I2C:   ready
> DRAM:  1 GiB
> MMC:   SUNXI SD/MMC: 0
> 
> With the patch:
> U-Boot SPL 2018.03-rc2-00001-g838ff85 (Feb 13 2018 - 09:24:34 +0200)
> DRAM: 1024 MiB
> CPU: 912000000Hz, AXI/AHB/APB: 3/2/2
> Trying to boot from FEL
> 
> U-Boot 2018.03-rc2-00001-g838ff85 (Feb 13 2018 - 09:24:34 +0200) Allwinner Technology
> 
> CPU:   Allwinner A20 (SUN7I)
> Model: Olimex A20-OLinuXino-LIME2
> I2C:   ready
> DRAM:  1 GiB
> MMC:   SUNXI SD/MMC: 0
> 
> Signed-off-by: Stefan Mavrodiev <stefan@olimex.com>
> ---
>   drivers/i2c/mvtwsi.c | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)

Thanks for testing!

Reviewed-by: Heiko Schocher <hs@denx.de>

bye,
Heiko
Heiko Schocher Feb. 19, 2018, 12:52 p.m. | #2
Hello Stefan,

Am 13.02.2018 um 08:27 schrieb Stefan Mavrodiev:
> Previous patch for this driver breaks i2c initialization.
> 
> commit 8bcf12ccce89 ("i2c: mvtwsi.c: Avoid NULL dereference")
> 
> If actual_speed is passed as NULL in this function:
> static void __twsi_i2c_init(struct mvtwsi_registers *twsi, int speed,
> 			    int slaveadd, uint *actual_speed)
> than __twsi_i2c_set_bus_speed never get called. This causes i2c clock
> to run on default speed - 2MHz (measured with oscilloscope). This is issue
> on some boards, sunxi for example, since on I2C0 bus PMU is connected.
> 
> The bootlogs with and without the patch are as follows:
> 
> Wihtout the patch:
> U-Boot SPL 2018.03-rc2 (Feb 13 2018 - 09:23:17 +0200)
> DRAM: 1024 MiB
> Failed to set core voltage! Can't set CPU frequency
> Trying to boot from FEL
> 
> U-Boot 2018.03-rc2 (Feb 13 2018 - 09:23:17 +0200) Allwinner Technology
> 
> CPU:   Allwinner A20 (SUN7I)
> Model: Olimex A20-OLinuXino-LIME2
> I2C:   ready
> DRAM:  1 GiB
> MMC:   SUNXI SD/MMC: 0
> 
> With the patch:
> U-Boot SPL 2018.03-rc2-00001-g838ff85 (Feb 13 2018 - 09:24:34 +0200)
> DRAM: 1024 MiB
> CPU: 912000000Hz, AXI/AHB/APB: 3/2/2
> Trying to boot from FEL
> 
> U-Boot 2018.03-rc2-00001-g838ff85 (Feb 13 2018 - 09:24:34 +0200) Allwinner Technology
> 
> CPU:   Allwinner A20 (SUN7I)
> Model: Olimex A20-OLinuXino-LIME2
> I2C:   ready
> DRAM:  1 GiB
> MMC:   SUNXI SD/MMC: 0
> 
> Signed-off-by: Stefan Mavrodiev <stefan@olimex.com>
> ---
>   drivers/i2c/mvtwsi.c | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)

Thanks for fixing. Applied to u-boot-i2c master

bye,
Heiko

Patch

diff --git a/drivers/i2c/mvtwsi.c b/drivers/i2c/mvtwsi.c
index 30bee0d..38bca89 100644
--- a/drivers/i2c/mvtwsi.c
+++ b/drivers/i2c/mvtwsi.c
@@ -487,11 +487,14 @@  static uint __twsi_i2c_set_bus_speed(struct mvtwsi_registers *twsi,
 static void __twsi_i2c_init(struct mvtwsi_registers *twsi, int speed,
 			    int slaveadd, uint *actual_speed)
 {
+	uint tmp_speed;
+
 	/* Reset controller */
 	twsi_reset(twsi);
 	/* Set speed */
+	tmp_speed = __twsi_i2c_set_bus_speed(twsi, speed);
 	if (actual_speed)
-		*actual_speed = __twsi_i2c_set_bus_speed(twsi, speed);
+		*actual_speed = tmp_speed;
 	/* Set slave address; even though we don't use it */
 	writel(slaveadd, &twsi->slave_address);
 	writel(0, &twsi->xtnd_slave_addr);