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>
This commit is contained in:
Simon Glass 2020-03-22 21:15:53 -06:00 committed by Matthias Brugger
parent 6cbb41432d
commit 0ed0db985a
2 changed files with 17 additions and 16 deletions

View file

@ -74,16 +74,6 @@ out:
return 0; 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) static int bcm283x_mu_serial_getc(struct udevice *dev)
{ {
struct bcm283x_mu_priv *priv = dev_get_priv(dev); struct bcm283x_mu_priv *priv = dev_get_priv(dev);
@ -165,15 +155,21 @@ static bool bcm283x_is_serial_muxed(void)
return true; 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_serial_platdata *plat = dev_get_platdata(dev);
struct bcm283x_mu_priv *priv = dev_get_priv(dev);
fdt_addr_t addr; fdt_addr_t addr;
/* Don't spawn the device if it's not muxed */ /* Don't spawn the device if it's not muxed */
if (!bcm283x_is_serial_muxed()) if (!bcm283x_is_serial_muxed())
return -ENODEV; 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); addr = devfdt_get_addr(dev);
if (addr == FDT_ADDR_T_NONE) if (addr == FDT_ADDR_T_NONE)
return -EINVAL; return -EINVAL;
@ -187,6 +183,8 @@ static int bcm283x_mu_serial_ofdata_to_platdata(struct udevice *dev)
*/ */
plat->skip_init = true; plat->skip_init = true;
priv->regs = (struct bcm283x_mu_regs *)plat->base;
return 0; return 0;
} }
#endif #endif
@ -195,7 +193,6 @@ U_BOOT_DRIVER(serial_bcm283x_mu) = {
.name = "serial_bcm283x_mu", .name = "serial_bcm283x_mu",
.id = UCLASS_SERIAL, .id = UCLASS_SERIAL,
.of_match = of_match_ptr(bcm283x_mu_serial_id), .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), .platdata_auto_alloc_size = sizeof(struct bcm283x_mu_serial_platdata),
.probe = bcm283x_mu_serial_probe, .probe = bcm283x_mu_serial_probe,
.ops = &bcm283x_mu_serial_ops, .ops = &bcm283x_mu_serial_ops,

View file

@ -33,7 +33,7 @@ static bool bcm283x_is_serial_muxed(void)
return true; 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); struct pl01x_serial_platdata *plat = dev_get_platdata(dev);
int ret; int ret;
@ -42,6 +42,11 @@ static int bcm283x_pl011_serial_ofdata_to_platdata(struct udevice *dev)
if (!bcm283x_is_serial_muxed()) if (!bcm283x_is_serial_muxed())
return -ENODEV; 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); ret = pl01x_serial_ofdata_to_platdata(dev);
if (ret) if (ret)
return ret; return ret;
@ -52,7 +57,7 @@ static int bcm283x_pl011_serial_ofdata_to_platdata(struct udevice *dev)
*/ */
plat->skip_init = true; plat->skip_init = true;
return 0; return pl01x_serial_probe(dev);
} }
static int bcm283x_pl011_serial_setbrg(struct udevice *dev, int baudrate) static int bcm283x_pl011_serial_setbrg(struct udevice *dev, int baudrate)
@ -86,9 +91,8 @@ U_BOOT_DRIVER(bcm283x_pl011_uart) = {
.name = "bcm283x_pl011", .name = "bcm283x_pl011",
.id = UCLASS_SERIAL, .id = UCLASS_SERIAL,
.of_match = of_match_ptr(bcm283x_pl011_serial_id), .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), .platdata_auto_alloc_size = sizeof(struct pl01x_serial_platdata),
.probe = pl01x_serial_probe,
.ops = &bcm283x_pl011_serial_ops, .ops = &bcm283x_pl011_serial_ops,
#if !CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_BOARD) #if !CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_BOARD)
.flags = DM_FLAG_PRE_RELOC, .flags = DM_FLAG_PRE_RELOC,