mx6: Add Phytec PCM058 i.MX6 Quad
[oweals/u-boot.git] / common / fb_mmc.c
index 9e53adba5ed973c528674a2bfc42ed538ba6c5e0..c739651009b0f806b68bcc998f96d7fa3bd6a757 100644 (file)
@@ -7,12 +7,10 @@
 #include <config.h>
 #include <common.h>
 #include <blk.h>
-#include <errno.h>
 #include <fastboot.h>
 #include <fb_mmc.h>
 #include <image-sparse.h>
 #include <part.h>
-#include <sparse_format.h>
 #include <mmc.h>
 #include <div64.h>
 
@@ -20,8 +18,6 @@
 #define CONFIG_FASTBOOT_GPT_NAME GPT_ENTRY_NAME
 #endif
 
-static char *response_str;
-
 struct fb_mmc_sparse {
        struct blk_desc *dev_desc;
 };
@@ -48,22 +44,19 @@ static int part_get_info_efi_by_name_or_alias(struct blk_desc *dev_desc,
        return ret;
 }
 
-
-static int fb_mmc_sparse_write(struct sparse_storage *storage,
-                              void *priv,
-                              unsigned int offset,
-                              unsigned int size,
-                              char *data)
+static lbaint_t fb_mmc_sparse_write(struct sparse_storage *info,
+               lbaint_t blk, lbaint_t blkcnt, const void *buffer)
 {
-       struct fb_mmc_sparse *sparse = priv;
+       struct fb_mmc_sparse *sparse = info->priv;
        struct blk_desc *dev_desc = sparse->dev_desc;
-       int ret;
 
-       ret = blk_dwrite(dev_desc, offset, size, data);
-       if (!ret)
-               return -EIO;
+       return blk_dwrite(dev_desc, blk, blkcnt, buffer);
+}
 
-       return ret;
+static lbaint_t fb_mmc_sparse_reserve(struct sparse_storage *info,
+               lbaint_t blk, lbaint_t blkcnt)
+{
+       return blkcnt;
 }
 
 static void write_raw_image(struct blk_desc *dev_desc, disk_partition_t *info,
@@ -79,7 +72,7 @@ static void write_raw_image(struct blk_desc *dev_desc, disk_partition_t *info,
 
        if (blkcnt > info->size) {
                error("too large for partition: '%s'\n", part_name);
-               fastboot_fail(response_str, "too large for partition");
+               fastboot_fail("too large for partition");
                return;
        }
 
@@ -88,28 +81,25 @@ static void write_raw_image(struct blk_desc *dev_desc, disk_partition_t *info,
        blks = blk_dwrite(dev_desc, info->start, blkcnt, buffer);
        if (blks != blkcnt) {
                error("failed writing to device %d\n", dev_desc->devnum);
-               fastboot_fail(response_str, "failed writing to device");
+               fastboot_fail("failed writing to device");
                return;
        }
 
        printf("........ wrote " LBAFU " bytes to '%s'\n", blkcnt * info->blksz,
               part_name);
-       fastboot_okay(response_str, "");
+       fastboot_okay("");
 }
 
 void fb_mmc_flash_write(const char *cmd, void *download_buffer,
-                       unsigned int download_bytes, char *response)
+                       unsigned int download_bytes)
 {
        struct blk_desc *dev_desc;
        disk_partition_t info;
 
-       /* initialize the response buffer */
-       response_str = response;
-
        dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
        if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) {
                error("invalid mmc device\n");
-               fastboot_fail(response_str, "invalid mmc device");
+               fastboot_fail("invalid mmc device");
                return;
        }
 
@@ -119,49 +109,49 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
                if (is_valid_gpt_buf(dev_desc, download_buffer)) {
                        printf("%s: invalid GPT - refusing to write to flash\n",
                               __func__);
-                       fastboot_fail(response_str, "invalid GPT partition");
+                       fastboot_fail("invalid GPT partition");
                        return;
                }
                if (write_mbr_and_gpt_partitions(dev_desc, download_buffer)) {
                        printf("%s: writing GPT partitions failed\n", __func__);
-                       fastboot_fail(response_str,
+                       fastboot_fail(
                                      "writing GPT partitions failed");
                        return;
                }
                printf("........ success\n");
-               fastboot_okay(response_str, "");
+               fastboot_okay("");
                return;
        } else if (part_get_info_efi_by_name_or_alias(dev_desc, cmd, &info)) {
                error("cannot find partition: '%s'\n", cmd);
-               fastboot_fail(response_str, "cannot find partition");
+               fastboot_fail("cannot find partition");
                return;
        }
 
        if (is_sparse_image(download_buffer)) {
                struct fb_mmc_sparse sparse_priv;
-               sparse_storage_t sparse;
+               struct sparse_storage sparse;
 
                sparse_priv.dev_desc = dev_desc;
 
-               sparse.block_sz = info.blksz;
+               sparse.blksz = info.blksz;
                sparse.start = info.start;
                sparse.size = info.size;
-               sparse.name = cmd;
                sparse.write = fb_mmc_sparse_write;
+               sparse.reserve = fb_mmc_sparse_reserve;
 
                printf("Flashing sparse image at offset " LBAFU "\n",
-                      info.start);
+                      sparse.start);
 
-               store_sparse_image(&sparse, &sparse_priv, download_buffer);
+               sparse.priv = &sparse_priv;
+               write_sparse_image(&sparse, cmd, download_buffer,
+                                  download_bytes);
        } else {
                write_raw_image(dev_desc, &info, cmd, download_buffer,
                                download_bytes);
        }
-
-       fastboot_okay(response_str, "");
 }
 
-void fb_mmc_erase(const char *cmd, char *response)
+void fb_mmc_erase(const char *cmd)
 {
        int ret;
        struct blk_desc *dev_desc;
@@ -171,24 +161,21 @@ void fb_mmc_erase(const char *cmd, char *response)
 
        if (mmc == NULL) {
                error("invalid mmc device");
-               fastboot_fail(response_str, "invalid mmc device");
+               fastboot_fail("invalid mmc device");
                return;
        }
 
-       /* initialize the response buffer */
-       response_str = response;
-
        dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
        if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) {
                error("invalid mmc device");
-               fastboot_fail(response_str, "invalid mmc device");
+               fastboot_fail("invalid mmc device");
                return;
        }
 
        ret = part_get_info_efi_by_name_or_alias(dev_desc, cmd, &info);
        if (ret) {
                error("cannot find partition: '%s'", cmd);
-               fastboot_fail(response_str, "cannot find partition");
+               fastboot_fail("cannot find partition");
                return;
        }
 
@@ -207,11 +194,11 @@ void fb_mmc_erase(const char *cmd, char *response)
        blks = dev_desc->block_erase(dev_desc, blks_start, blks_size);
        if (blks != blks_size) {
                error("failed erasing from device %d", dev_desc->devnum);
-               fastboot_fail(response_str, "failed erasing from device");
+               fastboot_fail("failed erasing from device");
                return;
        }
 
        printf("........ erased " LBAFU " bytes from '%s'\n",
               blks_size * info.blksz, cmd);
-       fastboot_okay(response_str, "");
+       fastboot_okay("");
 }