Message ID | 20200322211547.v2.2.Ib891385efaf9651e06d947cbd36d3ccb8bd2d283@changeid |
---|---|
State | Accepted |
Commit | 0ed0db985abaa95a326ebfd268785e0b310d9d5d |
Headers | show |
Series | [v2,1/2] arm: dts: bcm283x: Allow UARTs to work before relocation | expand |
On 23/03/2020 04:15, Simon Glass wrote: > 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 at chromium.org> Pushed not to rpi-next, sorry for the delay and thanks for the patch :) > --- > > Changes in v2: > - Add new patch to move ofdata reading to probe() method > > drivers/serial/serial_bcm283x_mu.c | 21 +++++++++------------ > 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, >
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,
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 at chromium.org> --- Changes in v2: - Add new patch to move ofdata reading to probe() method drivers/serial/serial_bcm283x_mu.c | 21 +++++++++------------ drivers/serial/serial_bcm283x_pl011.c | 12 ++++++++---- 2 files changed, 17 insertions(+), 16 deletions(-)