]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - drivers/mmc/dw_mmc.c
mmc: Split mmc struct, rework mmc initialization (v2)
[people/ms/u-boot.git] / drivers / mmc / dw_mmc.c
index 011efb14a98585d7b2d5992f482f98c094f41c33..eb4e2be5143ea3db71005f3c0522bb0dce037288 100644 (file)
@@ -107,7 +107,7 @@ static int dwmci_set_transfer_mode(struct dwmci_host *host,
 static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
                struct mmc_data *data)
 {
-       struct dwmci_host *host = (struct dwmci_host *)mmc->priv;
+       struct dwmci_host *host = mmc->priv;
        ALLOC_CACHE_ALIGN_BUFFER(struct dwmci_idmac, cur_idmac,
                                 data ? DIV_ROUND_UP(data->blocks, 8) : 0);
        int flags = 0, i;
@@ -284,7 +284,7 @@ static int dwmci_setup_bus(struct dwmci_host *host, u32 freq)
 
 static void dwmci_set_ios(struct mmc *mmc)
 {
-       struct dwmci_host *host = (struct dwmci_host *)mmc->priv;
+       struct dwmci_host *host = mmc->priv;
        u32 ctype;
 
        debug("Buswidth = %d, clock: %d\n",mmc->bus_width, mmc->clock);
@@ -310,7 +310,7 @@ static void dwmci_set_ios(struct mmc *mmc)
 
 static int dwmci_init(struct mmc *mmc)
 {
-       struct dwmci_host *host = (struct dwmci_host *)mmc->priv;
+       struct dwmci_host *host = mmc->priv;
 
        if (host->board_init)
                host->board_init(host);
@@ -323,7 +323,7 @@ static int dwmci_init(struct mmc *mmc)
        }
 
        /* Enumerate at 400KHz */
-       dwmci_setup_bus(host, mmc->f_min);
+       dwmci_setup_bus(host, mmc->cfg->f_min);
 
        dwmci_writel(host, DWMCI_RINTSTS, 0xFFFFFFFF);
        dwmci_writel(host, DWMCI_INTMASK, 0);
@@ -351,37 +351,29 @@ static const struct mmc_ops dwmci_ops = {
 
 int add_dwmci(struct dwmci_host *host, u32 max_clk, u32 min_clk)
 {
-       struct mmc *mmc;
-       int err = 0;
+       host->cfg.name = host->name;
+       host->cfg.ops = &dwmci_ops;
+       host->cfg.f_min = min_clk;
+       host->cfg.f_max = max_clk;
 
-       mmc = calloc(sizeof(struct mmc), 1);
-       if (!mmc) {
-               printf("mmc calloc fail!\n");
-               return -1;
-       }
-
-       mmc->priv = host;
-       host->mmc = mmc;
-
-       mmc->name = host->name;
-       mmc->ops = &dwmci_ops;
-       mmc->f_min = min_clk;
-       mmc->f_max = max_clk;
+       host->cfg.voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
 
-       mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
-
-       mmc->host_caps = host->caps;
+       host->cfg.host_caps = host->caps;
 
        if (host->buswidth == 8) {
-               mmc->host_caps |= MMC_MODE_8BIT;
-               mmc->host_caps &= ~MMC_MODE_4BIT;
+               host->cfg.host_caps |= MMC_MODE_8BIT;
+               host->cfg.host_caps &= ~MMC_MODE_4BIT;
        } else {
-               mmc->host_caps |= MMC_MODE_4BIT;
-               mmc->host_caps &= ~MMC_MODE_8BIT;
+               host->cfg.host_caps |= MMC_MODE_4BIT;
+               host->cfg.host_caps &= ~MMC_MODE_8BIT;
        }
-       mmc->host_caps |= MMC_MODE_HS | MMC_MODE_HS_52MHz | MMC_MODE_HC;
+       host->cfg.host_caps |= MMC_MODE_HS | MMC_MODE_HS_52MHz | MMC_MODE_HC;
+
+       host->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
 
-       err = mmc_register(mmc);
+       host->mmc = mmc_create(&host->cfg, host);
+       if (host->mmc == NULL)
+               return -1;
 
-       return err;
+       return 0;
 }