[PATCH v2 2/2] arm: bcm283x: serial: Move ofdata reading to probe() method
Matthias Brugger
mbrugger at suse.com
Mon May 4 17:08:58 CEST 2020
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,
>
More information about the U-Boot
mailing list