浏览代码

spi: sf: Support byte program for sst spi flash

Currently if SST flash advertises SST_WP flag in the params table
the word program command (ADh) with auto address increment will be
used for the flash write op. However some SPI controllers do not
support the word program command (like the Intel ICH 7), the byte
programm command (02h) has to be used.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
Tested-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Jagannadha Sutradharudu Teki <jagannadh.teki@gmail.com>
Bin Meng 10 年之前
父节点
当前提交
74c2cee4e8
共有 2 个文件被更改,包括 33 次插入0 次删除
  1. 2 0
      drivers/mtd/spi/sf_internal.h
  2. 31 0
      drivers/mtd/spi/sf_ops.c

+ 2 - 0
drivers/mtd/spi/sf_internal.h

@@ -110,6 +110,8 @@ enum {
 
 
 int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
 int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
 		const void *buf);
 		const void *buf);
+int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len,
+		const void *buf);
 #endif
 #endif
 
 
 /**
 /**

+ 31 - 0
drivers/mtd/spi/sf_ops.c

@@ -517,4 +517,35 @@ int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
 	spi_release_bus(flash->spi);
 	spi_release_bus(flash->spi);
 	return ret;
 	return ret;
 }
 }
+
+int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len,
+		const void *buf)
+{
+	size_t actual;
+	int ret;
+
+	ret = spi_claim_bus(flash->spi);
+	if (ret) {
+		debug("SF: Unable to claim SPI bus\n");
+		return ret;
+	}
+
+	for (actual = 0; actual < len; actual++) {
+		ret = sst_byte_write(flash, offset, buf + actual);
+		if (ret) {
+			debug("SF: sst byte program failed\n");
+			break;
+		}
+		offset++;
+	}
+
+	if (!ret)
+		ret = spi_flash_cmd_write_disable(flash);
+
+	debug("SF: sst: program %s %zu bytes @ 0x%zx\n",
+	      ret ? "failure" : "success", len, offset - actual);
+
+	spi_release_bus(flash->spi);
+	return ret;
+}
 #endif
 #endif