+/**
+ * Write a block of data to SPI flash, first checking if it is different from
+ * what is already there.
+ *
+ * If the data being written is the same, then *skipped is incremented by len.
+ *
+ * @param flash flash context pointer
+ * @param offset flash offset to write
+ * @param len number of bytes to write
+ * @param buf buffer to write from
+ * @param cmp_buf read buffer to use to compare data
+ * @param skipped Count of skipped data (incremented by this function)
+ * @return NULL if OK, else a string containing the stage which failed
+ */
+static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset,
+ size_t len, const char *buf, char *cmp_buf, size_t *skipped)
+{
+ debug("offset=%#x, sector_size=%#x, len=%#zx\n",
+ offset, flash->sector_size, len);
+ if (spi_flash_read(flash, offset, len, cmp_buf))
+ return "read";
+ if (memcmp(cmp_buf, buf, len) == 0) {
+ debug("Skip region %x size %zx: no change\n",
+ offset, len);
+ *skipped += len;
+ return NULL;
+ }
+ if (spi_flash_erase(flash, offset, len))
+ return "erase";
+ if (spi_flash_write(flash, offset, len, buf))
+ return "write";
+ return NULL;