]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/mmc/davinci_mmc.c
drivers:dfu: dfu_flush(): add raw data flush to complete dfu write
[karo-tx-uboot.git] / drivers / mmc / davinci_mmc.c
index ee8f2614de5d152231d30a3ee25c371a78f34ceb..aae00e9dab3103d539482b7fdb8ab2ff6e27e0e1 100644 (file)
@@ -3,19 +3,7 @@
  *
  * Copyright (C) 2010 Texas Instruments Incorporated
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <config.h>
@@ -42,10 +30,10 @@ static void dmmc_set_clock(struct mmc *mmc, uint clock)
        struct davinci_mmc_regs *regs = host->reg_base;
        uint clkrt, sysclk2, act_clock;
 
-       if (clock < mmc->f_min)
-               clock = mmc->f_min;
-       if (clock > mmc->f_max)
-               clock = mmc->f_max;
+       if (clock < mmc->cfg->f_min)
+               clock = mmc->cfg->f_min;
+       if (clock > mmc->cfg->f_max)
+               clock = mmc->cfg->f_max;
 
        set_val(&regs->mmcclk, 0);
        sysclk2 = host->input_clk;
@@ -285,8 +273,11 @@ dmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
                         */
                        if (bytes_left > fifo_bytes)
                                dmmc_wait_fifo_status(regs, 0x4a);
-                       else if (bytes_left == fifo_bytes)
+                       else if (bytes_left == fifo_bytes) {
                                dmmc_wait_fifo_status(regs, 0x40);
+                               if (cmd->cmdidx == MMC_CMD_SEND_EXT_CSD)
+                                       udelay(600);
+                       }
 
                        for (i = 0; bytes_left && (i < fifo_words); i++) {
                                cmddata = get_val(&regs->mmcdrr);
@@ -372,31 +363,27 @@ static void dmmc_set_ios(struct mmc *mmc)
                dmmc_set_clock(mmc, mmc->clock);
 }
 
+static const struct mmc_ops dmmc_ops = {
+       .send_cmd       = dmmc_send_cmd,
+       .set_ios        = dmmc_set_ios,
+       .init           = dmmc_init,
+};
+
 /* Called from board_mmc_init during startup. Can be called multiple times
  * depending on the number of slots available on board and controller
  */
 int davinci_mmc_init(bd_t *bis, struct davinci_mmc *host)
 {
-       struct mmc *mmc;
-
-       mmc = malloc(sizeof(struct mmc));
-       memset(mmc, 0, sizeof(struct mmc));
-
-       sprintf(mmc->name, "davinci");
-       mmc->priv = host;
-       mmc->send_cmd = dmmc_send_cmd;
-       mmc->set_ios = dmmc_set_ios;
-       mmc->init = dmmc_init;
-       mmc->getcd = NULL;
-
-       mmc->f_min = 200000;
-       mmc->f_max = 25000000;
-       mmc->voltages = host->voltages;
-       mmc->host_caps = host->host_caps;
+       host->cfg.name = "davinci";
+       host->cfg.ops = &dmmc_ops;
+       host->cfg.f_min = 200000;
+       host->cfg.f_max = 25000000;
+       host->cfg.voltages = host->voltages;
+       host->cfg.host_caps = host->host_caps;
 
-       mmc->b_max = DAVINCI_MAX_BLOCKS;
+       host->cfg.b_max = DAVINCI_MAX_BLOCKS;
 
-       mmc_register(mmc);
+       mmc_create(&host->cfg, host);
 
        return 0;
 }