DECLARE_GLOBAL_DATA_PTR;
-static void spi_flash_addr(struct spi_flash *flash,
- unsigned long page_addr, unsigned long byte_addr, u8 *cmd)
+static void spi_flash_addr(unsigned long page_addr,
+ unsigned long byte_addr, u8 *cmd)
{
/* cmd[0] is actual command */
- if (flash->addr_width == 4) {
- cmd[1] = page_addr >> 16;
- cmd[2] = page_addr >> 8;
- cmd[3] = page_addr;
- cmd[4] = byte_addr;
- } else {
- cmd[1] = page_addr >> 8;
- cmd[2] = page_addr;
- cmd[3] = byte_addr;
- }
+ cmd[1] = page_addr >> 8;
+ cmd[2] = page_addr;
+ cmd[3] = byte_addr;
}
static int spi_flash_read_write(struct spi_slave *spi,
unsigned long page_addr, byte_addr, page_size;
size_t chunk_len, actual;
int ret;
- u8 cmd[flash->addr_width+1];
+ u8 cmd[4];
u32 start;
u8 bank_sel;
cmd[0] = CMD_PAGE_PROGRAM;
for (actual = 0; actual < len; actual += chunk_len) {
+ if (flash->spi->is_dual == 2)
+ offset /= 2;
+
bank_sel = offset / SPI_FLASH_16MB_BOUN;
ret = spi_flash_cmd_bankaddr_write(flash,
if (flash->spi->max_write_size)
chunk_len = min(chunk_len, flash->spi->max_write_size);
- spi_flash_addr(flash, page_addr, byte_addr, cmd);
+ spi_flash_addr(page_addr, byte_addr, cmd);
- debug("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x0x%02x } \
- chunk_len = %zu\n", buf + actual, cmd[0], cmd[1],
- cmd[2], cmd[3], cmd[4], chunk_len);
+ debug("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %zu\n",
+ buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len);
ret = spi_flash_cmd_write_enable(flash);
if (ret < 0) {
size_t len, void *data)
{
unsigned long page_addr, page_size, byte_addr;
- u8 cmd[flash->addr_width+2];
+ u8 cmd[5];
u8 bank_sel;
u32 remain_len, read_len;
int ret = -1;
cmd[sizeof(cmd)-1] = 0x00;
while (len) {
+ if (flash->spi->is_dual == 2)
+ offset /= 2;
+
bank_sel = offset / SPI_FLASH_16MB_BOUN;
remain_len = (SPI_FLASH_16MB_BOUN * (bank_sel + 1) - offset);
page_addr = (offset & SPI_FLASH_16MB_MASK) / page_size;
byte_addr = (offset & SPI_FLASH_16MB_MASK) % page_size;
- spi_flash_addr(flash, page_addr, byte_addr, cmd);
+ spi_flash_addr(page_addr, byte_addr, cmd);
ret = spi_flash_read_common(flash, cmd, sizeof(cmd),
data, read_len);
u32 start, end, erase_size;
int ret;
unsigned long page_addr;
- u8 cmd[flash->addr_width+1];
+ u8 cmd[4];
u8 bank_sel;
erase_size = flash->sector_size;
while (offset < end) {
bank_sel = offset / SPI_FLASH_16MB_BOUN;
+ if (flash->spi->is_dual == 2)
+ bank_sel -= ((flash->size / 2) / SPI_FLASH_16MB_BOUN);
ret = spi_flash_cmd_bankaddr_write(flash,
bank_sel, flash->idcode0);
}
page_addr = (offset & SPI_FLASH_16MB_MASK) / flash->page_size;
- spi_flash_addr(flash, page_addr, 0, cmd);
+ spi_flash_addr(page_addr, 0, cmd);
- debug("SF: erase %2x %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
- cmd[2], cmd[3], cmd[4], offset);
+ debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
+ cmd[2], cmd[3], offset);
ret = spi_flash_cmd_write_enable(flash);
if (ret)
puts("\n");
flash->idcode0 = *idp;
- if ((flash->spi->is_dual == 0) &&
- (flash->size > SPI_FLASH_16MB_BOUN)) {
+ if (((flash->spi->is_dual == 0) &&
+ (flash->size > SPI_FLASH_16MB_BOUN)) ||
+ ((flash->spi->is_dual == 2) &&
+ ((flash->size / 2) > SPI_FLASH_16MB_BOUN))) {
if (spi_flash_cmd_bankaddr_read(flash, &curr_bank,
flash->idcode0)) {
debug("SF: fail to read bank addr register\n");
xqspi->curr_inst = &flash_inst[index];
xqspi->inst_response = 1;
- /*
- * In case of dual memories, convert 25 bit address to 24 bit
- * address before transmitting to the 2 memories
- */
- if ((xqspi->is_dual == MODE_DUAL_PARALLEL) &&
- ((instruction == XQSPIPS_FLASH_OPCODE_PP) ||
- (instruction == XQSPIPS_FLASH_OPCODE_SE) ||
- (instruction == XQSPIPS_FLASH_OPCODE_BE_32K) ||
- (instruction == XQSPIPS_FLASH_OPCODE_BE_4K) ||
- (instruction == XQSPIPS_FLASH_OPCODE_BE) ||
- (instruction == XQSPIPS_FLASH_OPCODE_NORM_READ) ||
- (instruction == XQSPIPS_FLASH_OPCODE_FAST_READ) ||
- (instruction == XQSPIPS_FLASH_OPCODE_DUAL_READ) ||
- (instruction == XQSPIPS_FLASH_OPCODE_QUAD_READ))) {
-
- u8 *ptr = (u8 *) (xqspi->txbuf);
- data = ((u32) ptr[1] << 24) | ((u32) ptr[2] << 16) |
- ((u32) ptr[3] << 8) | ((u32) ptr[4]);
- data = data/2;
- ptr[1] = (u8) (data >> 16);
- ptr[2] = (u8) (data >> 8);
- ptr[3] = (u8) (data);
- xqspi->bytes_to_transfer -= 1;
- xqspi->bytes_to_receive -= 1;
- }
-
/* Get the instruction */
data = 0;
xqspips_copy_write_data(xqspi, &data,