]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/spi/spi-rspi.c
Merge branch 'acpi-tables'
[linux.git] / drivers / spi / spi-rspi.c
index 556870dcdf7995f840f1ebe1dc72466de8192ecb..15f5723d9f9524d9eb9f1c4caadeaa4fe2a16cb1 100644 (file)
@@ -271,7 +271,8 @@ static int rspi_set_config_register(struct rspi_data *rspi, int access_size)
        /* Sets parity, interrupt mask */
        rspi_write8(rspi, 0x00, RSPI_SPCR2);
 
-       /* Sets SPCMD */
+       /* Resets sequencer */
+       rspi_write8(rspi, 0, RSPI_SPSCR);
        rspi->spcmd |= SPCMD_SPB_8_TO_16(access_size);
        rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0);
 
@@ -315,7 +316,8 @@ static int rspi_rz_set_config_register(struct rspi_data *rspi, int access_size)
        rspi_write8(rspi, 0x00, RSPI_SSLND);
        rspi_write8(rspi, 0x00, RSPI_SPND);
 
-       /* Sets SPCMD */
+       /* Resets sequencer */
+       rspi_write8(rspi, 0, RSPI_SPSCR);
        rspi->spcmd |= SPCMD_SPB_8_TO_16(access_size);
        rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0);
 
@@ -366,7 +368,8 @@ static int qspi_set_config_register(struct rspi_data *rspi, int access_size)
        /* Sets buffer to allow normal operation */
        rspi_write8(rspi, 0x00, QSPI_SPBFCR);
 
-       /* Sets SPCMD */
+       /* Resets sequencer */
+       rspi_write8(rspi, 0, RSPI_SPSCR);
        rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0);
 
        /* Sets RSPI mode */
