u16 idcode2;
u16 pages_per_sector;
u16 nr_sectors;
+ u8 rd_cmd;
const char *name;
};
.idcode2 = 0x4d01,
.pages_per_sector = 256,
.nr_sectors = 512,
+ .rd_cmd = READ_CMD_FULL,
.name = "S25FL256S_64K",
},
{
struct spi_flash *flash;
unsigned int i;
unsigned short jedec, ext_jedec;
+ u8 cmd;
jedec = idcode[1] << 8 | idcode[2];
ext_jedec = idcode[3] << 8 | idcode[4];
return NULL;
}
+ /* Look for the fastest read cmd */
+ cmd = fls(params->rd_cmd & flash->spi->rd_cmd);
+ if (cmd) {
+ cmd = spi_read_cmds_array[cmd - 1];
+ flash->read_cmd = cmd;
+ }
+
flash->page_size = 256;
flash->sector_size = 256 * params->pages_per_sector;
if (is_dual == MODE_DUAL_PARALLEL)
bank_boun = SPI_FLASH_16MB_BOUN << 1;
- cmd[0] = CMD_READ_ARRAY_FAST;
+ cmd[0] = flash->read_cmd;
cmd[4] = 0x00;
while (len) {
flash->write = spi_flash_cmd_write_multi;
flash->erase = spi_flash_cmd_erase;
+ /* Go for default command - if caller don't have any addons */
+ flash->read_cmd = CMD_READ_ARRAY_FAST;
+
return flash;
}
}
qspi->slave.is_dual = is_dual;
+ qspi->slave.rd_cmd = READ_CMD_FULL;
qspi->qspi.master.speed_hz = qspi->qspi.master.input_clk_hz / 2;
qspi->qspi.max_speed_hz = qspi->qspi.master.speed_hz;
qspi->qspi.master.is_dual = is_dual;
* u_page: Indicates the upper memory page, in dual stacked connection.
* max_write_size: If non-zero, the maximum number of bytes which can
* be written at once, excluding command bytes.
+ * rd_cmd: Read command.
*/
struct spi_slave {
unsigned int bus;
unsigned int is_dual;
unsigned int u_page;
unsigned int max_write_size;
+ u8 rd_cmd;
};
/*-----------------------------------------------------------------------
MODE_DUAL_PARALLEL,
};
+/* Read commands */
+#define CMD_READ_ARRAY_SLOW 0x03
+#define CMD_READ_ARRAY_FAST 0x0b
+#define CMD_READ_DUAL_OUTPUT_FAST 0x3b
+#define CMD_READ_DUAL_IO_FAST 0xbb
+
+static u32 spi_read_cmds_array[] = {
+ CMD_READ_ARRAY_SLOW,
+ CMD_READ_ARRAY_FAST,
+ CMD_READ_DUAL_OUTPUT_FAST,
+ CMD_READ_DUAL_IO_FAST,
+};
+
+enum spi_read_cmds {
+ ARRAY_SLOW = 1 << 0,
+ ARRAY_FAST = 1 << 1,
+ DUAL_OUTPUT_FAST = 1 << 2,
+ DUAL_IO_FAST = 1 << 3,
+};
+
+#define READ_CMD_FULL ARRAY_SLOW | ARRAY_FAST | DUAL_OUTPUT_FAST | \
+ DUAL_IO_FAST
+
struct spi_flash {
struct spi_slave *spi;
#endif
/* Poll cmd - for flash erase/program */
u8 poll_cmd;
+ /* Read command */
+ u8 read_cmd;
void *memory_map; /* Address of read-only SPI flash access */
int (*read)(struct spi_flash *flash, u32 offset,