]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
board: gateworks: venice: poll I2C lines to wait for GSC firmware
authorTim Harvey <tharvey@gateworks.com>
Fri, 11 Nov 2022 16:03:07 +0000 (08:03 -0800)
committerStefano Babic <sbabic@denx.de>
Tue, 31 Jan 2023 17:08:23 +0000 (18:08 +0100)
In some situations the GSC firmware where the EEPROM containing the
model and DRAM configuration may not be ready by the time the SoC
is ready to talk to it over I2C.

Instead of a hard delay, poll the I2C lines to wait until they are
released to avoid the I2C drivers 'Arbitation lost' error message.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
Reviewed-by: Fabio Estevam <festevam@denx.de>
arch/arm/dts/imx8mm-venice-u-boot.dtsi
arch/arm/dts/imx8mm-venice.dts
arch/arm/dts/imx8mn-venice-u-boot.dtsi
arch/arm/dts/imx8mn-venice.dts
arch/arm/dts/imx8mp-venice-u-boot.dtsi
arch/arm/dts/imx8mp-venice.dts
board/gateworks/venice/spl.c

index 68978a0413ec7890ff278ddd3d87c965bce5a1c3..6f786b9467c277e12479d6f403f267faf8c989d6 100644 (file)
        u-boot,dm-spl;
 };
 
+&pinctrl_i2c1_gpio {
+       u-boot,dm-spl;
+};
+
 &gsc {
        u-boot,dm-spl;
 };
index 39b030691e5304dc6352c7e5a5382051c42a3e35..d0929908ce84a11f5ca5ec8256cb105af7294b34 100644 (file)
 
 &i2c1 {
        clock-frequency = <100000>;
-       pinctrl-names = "default";
+       pinctrl-names = "default", "gpio";
        pinctrl-0 = <&pinctrl_i2c1>;
+       pinctrl-1 = <&pinctrl_i2c1_gpio>;
+       scl-gpios = <&gpio5 14 GPIO_ACTIVE_HIGH>;
+       sda-gpios = <&gpio5 15 GPIO_ACTIVE_HIGH>;
        status = "okay";
 
        gsc: gsc@20 {
                >;
        };
 
+       pinctrl_i2c1_gpio: i2c1grp-gpio-grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_I2C1_SCL_GPIO5_IO14        0x400001c3
+                       MX8MM_IOMUXC_I2C1_SDA_GPIO5_IO15        0x400001c3
+               >;
+       };
+
        pinctrl_i2c2: i2c2grp {
                fsl,pins = <
                        MX8MM_IOMUXC_I2C2_SCL_I2C2_SCL          0x400001c3
index aea48f2d795be8d527039c401c1be28bdb1e3c2f..4af6b8b4ed87feae41ed26f305d4ebd09e4e20a6 100644 (file)
        u-boot,dm-spl;
 };
 
+&pinctrl_i2c1_gpio {
+       u-boot,dm-spl;
+};
+
 &gsc {
        u-boot,dm-spl;
 };