@@ -736,27 +739,22 @@ static int qspi_trigger_transfer_out_in(struct rspi_data *rspi, const u8 *tx,
        while (len > 0) {
                n = qspi_set_send_trigger(rspi, len);
                qspi_set_receive_trigger(rspi, len);
-               if (n == QSPI_BUFFER_SIZE) {
-                       ret = rspi_wait_for_tx_empty(rspi);
-                       if (ret < 0) {
-                               dev_err(&rspi->ctlr->dev, "transmit timeout\n");
-                               return ret;
-                       }
-                       for (i = 0; i < n; i++)
-                               rspi_write_data(rspi, *tx++);
+               ret = rspi_wait_for_tx_empty(rspi);
+               if (ret < 0) {
+                       dev_err(&rspi->ctlr->dev, "transmit timeout\n");
+                       return ret;
+               }
+               for (i = 0; i < n; i++)
+                       rspi_write_data(rspi, *tx++);
 
-                       ret = rspi_wait_for_rx_full(rspi);
-                       if (ret < 0) {
-                               dev_err(&rspi->ctlr->dev, "receive timeout\n");
-                               return ret;
-                       }
-                       for (i = 0; i < n; i++)
-                               *rx++ = rspi_read_data(rspi);
-               } else {
-                       ret = rspi_pio_transfer(rspi, tx, rx, n);
-                       if (ret < 0)
-                               return ret;
+               ret = rspi_wait_for_rx_full(rspi);
+               if (ret < 0) {
+                       dev_err(&rspi->ctlr->dev, "receive timeout\n");
+                       return ret;
                }
+               for (i = 0; i < n; i++)
+                       *rx++ = rspi_read_data(rspi);
+
                len -= n;
        }
 
@@ -793,19 +791,14 @@ static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer)
 
        while (n > 0) {
                len = qspi_set_send_trigger(rspi, n);
-               if (len == QSPI_BUFFER_SIZE) {
-                       ret = rspi_wait_for_tx_empty(rspi);
-                       if (ret < 0) {
-                               dev_err(&rspi->ctlr->dev, "transmit timeout\n");
-                               return ret;
-                       }
-                       for (i = 0; i < len; i++)
-                               rspi_write_data(rspi, *tx++);
-               } else {
-                       ret = rspi_pio_transfer(rspi, tx, NULL, len);
-                       if (ret < 0)
-                               return ret;
+               ret = rspi_wait_for_tx_empty(rspi);
+               if (ret < 0) {
+                       dev_err(&rspi->ctlr->dev, "transmit timeout\n");
+                       return ret;
                }
+               for (i = 0; i < len; i++)
+                       rspi_write_data(rspi, *tx++);
+
                n -= len;
        }
 
@@ -830,19 +823,14 @@ static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer)
 
        while (n > 0) {
                len = qspi_set_receive_trigger(rspi, n);
-               if (len == QSPI_BUFFER_SIZE) {
-                       ret = rspi_wait_for_rx_full(rspi);
-                       if (ret < 0) {
-                               dev_err(&rspi->ctlr->dev, "receive timeout\n");
-                               return ret;
-                       }
-                       for (i = 0; i < len; i++)
-                               *rx++ = rspi_read_data(rspi);
-               } else {
-                       ret = rspi_pio_transfer(rspi, NULL, rx, len);
-                       if (ret < 0)
-                               return ret;
+               ret = rspi_wait_for_rx_full(rspi);
+               if (ret < 0) {
+                       dev_err(&rspi->ctlr->dev, "receive timeout\n");
+                       return ret;
                }
+               for (i = 0; i < len; i++)
+                       *rx++ = rspi_read_data(rspi);
+
                n -= len;
        }
 
@@ -868,28 +856,6 @@ static int qspi_transfer_one(struct spi_controller *ctlr,
        }
 }
 
-static int rspi_setup(struct spi_device *spi)
-{
-       struct rspi_data *rspi = spi_controller_get_devdata(spi->controller);
-
-       rspi->max_speed_hz = spi->max_speed_hz;
-
-       rspi->spcmd = SPCMD_SSLKP;
-       if (spi->mode & SPI_CPOL)
-               rspi->spcmd |= SPCMD_CPOL;
-       if (spi->mode & SPI_CPHA)
-               rspi->spcmd |= SPCMD_CPHA;
-
-       /* CMOS output mode and MOSI signal from previous transfer */
-       rspi->sppcr = 0;
-       if (spi->mode & SPI_LOOP)
-               rspi->sppcr |= SPPCR_SPLP;
-
-       set_config_register(rspi, 8);
-
-       return 0;
-}
-
 static u16 qspi_transfer_mode(const struct spi_transfer *xfer)
 {
        if (xfer->tx_buf)
@@ -959,8 +925,24 @@ static int rspi_prepare_message(struct spi_controller *ctlr,
                                struct spi_message *msg)
 {
        struct rspi_data *rspi = spi_controller_get_devdata(ctlr);
+       struct spi_device *spi = msg->spi;
        int ret;
 
+       rspi->max_speed_hz = spi->max_speed_hz;
+
+       rspi->spcmd = SPCMD_SSLKP;
+       if (spi->mode & SPI_CPOL)
+               rspi->spcmd |= SPCMD_CPOL;
+       if (spi->mode & SPI_CPHA)
+               rspi->spcmd |= SPCMD_CPHA;
+
+       /* CMOS output mode and MOSI signal from previous transfer */
+       rspi->sppcr = 0;
+       if (spi->mode & SPI_LOOP)
+               rspi->sppcr |= SPPCR_SPLP;
+
+       set_config_register(rspi, 8);
+
        if (msg->spi->mode &
            (SPI_TX_DUAL | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD)) {
                /* Setup sequencer for messages with multiple transfer modes */
@@ -1267,7 +1249,6 @@ static int rspi_probe(struct platform_device *pdev)
        init_waitqueue_head(&rspi->wait);
 
        ctlr->bus_num = pdev->id;
-       ctlr->setup = rspi_setup;
        ctlr->auto_runtime_pm = true;
        ctlr->transfer_one = ops->transfer_one;
        ctlr->prepare_message = rspi_prepare_message;