diff options
Diffstat (limited to 'drivers/mtd/spi-nor/cadence-quadspi.c')
-rw-r--r-- | drivers/mtd/spi-nor/cadence-quadspi.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/mtd/spi-nor/cadence-quadspi.c b/drivers/mtd/spi-nor/cadence-quadspi.c index d846428ef038..04cedd3a2bf6 100644 --- a/drivers/mtd/spi-nor/cadence-quadspi.c +++ b/drivers/mtd/spi-nor/cadence-quadspi.c | |||
@@ -644,9 +644,23 @@ static int cqspi_indirect_write_execute(struct spi_nor *nor, loff_t to_addr, | |||
644 | ndelay(cqspi->wr_delay); | 644 | ndelay(cqspi->wr_delay); |
645 | 645 | ||
646 | while (remaining > 0) { | 646 | while (remaining > 0) { |
647 | size_t write_words, mod_bytes; | ||
648 | |||
647 | write_bytes = remaining > page_size ? page_size : remaining; | 649 | write_bytes = remaining > page_size ? page_size : remaining; |
648 | iowrite32_rep(cqspi->ahb_base, txbuf, | 650 | write_words = write_bytes / 4; |
649 | DIV_ROUND_UP(write_bytes, 4)); | 651 | mod_bytes = write_bytes % 4; |
652 | /* Write 4 bytes at a time then single bytes. */ | ||
653 | if (write_words) { | ||
654 | iowrite32_rep(cqspi->ahb_base, txbuf, write_words); | ||
655 | txbuf += (write_words * 4); | ||
656 | } | ||
657 | if (mod_bytes) { | ||
658 | unsigned int temp = 0xFFFFFFFF; | ||
659 | |||
660 | memcpy(&temp, txbuf, mod_bytes); | ||
661 | iowrite32(temp, cqspi->ahb_base); | ||
662 | txbuf += mod_bytes; | ||
663 | } | ||
650 | 664 | ||
651 | if (!wait_for_completion_timeout(&cqspi->transfer_complete, | 665 | if (!wait_for_completion_timeout(&cqspi->transfer_complete, |
652 | msecs_to_jiffies(CQSPI_TIMEOUT_MS))) { | 666 | msecs_to_jiffies(CQSPI_TIMEOUT_MS))) { |
@@ -655,7 +669,6 @@ static int cqspi_indirect_write_execute(struct spi_nor *nor, loff_t to_addr, | |||
655 | goto failwr; | 669 | goto failwr; |
656 | } | 670 | } |
657 | 671 | ||
658 | txbuf += write_bytes; | ||
659 | remaining -= write_bytes; | 672 | remaining -= write_bytes; |
660 | 673 | ||
661 | if (remaining > 0) | 674 | if (remaining > 0) |