]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/dfu/dfu_mmc.c
dfu: mmc: file buffer: remove static allocation
[karo-tx-uboot.git] / drivers / dfu / dfu_mmc.c
index 62d72fe4c69a3843974a353f28885fd8661c640e..fd865e11212e13ec9dce85de6a210cf880646919 100644 (file)
@@ -16,8 +16,7 @@
 #include <fat.h>
 #include <mmc.h>
 
-static unsigned char __aligned(CONFIG_SYS_CACHELINE_SIZE)
-                               dfu_file_buf[CONFIG_SYS_DFU_MAX_FILE_SIZE];
+static unsigned char *dfu_file_buf;
 static long dfu_file_buf_len;
 
 static int mmc_access_part(struct dfu_entity *dfu, struct mmc *mmc, int part)
@@ -211,7 +210,7 @@ int dfu_flush_medium_mmc(struct dfu_entity *dfu)
 
        if (dfu->layout != DFU_RAW_ADDR) {
                /* Do stuff here. */
-               ret = mmc_file_op(DFU_OP_WRITE, dfu, &dfu_file_buf,
+               ret = mmc_file_op(DFU_OP_WRITE, dfu, dfu_file_buf,
                                &dfu_file_buf_len);
 
                /* Now that we're done */
@@ -263,6 +262,14 @@ int dfu_read_medium_mmc(struct dfu_entity *dfu, u64 offset, void *buf,
        return ret;
 }
 
+void dfu_free_entity_mmc(struct dfu_entity *dfu)
+{
+       if (dfu_file_buf) {
+               free(dfu_file_buf);
+               dfu_file_buf = NULL;
+       }
+}
+
 /*
  * @param s Parameter string containing space-separated arguments:
  *     1st:
@@ -370,6 +377,18 @@ int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s)
        dfu->write_medium = dfu_write_medium_mmc;
        dfu->flush_medium = dfu_flush_medium_mmc;
        dfu->inited = 0;
+       dfu->free_entity = dfu_free_entity_mmc;
+
+       /* Check if file buffer is ready */
+       if (!dfu_file_buf) {
+               dfu_file_buf = memalign(CONFIG_SYS_CACHELINE_SIZE,
+                                       CONFIG_SYS_DFU_MAX_FILE_SIZE);
+               if (!dfu_file_buf) {
+                       error("Could not memalign 0x%x bytes",
+                             CONFIG_SYS_DFU_MAX_FILE_SIZE);
+                       return -ENOMEM;
+               }
+       }
 
        return 0;
 }