mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 08:42:12 +02:00
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: 05e35d4297
("mmc: mmc_spi: Re-write driver using DM framework")
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
This commit is contained in:
@@ -58,12 +58,15 @@
|
|||||||
#define READ_TIMEOUT 3000000 /* 1 sec */
|
#define READ_TIMEOUT 3000000 /* 1 sec */
|
||||||
#define WRITE_TIMEOUT 3000000 /* 1 sec */
|
#define WRITE_TIMEOUT 3000000 /* 1 sec */
|
||||||
|
|
||||||
struct mmc_spi_priv {
|
struct mmc_spi_plat {
|
||||||
struct spi_slave *spi;
|
|
||||||
struct mmc_config cfg;
|
struct mmc_config cfg;
|
||||||
struct mmc mmc;
|
struct mmc mmc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct mmc_spi_priv {
|
||||||
|
struct spi_slave *spi;
|
||||||
|
};
|
||||||
|
|
||||||
static int mmc_spi_sendcmd(struct udevice *dev,
|
static int mmc_spi_sendcmd(struct udevice *dev,
|
||||||
ushort cmdidx, u32 cmdarg, u32 resp_type,
|
ushort cmdidx, u32 cmdarg, u32 resp_type,
|
||||||
u8 *resp, u32 resp_size,
|
u8 *resp, u32 resp_size,
|
||||||
@@ -370,6 +373,7 @@ done:
|
|||||||
static int mmc_spi_probe(struct udevice *dev)
|
static int mmc_spi_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct mmc_spi_priv *priv = dev_get_priv(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);
|
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
@@ -385,28 +389,28 @@ static int mmc_spi_probe(struct udevice *dev)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
sprintf(name, "%s:%s", dev->parent->name, dev->name);
|
sprintf(name, "%s:%s", dev->parent->name, dev->name);
|
||||||
|
|
||||||
priv->cfg.name = name;
|
plat->cfg.name = name;
|
||||||
priv->cfg.host_caps = MMC_MODE_SPI;
|
plat->cfg.host_caps = MMC_MODE_SPI;
|
||||||
priv->cfg.voltages = MMC_SPI_VOLTAGE;
|
plat->cfg.voltages = MMC_SPI_VOLTAGE;
|
||||||
priv->cfg.f_min = MMC_SPI_MIN_CLOCK;
|
plat->cfg.f_min = MMC_SPI_MIN_CLOCK;
|
||||||
priv->cfg.f_max = priv->spi->max_hz;
|
plat->cfg.f_max = priv->spi->max_hz;
|
||||||
priv->cfg.part_type = PART_TYPE_DOS;
|
plat->cfg.part_type = PART_TYPE_DOS;
|
||||||
priv->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
|
plat->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
|
||||||
|
|
||||||
priv->mmc.cfg = &priv->cfg;
|
plat->mmc.cfg = &plat->cfg;
|
||||||
priv->mmc.priv = priv;
|
plat->mmc.priv = priv;
|
||||||
priv->mmc.dev = dev;
|
plat->mmc.dev = dev;
|
||||||
|
|
||||||
upriv->mmc = &priv->mmc;
|
upriv->mmc = &plat->mmc;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mmc_spi_bind(struct udevice *dev)
|
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 = {
|
static const struct dm_mmc_ops mmc_spi_ops = {
|
||||||
@@ -426,5 +430,6 @@ U_BOOT_DRIVER(mmc_spi) = {
|
|||||||
.ops = &mmc_spi_ops,
|
.ops = &mmc_spi_ops,
|
||||||
.probe = mmc_spi_probe,
|
.probe = mmc_spi_probe,
|
||||||
.bind = mmc_spi_bind,
|
.bind = mmc_spi_bind,
|
||||||
|
.platdata_auto_alloc_size = sizeof(struct mmc_spi_plat),
|
||||||
.priv_auto_alloc_size = sizeof(struct mmc_spi_priv),
|
.priv_auto_alloc_size = sizeof(struct mmc_spi_priv),
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user