]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - drivers/dfu/dfu_sf.c
Merge branch 'master' of git://git.denx.de/u-boot
[people/ms/u-boot.git] / drivers / dfu / dfu_sf.c
index 91f6df220b1dd7f11aabdaddb28fa7e3db32b44e..9702eeea202a97f87b9c24b152e335d792b4f49b 100644 (file)
@@ -9,6 +9,7 @@
 #include <errno.h>
 #include <div64.h>
 #include <dfu.h>
+#include <spi.h>
 #include <spi_flash.h>
 
 static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
@@ -22,16 +23,25 @@ static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset, void *buf,
        return spi_flash_read(dfu->data.sf.dev, offset, *len, buf);
 }
 
+static u64 find_sector(struct dfu_entity *dfu, u64 start, u64 offset)
+{
+       return (lldiv((start + offset), dfu->data.sf.dev->sector_size)) *
+               dfu->data.sf.dev->sector_size;
+}
+
 static int dfu_write_medium_sf(struct dfu_entity *dfu,
                u64 offset, void *buf, long *len)
 {
        int ret;
 
-       ret = spi_flash_erase(dfu->data.sf.dev, offset, *len);
+       ret = spi_flash_erase(dfu->data.sf.dev,
+                             find_sector(dfu, dfu->data.sf.start, offset),
+                             dfu->data.sf.dev->sector_size);
        if (ret)
                return ret;
 
-       ret = spi_flash_write(dfu->data.sf.dev, offset, *len, buf);
+       ret = spi_flash_write(dfu->data.sf.dev, dfu->data.sf.start + offset,
+                             *len, buf);
        if (ret)
                return ret;
 
@@ -105,8 +115,10 @@ static struct spi_flash *parse_dev(char *devstr)
 int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s)
 {
        char *st;
+       char *devstr_bkup = strdup(devstr);
 
-       dfu->data.sf.dev = parse_dev(devstr);
+       dfu->data.sf.dev = parse_dev(devstr_bkup);
+       free(devstr_bkup);
        if (!dfu->data.sf.dev)
                return -ENODEV;