i2c: mvtwsi.c: Fix set speed
authorStefan Mavrodiev <stefan@olimex.com>
Tue, 13 Feb 2018 07:27:40 +0000 (09:27 +0200)
committerHeiko Schocher <hs@denx.de>
Mon, 19 Feb 2018 07:21:38 +0000 (08:21 +0100)
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>
Reviewed-by: Heiko Schocher <hs@denx.de>
drivers/i2c/mvtwsi.c

index 30bee0d52e598d281df2679c7a5a0bce7865e70a..38bca897458661aa652e635bc252895fecdad812 100644 (file)
@@ -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);