arm: bcm283x: serial: Move ofdata reading to probe() method
authorSimon Glass <sjg@chromium.org>
Mon, 23 Mar 2020 03:15:53 +0000 (21:15 -0600)
committerMatthias Brugger <mbrugger@suse.com>
Tue, 12 May 2020 08:59:12 +0000 (10:59 +0200)
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>
drivers/serial/serial_bcm283x_mu.c
drivers/serial/serial_bcm283x_pl011.c

index a6ffc84b963e8468d2691bd5927132f50f68d2b3..febb5ceea2a53bcce4342a86e48407400de583f2 100644 (file)
@@ -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,
index 7d8ab7b71613a13c07446ba47a3faa59682320d0..923f402fbe9d43bec802b008ec16337102a35f50 100644 (file)
@@ -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,