aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/spi-nor/cadence-quadspi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd/spi-nor/cadence-quadspi.c')
-rw-r--r--drivers/mtd/spi-nor/cadence-quadspi.c19
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)