Merge tag 'ti-v2020.07-rc2' of https://gitlab.denx.de/u-boot/custodians/u-boot-ti
[oweals/u-boot.git] / drivers / mmc / mmc_write.c
index 79b8c4d808fb32c79605dc046417135aed1def9c..b52ff9f3bc0fd53d9cd769b9f80a2d5dd2fa26fb 100644 (file)
@@ -1,14 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright 2008, Freescale Semiconductor, Inc
  * Andy Fleming
  *
  * Based vaguely on the Linux code
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <config.h>
 #include <common.h>
+#include <dm.h>
 #include <part.h>
 #include <div64.h>
 #include <linux/math64.h>
@@ -65,20 +65,27 @@ err_out:
        return err;
 }
 
-unsigned long mmc_berase(block_dev_desc_t *block_dev, lbaint_t start,
-                        lbaint_t blkcnt)
+#if CONFIG_IS_ENABLED(BLK)
+ulong mmc_berase(struct udevice *dev, lbaint_t start, lbaint_t blkcnt)
+#else
+ulong mmc_berase(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt)
+#endif
 {
-       int dev_num = block_dev->dev;
+#if CONFIG_IS_ENABLED(BLK)
+       struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#endif
+       int dev_num = block_dev->devnum;
        int err = 0;
        u32 start_rem, blkcnt_rem;
        struct mmc *mmc = find_mmc_device(dev_num);
        lbaint_t blk = 0, blk_r = 0;
-       int timeout = 1000;
+       int timeout_ms = 1000;
 
        if (!mmc)
                return -1;
 
-       err = mmc_select_hwpart(dev_num, block_dev->hwpart);
+       err = blk_select_hwpart_devnum(IF_TYPE_MMC, dev_num,
+                                      block_dev->hwpart);
        if (err < 0)
                return -1;
 
@@ -98,8 +105,13 @@ unsigned long mmc_berase(block_dev_desc_t *block_dev, lbaint_t start,
                       & ~(mmc->erase_grp_size - 1)) - 1);
 
        while (blk < blkcnt) {
-               blk_r = ((blkcnt - blk) > mmc->erase_grp_size) ?
-                       mmc->erase_grp_size : (blkcnt - blk);
+               if (IS_SD(mmc) && mmc->ssr.au) {
+                       blk_r = ((blkcnt - blk) > mmc->ssr.au) ?
+                               mmc->ssr.au : (blkcnt - blk);
+               } else {
+                       blk_r = ((blkcnt - blk) > mmc->erase_grp_size) ?
+                               mmc->erase_grp_size : (blkcnt - blk);
+               }
                err = mmc_erase_t(mmc, start + blk, blk_r);
                if (err)
                        break;
@@ -107,7 +119,7 @@ unsigned long mmc_berase(block_dev_desc_t *block_dev, lbaint_t start,
                blk += blk_r;
 
                /* Waiting for the ready status */
-               if (mmc_send_status(mmc, timeout))
+               if (mmc_poll_for_busy(mmc, timeout_ms))
                        return 0;
        }
 
@@ -119,11 +131,11 @@ static ulong mmc_write_blocks(struct mmc *mmc, lbaint_t start,
 {
        struct mmc_cmd cmd;
        struct mmc_data data;
-       int timeout = 1000;
+       int timeout_ms = 1000;
 
-       if ((start + blkcnt) > mmc->block_dev.lba) {
+       if ((start + blkcnt) > mmc_get_blk_desc(mmc)->lba) {
                printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
-                      start + blkcnt, mmc->block_dev.lba);
+                      start + blkcnt, mmc_get_blk_desc(mmc)->lba);
                return 0;
        }
 
@@ -165,16 +177,24 @@ static ulong mmc_write_blocks(struct mmc *mmc, lbaint_t start,
        }
 
        /* Waiting for the ready status */
-       if (mmc_send_status(mmc, timeout))
+       if (mmc_poll_for_busy(mmc, timeout_ms))
                return 0;
 
        return blkcnt;
 }
 
-ulong mmc_bwrite(block_dev_desc_t *block_dev, lbaint_t start, lbaint_t blkcnt,
+#if CONFIG_IS_ENABLED(BLK)
+ulong mmc_bwrite(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
+                const void *src)
+#else
+ulong mmc_bwrite(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
                 const void *src)
+#endif
 {
-       int dev_num = block_dev->dev;
+#if CONFIG_IS_ENABLED(BLK)
+       struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#endif
+       int dev_num = block_dev->devnum;
        lbaint_t cur, blocks_todo = blkcnt;
        int err;
 
@@ -182,7 +202,7 @@ ulong mmc_bwrite(block_dev_desc_t *block_dev, lbaint_t start, lbaint_t blkcnt,
        if (!mmc)
                return 0;
 
-       err = mmc_select_hwpart(dev_num, block_dev->hwpart);
+       err = blk_select_hwpart_devnum(IF_TYPE_MMC, dev_num, block_dev->hwpart);
        if (err < 0)
                return 0;