index eeae225632d78fc14611cae4a7dac4d8e819142f..9e31b37f24962e37d2eb858276b1526d3caaaf3a 100644 (file)
 
 &i2c1 {
        clock-frequency = <100000>;
-       pinctrl-names = "default";
+       pinctrl-names = "default", "gpio";
        pinctrl-0 = <&pinctrl_i2c1>;
+       pinctrl-1 = <&pinctrl_i2c1_gpio>;
+       scl-gpios = <&gpio5 14 GPIO_ACTIVE_HIGH>;
+       sda-gpios = <&gpio5 15 GPIO_ACTIVE_HIGH>;
        status = "okay";
 
        gsc: gsc@20 {
                >;
        };
 
+       pinctrl_i2c1_gpio: i2c1grp-gpio-grp {
+               fsl,pins = <
+                       MX8MN_IOMUXC_I2C1_SCL_GPIO5_IO14        0x400001c3
+                       MX8MN_IOMUXC_I2C1_SDA_GPIO5_IO15        0x400001c3
+               >;
+       };
+
        pinctrl_i2c2: i2c2grp {
                fsl,pins = <
                        MX8MN_IOMUXC_I2C2_SCL_I2C2_SCL          0x400001c3
index 96b9fa89cf46bfa92ee4ad4b232b7c7a78cdd57e..f9068ebfbeea3c48d237a38515cb9d42e5851c0e 100644 (file)
        u-boot,dm-spl;
 };
 
+&pinctrl_i2c1_gpio {
+       u-boot,dm-spl;
+};
+
 &gsc {
        u-boot,dm-spl;
 };
index 6b1a7f1a89d46554e6809a1c6774032436ec1a46..77e5ac423db32037bc5d145cb311e6ce56961cb2 100644 (file)
 
 &i2c1 {
        clock-frequency = <100000>;
-       pinctrl-names = "default";
+       pinctrl-names = "default", "gpio";
        pinctrl-0 = <&pinctrl_i2c1>;
+       pinctrl-1 = <&pinctrl_i2c1_gpio>;
+       scl-gpios = <&gpio5 14 GPIO_ACTIVE_HIGH>;
+       sda-gpios = <&gpio5 15 GPIO_ACTIVE_HIGH>;
        status = "okay";
 
        gsc: gsc@20 {
                >;
        };
 
+       pinctrl_i2c1_gpio: i2c1grp-gpio-grp {
+               fsl,pins = <
+                       MX8MP_IOMUXC_I2C1_SCL__GPIO5_IO14       0x400001c3
+                       MX8MP_IOMUXC_I2C1_SDA__GPIO5_IO15       0x400001c3
+               >;
+       };
+
        pinctrl_i2c2: i2c2grp {
                fsl,pins = <
                        MX8MP_IOMUXC_I2C2_SCL__I2C2_SCL         0x400001c3
index 60830766ca92a4d9cb63d82a7f5403900faeed5e..4eb7bdfcee674f46eb3258370a0118d71be22e3e 100644 (file)
 #include <asm/arch/imx8mp_pins.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/mach-imx/boot_mode.h>
+#include <asm/mach-imx/mxc_i2c.h>
 #include <asm/arch/ddr.h>
 #include <asm-generic/gpio.h>
 #include <dm/uclass.h>
 #include <dm/device.h>
+#include <dm/pinctrl.h>
 #include <linux/delay.h>
 #include <power/bd71837.h>
 #include <power/mp5416.h>
@@ -215,8 +217,8 @@ static int power_init_board(void)
 
 void board_init_f(ulong dummy)
 {
-       struct udevice *dev;
-       int ret;
+       struct udevice *bus, *dev;
+       int i, ret;
        int dram_sz;
 
        arch_cpu_init();
@@ -247,19 +249,28 @@ void board_init_f(ulong dummy)
         *
         * On a board with a missing/depleted backup battery for GSC, the
         * board may be ready to probe the GSC before its firmware is
-        * running. We will wait here indefinately for the GSC EEPROM.
-        */
-#ifdef CONFIG_IMX8MN
-       /*
-        * IMX8MN boots quicker than IMX8MM and exposes issue
-        * where because GSC I2C state machine isn't running and its
-        * SCL/SDA are driven low the I2C driver spams 'Arbitration lost'
-        * I2C errors.
-        *
-        * TODO: Put a loop here that somehow waits for I2C CLK/DAT to be high
+        * running. Wait here for 50ms for the GSC firmware to let go of
+        * the SCL/SDA lines to avoid the i2c driver spamming
+        * 'Arbitration lost' I2C errors
         */
-       mdelay(50);
-#endif
+       if (!uclass_get_device_by_seq(UCLASS_I2C, 0, &bus)) {
+               if (!pinctrl_select_state(bus, "gpio")) {
+                       struct mxc_i2c_bus *i2c_bus = dev_get_priv(bus);
+                       struct gpio_desc *scl_gpio = &i2c_bus->scl_gpio;
+                       struct gpio_desc *sda_gpio = &i2c_bus->sda_gpio;
+
+                       dm_gpio_set_dir_flags(scl_gpio, GPIOD_IS_IN);
+                       dm_gpio_set_dir_flags(sda_gpio, GPIOD_IS_IN);
+                       for (i = 0; i < 5; i++) {
+                               if (dm_gpio_get_value(scl_gpio) &&
+                                   dm_gpio_get_value(sda_gpio))
+                                       break;
+                               mdelay(10);
+                       }
+                       pinctrl_select_state(bus, "default");
+               }
+       }
+       /* Wait indefiniately until the GSC probes */
        while (1) {
                if (!uclass_get_device_by_driver(UCLASS_MISC, DM_DRIVER_GET(gsc), &dev))
                        break;