public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Gregory CLEMENT <gregory.clement@bootlin.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] spi: soft_spi: Fix null ptr when probing soft_spi.
Date: Wed, 26 Dec 2018 16:37:36 +0100	[thread overview]
Message-ID: <877efwb8ov.fsf@bootlin.com> (raw)
In-Reply-To: <1545231209-32505-1-git-send-email-horatiu.vultur@microchip.com> (Horatiu Vultur's message of "Wed, 19 Dec 2018 15:53:29 +0100")

Hi Horatiu,

I am adding Daniel because actually this patch is needed to be able to
boot the Luton MIPS based platform. It is on this platform that we find
this issue.

Gregory
 
 On mer., déc. 19 2018, Horatiu Vultur <horatiu.vultur@microchip.com> wrote:

> When probing soft_spi the result of dev_get_parent_priv(dev) in probe
> function is null ptr because the spi is on the ahb bus which has
> per_child_auto_alloc_size set to 0. Therefore it would generate an Ooops
> messages when accessing spi_slave structure.
>
> The fix consist of delaying the read of dm_spi_slave_platdata until a
> child under the spi is probed, to be able to read SPI mode. Therefore
> implement .child_pre_probe in which updates soft_spi_platdata based on
> child dm_spi_slave_platdata.
>
> Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
> ---
>  drivers/spi/soft_spi.c | 24 +++++++++++++++++-------
>  1 file changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/spi/soft_spi.c b/drivers/spi/soft_spi.c
> index b06883f..e28591b 100644
> --- a/drivers/spi/soft_spi.c
> +++ b/drivers/spi/soft_spi.c
> @@ -210,18 +210,13 @@ static int soft_spi_ofdata_to_platdata(struct udevice *dev)
>  
>  static int soft_spi_probe(struct udevice *dev)
>  {
> -	struct spi_slave *slave = dev_get_parent_priv(dev);
>  	struct soft_spi_platdata *plat = dev->platdata;
> -	int cs_flags, clk_flags;
>  	int ret;
>  
> -	cs_flags = (slave->mode & SPI_CS_HIGH) ? 0 : GPIOD_ACTIVE_LOW;
> -	clk_flags = (slave->mode & SPI_CPOL) ? GPIOD_ACTIVE_LOW : 0;
> -
>  	if (gpio_request_by_name(dev, "cs-gpios", 0, &plat->cs,
> -				 GPIOD_IS_OUT | cs_flags) ||
> +				 GPIOD_IS_OUT) ||
>  	    gpio_request_by_name(dev, "gpio-sck", 0, &plat->sclk,
> -				 GPIOD_IS_OUT | clk_flags))
> +				 GPIOD_IS_OUT))
>  		return -EINVAL;
>  
>  	ret = gpio_request_by_name(dev, "gpio-mosi", 0, &plat->mosi,
> @@ -241,6 +236,20 @@ static int soft_spi_probe(struct udevice *dev)
>  	return 0;
>  }
>  
> +static int soft_spi_child_pre_probe(struct udevice *dev)
> +{
> +	struct udevice *bus = dev_get_parent(dev);
> +	struct dm_spi_slave_platdata *slave = dev_get_parent_platdata(dev);
> +	struct soft_spi_platdata *plat = bus->platdata;
> +
> +	if (!(slave->mode & SPI_CS_HIGH))
> +		plat->cs.flags |= GPIOD_ACTIVE_LOW;
> +	if (slave->mode & SPI_CPOL)
> +		plat->sclk.flags |= GPIOD_ACTIVE_LOW;
> +
> +	return 0;
> +}
> +
>  static const struct udevice_id soft_spi_ids[] = {
>  	{ .compatible = "spi-gpio" },
>  	{ }
> @@ -254,5 +263,6 @@ U_BOOT_DRIVER(soft_spi) = {
>  	.ofdata_to_platdata = soft_spi_ofdata_to_platdata,
>  	.platdata_auto_alloc_size = sizeof(struct soft_spi_platdata),
>  	.priv_auto_alloc_size = sizeof(struct soft_spi_priv),
> +	.child_pre_probe = soft_spi_child_pre_probe,
>  	.probe	= soft_spi_probe,
>  };
> -- 
> 2.7.4
>

-- 
Gregory Clement, Bootlin
Embedded Linux and Kernel engineering
http://bootlin.com

  parent reply	other threads:[~2018-12-26 15:37 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-19 14:53 [U-Boot] [PATCH] spi: soft_spi: Fix null ptr when probing soft_spi Horatiu Vultur
2018-12-23 20:42 ` Jagan Teki
2018-12-26 15:37 ` Gregory CLEMENT [this message]
2018-12-29 10:31 ` Daniel Schwierzeck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=877efwb8ov.fsf@bootlin.com \
    --to=gregory.clement@bootlin.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox