> Subject: [PATCH] dm: mmc_spi: Fix NULL pointer dereference in
> mmc_spi_bind()
> 
> The mmc_spi driver's priv is not available in its bind phase(). Use platdata
> instead.
> 
> Fixes: 05e35d429745 ("mmc: mmc_spi: Re-write driver using DM framework")
> Signed-off-by: Bin Meng <bmeng...@gmail.com>
> ---
> 
>  drivers/mmc/mmc_spi.c | 35 ++++++++++++++++++++---------------
>  1 file changed, 20 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/mmc/mmc_spi.c b/drivers/mmc/mmc_spi.c index
> 350812a..c693fb2 100644
> --- a/drivers/mmc/mmc_spi.c
> +++ b/drivers/mmc/mmc_spi.c
> @@ -58,12 +58,15 @@
>  #define READ_TIMEOUT                 3000000 /* 1 sec */
>  #define WRITE_TIMEOUT                        3000000 /* 1 sec */
> 
> -struct mmc_spi_priv {
> -     struct spi_slave *spi;
> +struct mmc_spi_plat {
>       struct mmc_config cfg;
>       struct mmc mmc;
>  };
> 
> +struct mmc_spi_priv {
> +     struct spi_slave *spi;
> +};
> +
>  static int mmc_spi_sendcmd(struct udevice *dev,
>                          ushort cmdidx, u32 cmdarg, u32 resp_type,
>                          u8 *resp, u32 resp_size,
> @@ -370,6 +373,7 @@ done:
>  static int mmc_spi_probe(struct udevice *dev)  {
>       struct mmc_spi_priv *priv = dev_get_priv(dev);
> +     struct mmc_spi_plat *plat = dev_get_platdata(dev);
>       struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
>       char *name;
> 
> @@ -385,28 +389,28 @@ static int mmc_spi_probe(struct udevice *dev)
>               return -ENOMEM;
>       sprintf(name, "%s:%s", dev->parent->name, dev->name);
> 
> -     priv->cfg.name = name;
> -     priv->cfg.host_caps = MMC_MODE_SPI;
> -     priv->cfg.voltages = MMC_SPI_VOLTAGE;
> -     priv->cfg.f_min = MMC_SPI_MIN_CLOCK;
> -     priv->cfg.f_max = priv->spi->max_hz;
> -     priv->cfg.part_type = PART_TYPE_DOS;
> -     priv->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
> +     plat->cfg.name = name;
> +     plat->cfg.host_caps = MMC_MODE_SPI;
> +     plat->cfg.voltages = MMC_SPI_VOLTAGE;
> +     plat->cfg.f_min = MMC_SPI_MIN_CLOCK;
> +     plat->cfg.f_max = priv->spi->max_hz;
> +     plat->cfg.part_type = PART_TYPE_DOS;
> +     plat->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
> 
> -     priv->mmc.cfg = &priv->cfg;
> -     priv->mmc.priv = priv;
> -     priv->mmc.dev = dev;
> +     plat->mmc.cfg = &plat->cfg;
> +     plat->mmc.priv = priv;
> +     plat->mmc.dev = dev;
> 
> -     upriv->mmc = &priv->mmc;
> +     upriv->mmc = &plat->mmc;
> 
>       return 0;
>  }
> 
>  static int mmc_spi_bind(struct udevice *dev)  {
> -     struct mmc_spi_priv *priv = dev_get_priv(dev);
> +     struct mmc_spi_plat *plat = dev_get_platdata(dev);
> 
> -     return mmc_bind(dev, &priv->mmc, &priv->cfg);
> +     return mmc_bind(dev, &plat->mmc, &plat->cfg);
>  }
> 
>  static const struct dm_mmc_ops mmc_spi_ops = { @@ -426,5 +430,6 @@
> U_BOOT_DRIVER(mmc_spi) = {
>       .ops = &mmc_spi_ops,
>       .probe = mmc_spi_probe,
>       .bind = mmc_spi_bind,
> +     .platdata_auto_alloc_size = sizeof(struct mmc_spi_plat),
>       .priv_auto_alloc_size = sizeof(struct mmc_spi_priv),  };

Reviewed-by: Peng Fan <peng....@nxp.com>

> --
> 2.7.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to