diff mbox series

[v2,2/2] arm: bcm283x: serial: Move ofdata reading to probe() method

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

Commit Message

Simon Glass March 23, 2020, 3:15 a.m. UTC
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(-)

Comments

Matthias Brugger May 4, 2020, 3:08 p.m. UTC | #1
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 mbox series

Patch

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,