SST_BP = 1 << 3,
SST_WP = 1 << 4,
WR_QPP = 1 << 5,
+ SST_LOCKBP = 1 << 6,
};
#define SST_WR (SST_BP | SST_WP)
#ifdef CONFIG_SPI_FLASH_SST
# define CMD_SST_BP 0x02 /* Byte Program */
# define CMD_SST_AAI_WP 0xAD /* Auto Address Incr Word Program */
+# define CMD_BLOCK_PROTECT_UNLOCK 0x98
int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
const void *buf);
return 0;
}
+#if defined(CONFIG_SPI_FLASH_SST)
+int spi_flash_cmd_bp_unlock(struct spi_flash *flash)
+{
+ u8 cmd = CMD_BLOCK_PROTECT_UNLOCK;
+ int ret;
+
+ ret = spi_flash_read_common(flash, &cmd, 1, NULL, 0);
+ if (ret < 0) {
+ debug("SF: fail to unlock block protect\n");
+ return ret;
+ }
+
+ return 0;
+}
+#endif
+
#if defined(CONFIG_SPI_FLASH_SPANSION) || defined(CONFIG_SPI_FLASH_WINBOND)
int spi_flash_cmd_read_config(struct spi_flash *flash, u8 *rc)
{
{"SST25WF010", 0xbf2502, 0x0, 64 * 1024, 2, RD_NORM, SECT_4K | SST_WR},
{"SST25WF020", 0xbf2503, 0x0, 64 * 1024, 4, RD_NORM, SECT_4K | SST_WR},
{"SST25WF040", 0xbf2504, 0x0, 64 * 1024, 8, RD_NORM, SECT_4K | SST_WR},
+ {"SST25WF016B", 0xbf2651, 0x0, 4 * 1024, 512, RD_NORM, SST_LOCKBP | SECT_4K},
{"SST25WF040B", 0x621613, 0x0, 64 * 1024, 8, RD_NORM, SECT_4K},
{"SST25WF080", 0xbf2505, 0x0, 64 * 1024, 16, RD_NORM, SECT_4K | SST_WR},
#endif
spi_flash_cmd_write_status(flash, 0);
#endif
+#if defined(CONFIG_SPI_FLASH_SST)
+ if(params->flags == SST_LOCKBP) {
+ int ret;
+ ret = spi_flash_cmd_bp_unlock();
+ if (ret) {
+ debug("SF: fail to unlock block protection\n");
+ return ret;
+ }
+ }
+#endif
+
return 0;
}