mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-26 09:01:35 +00:00
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:
parent
6cbb41432d
commit
0ed0db985a
2 changed files with 17 additions and 16 deletions
drivers/serial
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Reference in a new issue