]> git.sur5r.net Git - u-boot/blobdiff - drivers/mmc/mmc_write.c
dm: Drop the block_dev_desc_t typedef
[u-boot] / drivers / mmc / mmc_write.c
index aa2fdefa75edeb39540954ae40cf73a841f5870a..54e60dbe9c4c21339b92d840bc133f3a69be20a7 100644 (file)
@@ -10,6 +10,8 @@
 #include <config.h>
 #include <common.h>
 #include <part.h>
+#include <div64.h>
+#include <linux/math64.h>
 #include "mmc_private.h"
 
 static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
@@ -49,7 +51,7 @@ static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
                goto err_out;
 
        cmd.cmdidx = MMC_CMD_ERASE;
-       cmd.cmdarg = SECURE_ERASE;
+       cmd.cmdarg = MMC_ERASE_ARG;
        cmd.resp_type = MMC_RSP_R1b;
 
        err = mmc_send_cmd(mmc, &cmd, NULL);
@@ -63,9 +65,12 @@ err_out:
        return err;
 }
 
-unsigned long mmc_berase(int dev_num, lbaint_t start, lbaint_t blkcnt)
+unsigned long mmc_berase(struct blk_desc *block_dev, lbaint_t start,
+                        lbaint_t blkcnt)
 {
+       int dev_num = block_dev->dev;
        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;
@@ -73,7 +78,18 @@ unsigned long mmc_berase(int dev_num, lbaint_t start, lbaint_t blkcnt)
        if (!mmc)
                return -1;
 
-       if ((start % mmc->erase_grp_size) || (blkcnt % mmc->erase_grp_size))
+       err = mmc_select_hwpart(dev_num, block_dev->hwpart);
+       if (err < 0)
+               return -1;
+
+       /*
+        * We want to see if the requested start or total block count are
+        * unaligned.  We discard the whole numbers and only care about the
+        * remainder.
+        */
+       err = div_u64_rem(start, mmc->erase_grp_size, &start_rem);
+       err = div_u64_rem(blkcnt, mmc->erase_grp_size, &blkcnt_rem);
+       if (start_rem || blkcnt_rem)
                printf("\n\nCaution! Your devices Erase group is 0x%x\n"
                       "The erase range would be change to "
                       "0x" LBAF "~0x" LBAF "\n\n",
@@ -155,19 +171,27 @@ static ulong mmc_write_blocks(struct mmc *mmc, lbaint_t start,
        return blkcnt;
 }
 
-ulong mmc_bwrite(int dev_num, lbaint_t start, lbaint_t blkcnt, const void *src)
+ulong mmc_bwrite(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
+                const void *src)
 {
+       int dev_num = block_dev->dev;
        lbaint_t cur, blocks_todo = blkcnt;
+       int err;
 
        struct mmc *mmc = find_mmc_device(dev_num);
        if (!mmc)
                return 0;
 
+       err = mmc_select_hwpart(dev_num, block_dev->hwpart);
+       if (err < 0)
+               return 0;
+
        if (mmc_set_blocklen(mmc, mmc->write_bl_len))
                return 0;
 
        do {
-               cur = (blocks_todo > mmc->b_max) ?  mmc->b_max : blocks_todo;
+               cur = (blocks_todo > mmc->cfg->b_max) ?
+                       mmc->cfg->b_max : blocks_todo;
                if (mmc_write_blocks(mmc, start, cur, src) != cur)
                        return 0;
                blocks_todo -= cur;