Instead of splitting transfers into smaller parts, just perform the
operation that the higher level asked for.

Reviewed-by: Callum Sinclair <callum.sincl...@alliedtelesis.co.nz>
Reviewed-by: Chris Packham <chris.pack...@alliedtelesis.co.nz>
Signed-off-by: Mark Tomlinson <mark.tomlin...@alliedtelesis.co.nz>
---
 drivers/spi/spi-bcm-qspi.c | 69 +++++++++++++++-----------------------
 1 file changed, 27 insertions(+), 42 deletions(-)

diff --git a/drivers/spi/spi-bcm-qspi.c b/drivers/spi/spi-bcm-qspi.c
index 92e04d24359f..ce30ebf27f06 100644
--- a/drivers/spi/spi-bcm-qspi.c
+++ b/drivers/spi/spi-bcm-qspi.c
@@ -78,8 +78,6 @@
 #define BSPI_BPP_MODE_SELECT_MASK              BIT(8)
 #define BSPI_BPP_ADDR_SELECT_MASK              BIT(16)
 
-#define BSPI_READ_LENGTH                       256
-
 /* MSPI register offsets */
 #define MSPI_SPCR0_LSB                         0x000
 #define MSPI_SPCR0_MSB                         0x004
@@ -888,9 +886,9 @@ static int bcm_qspi_bspi_exec_mem_op(struct spi_device *spi,
                                     const struct spi_mem_op *op)
 {
        struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
-       u32 addr = 0, len, rdlen, len_words, from = 0;
+       u32 addr = 0, len, len_words, from = 0;
        int ret = 0;
-       unsigned long timeo = msecs_to_jiffies(100);
+       unsigned long timeo = msecs_to_jiffies(1500);
        struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc;
 
        if (bcm_qspi_bspi_ver_three(qspi))
@@ -925,47 +923,34 @@ static int bcm_qspi_bspi_exec_mem_op(struct spi_device 
*spi,
         * into RAF buffer read lengths
         */
        len = op->data.nbytes;
+       reinit_completion(&qspi->bspi_done);
+       bcm_qspi_enable_bspi(qspi);
+       len_words = (len + 3) >> 2;
+       qspi->bspi_rf_op = op;
+       qspi->bspi_rf_op_status = 0;
        qspi->bspi_rf_op_idx = 0;
+       qspi->bspi_rf_op_len = len;
+       dev_dbg(&qspi->pdev->dev, "bspi xfr addr 0x%x len 0x%x", addr, len);
 
-       do {
-               if (len > BSPI_READ_LENGTH)
-                       rdlen = BSPI_READ_LENGTH;
-               else
-                       rdlen = len;
-
-               reinit_completion(&qspi->bspi_done);
-               bcm_qspi_enable_bspi(qspi);
-               len_words = (rdlen + 3) >> 2;
-               qspi->bspi_rf_op = op;
-               qspi->bspi_rf_op_status = 0;
-               qspi->bspi_rf_op_len = rdlen;
-               dev_dbg(&qspi->pdev->dev,
-                       "bspi xfr addr 0x%x len 0x%x", addr, rdlen);
-               bcm_qspi_write(qspi, BSPI, BSPI_RAF_START_ADDR, addr);
-               bcm_qspi_write(qspi, BSPI, BSPI_RAF_NUM_WORDS, len_words);
-               bcm_qspi_write(qspi, BSPI, BSPI_RAF_WATERMARK, 0);
-               if (qspi->soc_intc) {
-                       /*
-                        * clear soc MSPI and BSPI interrupts and enable
-                        * BSPI interrupts.
-                        */
-                       soc_intc->bcm_qspi_int_ack(soc_intc, MSPI_BSPI_DONE);
-                       soc_intc->bcm_qspi_int_set(soc_intc, BSPI_DONE, true);
-               }
-
-               /* Must flush previous writes before starting BSPI operation */
-               mb();
-               bcm_qspi_bspi_lr_start(qspi);
-               if (!wait_for_completion_timeout(&qspi->bspi_done, timeo)) {
-                       dev_err(&qspi->pdev->dev, "timeout waiting for BSPI\n");
-                       ret = -ETIMEDOUT;
-                       break;
-               }
+       bcm_qspi_write(qspi, BSPI, BSPI_RAF_START_ADDR, addr);
+       bcm_qspi_write(qspi, BSPI, BSPI_RAF_NUM_WORDS, len_words);
+       bcm_qspi_write(qspi, BSPI, BSPI_RAF_WATERMARK, 0);
+       if (qspi->soc_intc) {
+               /*
+                * clear soc MSPI and BSPI interrupts and enable
+                * BSPI interrupts.
+                */
+               soc_intc->bcm_qspi_int_ack(soc_intc, MSPI_BSPI_DONE);
+               soc_intc->bcm_qspi_int_set(soc_intc, BSPI_DONE, true);
+       }
 
-               /* set msg return length */
-               addr += rdlen;
-               len -= rdlen;
-       } while (len);
+       /* Must flush previous writes before starting BSPI operation */
+       mb();
+       bcm_qspi_bspi_lr_start(qspi);
+       if (!wait_for_completion_timeout(&qspi->bspi_done, timeo)) {
+               dev_err(&qspi->pdev->dev, "timeout waiting for BSPI\n");
+               ret = -ETIMEDOUT;
+       }
 
        return ret;
 }
-- 
2.27.0

Reply via email to