aboutsummaryrefslogtreecommitdiff
path: root/drivers/serial/serial_bcm283x_pl011.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2020-03-22 21:15:53 -0600
committerMatthias Brugger <mbrugger@suse.com>2020-05-12 10:59:12 +0200
commit0ed0db985abaa95a326ebfd268785e0b310d9d5d (patch)
tree3da5e926b926d2f5db107a73ee696c7ae817b28b /drivers/serial/serial_bcm283x_pl011.c
parent6cbb41432d3af94861568c3cfb057c3d9cbd994b (diff)
downloadu-boot-0ed0db985abaa95a326ebfd268785e0b310d9d5d.zip
u-boot-0ed0db985abaa95a326ebfd268785e0b310d9d5d.tar.gz
u-boot-0ed0db985abaa95a326ebfd268785e0b310d9d5d.tar.bz2
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>
Diffstat (limited to 'drivers/serial/serial_bcm283x_pl011.c')
-rw-r--r--drivers/serial/serial_bcm283x_pl011.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/serial/serial_bcm283x_pl011.c b/drivers/serial/serial_bcm283x_pl011.c
index 7d8ab7b..923f402 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,