diff options
author | Simon Glass <sjg@chromium.org> | 2020-03-22 21:15:53 -0600 |
---|---|---|
committer | Matthias Brugger <mbrugger@suse.com> | 2020-05-12 10:59:12 +0200 |
commit | 0ed0db985abaa95a326ebfd268785e0b310d9d5d (patch) | |
tree | 3da5e926b926d2f5db107a73ee696c7ae817b28b | |
parent | 6cbb41432d3af94861568c3cfb057c3d9cbd994b (diff) |
arm: bcm283x: serial: Move ofdata reading to probe() method
We cannot rely on a parent bus that needs to be probed, until we know that
it is probed. That means that code in the ofdata_to_platdata() method
cannot rely on the parent bus being probed.
Move the ofdata code in the two serial drivers into a probe() method.
This fixes serial output on rpi_3b_32b with the following config.txt
options:
enable_uart=1
gpu_freq=250
Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Matthias Brugger <mbrugger@suse.com>
-rw-r--r-- | drivers/serial/serial_bcm283x_mu.c | 21 | ||||
-rw-r--r-- | drivers/serial/serial_bcm283x_pl011.c | 12 |
2 files changed, 17 insertions, 16 deletions
diff --git a/drivers/serial/serial_bcm283x_mu.c b/drivers/serial/serial_bcm283x_mu.c index a6ffc84b96..febb5ceea2 100644 --- a/drivers/serial/serial_bcm283x_mu.c +++ b/drivers/serial/serial_bcm283x_mu.c @@ -74,16 +74,6 @@ out: return 0; } -static int bcm283x_mu_serial_probe(struct udevice *dev) -{ - struct bcm283x_mu_serial_platdata *plat = dev_get_platdata(dev); - struct bcm283x_mu_priv *priv = dev_get_priv(dev); - - priv->regs = (struct bcm283x_mu_regs *)plat->base; - - return 0; -} - static int bcm283x_mu_serial_getc(struct udevice *dev) { struct bcm283x_mu_priv *priv = dev_get_priv(dev); @@ -165,15 +155,21 @@ static bool bcm283x_is_serial_muxed(void) return true; } -static int bcm283x_mu_serial_ofdata_to_platdata(struct udevice *dev) +static int bcm283x_mu_serial_probe(struct udevice *dev) { struct bcm283x_mu_serial_platdata *plat = dev_get_platdata(dev); + struct bcm283x_mu_priv *priv = dev_get_priv(dev); fdt_addr_t addr; /* Don't spawn the device if it's not muxed */ if (!bcm283x_is_serial_muxed()) return -ENODEV; + /* + * Read the ofdata here rather than in an ofdata_to_platdata() method + * since we need the soc simple-bus to be probed so that the 'ranges' + * property is used. + */ addr = devfdt_get_addr(dev); if (addr == FDT_ADDR_T_NONE) return -EINVAL; @@ -187,6 +183,8 @@ static int bcm283x_mu_serial_ofdata_to_platdata(struct udevice *dev) */ plat->skip_init = true; + priv->regs = (struct bcm283x_mu_regs *)plat->base; + return 0; } #endif @@ -195,7 +193,6 @@ U_BOOT_DRIVER(serial_bcm283x_mu) = { .name = "serial_bcm283x_mu", .id = UCLASS_SERIAL, .of_match = of_match_ptr(bcm283x_mu_serial_id), - .ofdata_to_platdata = of_match_ptr(bcm283x_mu_serial_ofdata_to_platdata), .platdata_auto_alloc_size = sizeof(struct bcm283x_mu_serial_platdata), .probe = bcm283x_mu_serial_probe, .ops = &bcm283x_mu_serial_ops, diff --git a/drivers/serial/serial_bcm283x_pl011.c b/drivers/serial/serial_bcm283x_pl011.c index 7d8ab7b716..923f402fbe 100644 --- a/drivers/serial/serial_bcm283x_pl011.c +++ b/drivers/serial/serial_bcm283x_pl011.c @@ -33,7 +33,7 @@ static bool bcm283x_is_serial_muxed(void) return true; } -static int bcm283x_pl011_serial_ofdata_to_platdata(struct udevice *dev) +static int bcm283x_pl011_serial_probe(struct udevice *dev) { struct pl01x_serial_platdata *plat = dev_get_platdata(dev); int ret; @@ -42,6 +42,11 @@ static int bcm283x_pl011_serial_ofdata_to_platdata(struct udevice *dev) if (!bcm283x_is_serial_muxed()) return -ENODEV; + /* + * Read the ofdata here rather than in an ofdata_to_platdata() method + * since we need the soc simple-bus to be probed so that the 'ranges' + * property is used. + */ ret = pl01x_serial_ofdata_to_platdata(dev); if (ret) return ret; @@ -52,7 +57,7 @@ static int bcm283x_pl011_serial_ofdata_to_platdata(struct udevice *dev) */ plat->skip_init = true; - return 0; + return pl01x_serial_probe(dev); } static int bcm283x_pl011_serial_setbrg(struct udevice *dev, int baudrate) @@ -86,9 +91,8 @@ U_BOOT_DRIVER(bcm283x_pl011_uart) = { .name = "bcm283x_pl011", .id = UCLASS_SERIAL, .of_match = of_match_ptr(bcm283x_pl011_serial_id), - .ofdata_to_platdata = of_match_ptr(bcm283x_pl011_serial_ofdata_to_platdata), + .probe = bcm283x_pl011_serial_probe, .platdata_auto_alloc_size = sizeof(struct pl01x_serial_platdata), - .probe = pl01x_serial_probe, .ops = &bcm283x_pl011_serial_ops, #if !CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_BOARD) .flags = DM_FLAG_PRE_RELOC, |