mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-11-29 06:31:28 +01:00
mmc: uniphier-sd: migrate to CONFIG_BLK
This is the state-of-the-art MMC driver implementation. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
375241f39b
commit
14f4723466
@ -855,6 +855,7 @@ config TARGET_COLIBRI_PXA270
|
|||||||
|
|
||||||
config ARCH_UNIPHIER
|
config ARCH_UNIPHIER
|
||||||
bool "Socionext UniPhier SoCs"
|
bool "Socionext UniPhier SoCs"
|
||||||
|
select BLK
|
||||||
select CLK_UNIPHIER
|
select CLK_UNIPHIER
|
||||||
select DM
|
select DM
|
||||||
select DM_GPIO
|
select DM_GPIO
|
||||||
|
|||||||
@ -80,6 +80,7 @@ config ROCKCHIP_SDHCI
|
|||||||
config MMC_UNIPHIER
|
config MMC_UNIPHIER
|
||||||
bool "UniPhier SD/MMC Host Controller support"
|
bool "UniPhier SD/MMC Host Controller support"
|
||||||
depends on ARCH_UNIPHIER
|
depends on ARCH_UNIPHIER
|
||||||
|
depends on BLK
|
||||||
select DM_MMC_OPS
|
select DM_MMC_OPS
|
||||||
help
|
help
|
||||||
This selects support for the SD/MMC Host Controller on UniPhier SoCs.
|
This selects support for the SD/MMC Host Controller on UniPhier SoCs.
|
||||||
|
|||||||
@ -119,9 +119,12 @@ DECLARE_GLOBAL_DATA_PTR;
|
|||||||
/* alignment required by the DMA engine of this controller */
|
/* alignment required by the DMA engine of this controller */
|
||||||
#define UNIPHIER_SD_DMA_MINALIGN 0x10
|
#define UNIPHIER_SD_DMA_MINALIGN 0x10
|
||||||
|
|
||||||
struct uniphier_sd_priv {
|
struct uniphier_sd_plat {
|
||||||
struct mmc_config cfg;
|
struct mmc_config cfg;
|
||||||
struct mmc *mmc;
|
struct mmc mmc;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct uniphier_sd_priv {
|
||||||
void __iomem *regbase;
|
void __iomem *regbase;
|
||||||
unsigned long mclk;
|
unsigned long mclk;
|
||||||
unsigned int version;
|
unsigned int version;
|
||||||
@ -654,8 +657,16 @@ static void uniphier_sd_host_init(struct uniphier_sd_priv *priv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int uniphier_sd_bind(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct uniphier_sd_plat *plat = dev_get_platdata(dev);
|
||||||
|
|
||||||
|
return mmc_bind(dev, &plat->mmc, &plat->cfg);
|
||||||
|
}
|
||||||
|
|
||||||
static int uniphier_sd_probe(struct udevice *dev)
|
static int uniphier_sd_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
|
struct uniphier_sd_plat *plat = dev_get_platdata(dev);
|
||||||
struct uniphier_sd_priv *priv = dev_get_priv(dev);
|
struct uniphier_sd_priv *priv = dev_get_priv(dev);
|
||||||
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
||||||
fdt_addr_t base;
|
fdt_addr_t base;
|
||||||
@ -691,15 +702,15 @@ static int uniphier_sd_probe(struct udevice *dev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->cfg.name = dev->name;
|
plat->cfg.name = dev->name;
|
||||||
priv->cfg.host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
plat->cfg.host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
||||||
|
|
||||||
switch (fdtdec_get_int(gd->fdt_blob, dev->of_offset, "bus-width", 1)) {
|
switch (fdtdec_get_int(gd->fdt_blob, dev->of_offset, "bus-width", 1)) {
|
||||||
case 8:
|
case 8:
|
||||||
priv->cfg.host_caps |= MMC_MODE_8BIT;
|
plat->cfg.host_caps |= MMC_MODE_8BIT;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
priv->cfg.host_caps |= MMC_MODE_4BIT;
|
plat->cfg.host_caps |= MMC_MODE_4BIT;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
break;
|
break;
|
||||||
@ -722,27 +733,13 @@ static int uniphier_sd_probe(struct udevice *dev)
|
|||||||
|
|
||||||
uniphier_sd_host_init(priv);
|
uniphier_sd_host_init(priv);
|
||||||
|
|
||||||
priv->cfg.voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34;
|
plat->cfg.voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||||
priv->cfg.f_min = priv->mclk /
|
plat->cfg.f_min = priv->mclk /
|
||||||
(priv->caps & UNIPHIER_SD_CAP_DIV1024 ? 1024 : 512);
|
(priv->caps & UNIPHIER_SD_CAP_DIV1024 ? 1024 : 512);
|
||||||
priv->cfg.f_max = priv->mclk;
|
plat->cfg.f_max = priv->mclk;
|
||||||
priv->cfg.b_max = U32_MAX; /* max value of UNIPHIER_SD_SECCNT */
|
plat->cfg.b_max = U32_MAX; /* max value of UNIPHIER_SD_SECCNT */
|
||||||
|
|
||||||
priv->mmc = mmc_create(&priv->cfg, priv);
|
upriv->mmc = &plat->mmc;
|
||||||
if (!priv->mmc)
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
upriv->mmc = priv->mmc;
|
|
||||||
priv->mmc->dev = dev;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int uniphier_sd_remove(struct udevice *dev)
|
|
||||||
{
|
|
||||||
struct uniphier_sd_priv *priv = dev_get_priv(dev);
|
|
||||||
|
|
||||||
mmc_destroy(priv->mmc);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -756,8 +753,9 @@ U_BOOT_DRIVER(uniphier_mmc) = {
|
|||||||
.name = "uniphier-mmc",
|
.name = "uniphier-mmc",
|
||||||
.id = UCLASS_MMC,
|
.id = UCLASS_MMC,
|
||||||
.of_match = uniphier_sd_match,
|
.of_match = uniphier_sd_match,
|
||||||
|
.bind = uniphier_sd_bind,
|
||||||
.probe = uniphier_sd_probe,
|
.probe = uniphier_sd_probe,
|
||||||
.remove = uniphier_sd_remove,
|
|
||||||
.priv_auto_alloc_size = sizeof(struct uniphier_sd_priv),
|
.priv_auto_alloc_size = sizeof(struct uniphier_sd_priv),
|
||||||
|
.platdata_auto_alloc_size = sizeof(struct uniphier_sd_plat),
|
||||||
.ops = &uniphier_sd_ops,
|
.ops = &uniphier_sd_ops,
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user