gpio: Remove DM_FLAG_PRE_RELOC flag in various drivers
authorBin Meng <bmeng.cn@gmail.com>
Wed, 24 Oct 2018 13:36:30 +0000 (06:36 -0700)
committerSimon Glass <sjg@chromium.org>
Wed, 14 Nov 2018 17:16:28 +0000 (09:16 -0800)
When a driver declares DM_FLAG_PRE_RELOC flag, it wishes to be
bound before relocation. However due to a bug in the DM core,
the flag only takes effect when devices are statically declared
via U_BOOT_DEVICE(). This bug has been fixed recently by commit
"dm: core: Respect drivers with the DM_FLAG_PRE_RELOC flag in
lists_bind_fdt()", but with the fix, it has a side effect that
all existing drivers that declared DM_FLAG_PRE_RELOC flag will
be bound before relocation now. This may expose potential boot
failure on some boards due to insufficient memory during the
pre-relocation stage.

To mitigate this potential impact, the following changes are
implemented:

- Remove DM_FLAG_PRE_RELOC flag in the driver, if the driver
  only supports configuration from device tree (OF_CONTROL)
- Keep DM_FLAG_PRE_RELOC flag in the driver only if the device
  is statically declared via U_BOOT_DEVICE()
- Surround DM_FLAG_PRE_RELOC flag with OF_CONTROL check, for
  drivers that support both statically declared devices and
  configuration from device tree

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Patrick Delaunay <patrick.delaunay@st.com>
drivers/gpio/omap_gpio.c
drivers/gpio/stm32f7_gpio.c
drivers/gpio/tegra186_gpio.c
drivers/gpio/tegra_gpio.c

index 555eba26622e81a7ea1201522fea4460607db266..0031415d03eff9ad00f29d0f0519d67611cca2a8 100644 (file)
@@ -372,7 +372,9 @@ U_BOOT_DRIVER(gpio_omap) = {
        .ops    = &gpio_omap_ops,
        .probe  = omap_gpio_probe,
        .priv_auto_alloc_size = sizeof(struct gpio_bank),
+#if !CONFIG_IS_ENABLED(OF_CONTROL)
        .flags = DM_FLAG_PRE_RELOC,
+#endif
 };
 
 #endif /* CONFIG_DM_GPIO */
index 4c0786fff88da382e3be6db392f53dc062b2d84f..b903dc46b33e967e88d44d25d878e5df9d260ea8 100644 (file)
@@ -123,6 +123,6 @@ U_BOOT_DRIVER(gpio_stm32) = {
        .of_match = stm32_gpio_ids,
        .probe  = gpio_stm32_probe,
        .ops    = &gpio_stm32_ops,
-       .flags  = DM_FLAG_PRE_RELOC | DM_UC_FLAG_SEQ_ALIAS,
+       .flags  = DM_UC_FLAG_SEQ_ALIAS,
        .priv_auto_alloc_size   = sizeof(struct stm32_gpio_priv),
 };
index 1f0e8d51dadacaf56d752e762a466956e4deb7e7..6626b5415a389d97176032e29f92e7bb1dafbd7d 100644 (file)
@@ -281,5 +281,4 @@ U_BOOT_DRIVER(tegra186_gpio) = {
        .bind = tegra186_gpio_bind,
        .probe = tegra186_gpio_probe,
        .ops = &tegra186_gpio_ops,
-       .flags = DM_FLAG_PRE_RELOC,
 };
index 302efddc2729aa00b3598d35342e1a8adb77994c..a730f5c4fec0903fd3aa9f7d2be82a06b3f25538 100644 (file)
@@ -378,5 +378,4 @@ U_BOOT_DRIVER(gpio_tegra) = {
        .probe = gpio_tegra_probe,
        .priv_auto_alloc_size = sizeof(struct tegra_port_info),
        .ops    = &gpio_tegra_ops,
-       .flags  = DM_FLAG_PRE_RELOC,
 };