]> git.sur5r.net Git - u-boot/blobdiff - drivers/dfu/dfu_sf.c
board: ge: bx50v3: mount rootfs read-only
[u-boot] / drivers / dfu / dfu_sf.c
index 448d95d382e98571c10ad39456e87aefdab37e07..2d2586db52ad0a9c9ca56d33b115c5b6ff37f9f6 100644 (file)
 #include <spi.h>
 #include <spi_flash.h>
 
-static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
+static int dfu_get_medium_size_sf(struct dfu_entity *dfu, u64 *size)
 {
-       return dfu->data.sf.size;
+       *size = dfu->data.sf.size;
+
+       return 0;
 }
 
 static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset, void *buf,
                long *len)
 {
-       return spi_flash_read(dfu->data.sf.dev, offset, *len, buf);
+       return spi_flash_read(dfu->data.sf.dev, dfu->data.sf.start + 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,
@@ -28,12 +37,14 @@ static int dfu_write_medium_sf(struct dfu_entity *dfu,
 {
        int ret;
 
-       ret = spi_flash_erase(dfu->data.sf.dev, offset,
+       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;
 
@@ -107,8 +118,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;