]> git.sur5r.net Git - u-boot/blobdiff - drivers/dfu/dfu_sf.c
spi: cadence_qspi: Fix compilation warning
[u-boot] / drivers / dfu / dfu_sf.c
index 91f6df220b1dd7f11aabdaddb28fa7e3db32b44e..066e7670d1b939c55e4bff6af16a082ceeaf753e 100644 (file)
@@ -1,7 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
- *
- * SPDX-License-Identifier: GPL-2.0+
  */
 
 #include <common.h>
@@ -9,17 +8,27 @@
 #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)
+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,
@@ -27,11 +36,14 @@ static int dfu_write_medium_sf(struct dfu_entity *dfu,
 {
        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 +117,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;