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:
Masahiro Yamada 2016-09-14 01:06:03 +09:00
parent 375241f39b
commit 14f4723466
3 changed files with 26 additions and 26 deletions

View File

@ -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

View File

@ -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.

View File

@ -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,
}; };