|
@@ -119,9 +119,12 @@ DECLARE_GLOBAL_DATA_PTR;
|
|
|
/* alignment required by the DMA engine of this controller */
|
|
|
#define UNIPHIER_SD_DMA_MINALIGN 0x10
|
|
|
|
|
|
-struct uniphier_sd_priv {
|
|
|
+struct uniphier_sd_plat {
|
|
|
struct mmc_config cfg;
|
|
|
- struct mmc *mmc;
|
|
|
+ struct mmc mmc;
|
|
|
+};
|
|
|
+
|
|
|
+struct uniphier_sd_priv {
|
|
|
void __iomem *regbase;
|
|
|
unsigned long mclk;
|
|
|
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)
|
|
|
{
|
|
|
+ struct uniphier_sd_plat *plat = dev_get_platdata(dev);
|
|
|
struct uniphier_sd_priv *priv = dev_get_priv(dev);
|
|
|
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
|
|
fdt_addr_t base;
|
|
@@ -691,15 +702,15 @@ static int uniphier_sd_probe(struct udevice *dev)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- priv->cfg.name = dev->name;
|
|
|
- priv->cfg.host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
|
|
+ plat->cfg.name = dev->name;
|
|
|
+ plat->cfg.host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
|
|
|
|
|
switch (fdtdec_get_int(gd->fdt_blob, dev->of_offset, "bus-width", 1)) {
|
|
|
case 8:
|
|
|
- priv->cfg.host_caps |= MMC_MODE_8BIT;
|
|
|
+ plat->cfg.host_caps |= MMC_MODE_8BIT;
|
|
|
break;
|
|
|
case 4:
|
|
|
- priv->cfg.host_caps |= MMC_MODE_4BIT;
|
|
|
+ plat->cfg.host_caps |= MMC_MODE_4BIT;
|
|
|
break;
|
|
|
case 1:
|
|
|
break;
|
|
@@ -722,27 +733,13 @@ static int uniphier_sd_probe(struct udevice *dev)
|
|
|
|
|
|
uniphier_sd_host_init(priv);
|
|
|
|
|
|
- priv->cfg.voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34;
|
|
|
- priv->cfg.f_min = priv->mclk /
|
|
|
+ plat->cfg.voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34;
|
|
|
+ plat->cfg.f_min = priv->mclk /
|
|
|
(priv->caps & UNIPHIER_SD_CAP_DIV1024 ? 1024 : 512);
|
|
|
- priv->cfg.f_max = priv->mclk;
|
|
|
- priv->cfg.b_max = U32_MAX; /* max value of UNIPHIER_SD_SECCNT */
|
|
|
-
|
|
|
- priv->mmc = mmc_create(&priv->cfg, priv);
|
|
|
- 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);
|
|
|
+ plat->cfg.f_max = priv->mclk;
|
|
|
+ plat->cfg.b_max = U32_MAX; /* max value of UNIPHIER_SD_SECCNT */
|
|
|
|
|
|
- mmc_destroy(priv->mmc);
|
|
|
+ upriv->mmc = &plat->mmc;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -756,8 +753,9 @@ U_BOOT_DRIVER(uniphier_mmc) = {
|
|
|
.name = "uniphier-mmc",
|
|
|
.id = UCLASS_MMC,
|
|
|
.of_match = uniphier_sd_match,
|
|
|
+ .bind = uniphier_sd_bind,
|
|
|
.probe = uniphier_sd_probe,
|
|
|
- .remove = uniphier_sd_remove,
|
|
|
.priv_auto_alloc_size = sizeof(struct uniphier_sd_priv),
|
|
|
+ .platdata_auto_alloc_size = sizeof(struct uniphier_sd_plat),
|
|
|
.ops = &uniphier_sd_ops,
|
|
|
};
|