struct fsl_dspi_dma     *dma;
 };
 
-static u16 dspi_pop_tx(struct fsl_dspi *dspi)
+static u32 dspi_pop_tx(struct fsl_dspi *dspi)
 {
-       u16 txdata = 0;
+       u32 txdata = 0;
 
        if (dspi->tx) {
                if (dspi->bytes_per_word == 1)
                        txdata = *(u8 *)dspi->tx;
-               else /* dspi->bytes_per_word == 2 */
+               else if (dspi->bytes_per_word == 2)
                        txdata = *(u16 *)dspi->tx;
+               else  /* dspi->bytes_per_word == 4 */
+                       txdata = *(u32 *)dspi->tx;
                dspi->tx += dspi->bytes_per_word;
        }
        dspi->len -= dspi->bytes_per_word;
 
        if (dspi->bytes_per_word == 1)
                *(u8 *)dspi->rx = rxdata;
-       else /* dspi->bytes_per_word == 2 */
+       else if (dspi->bytes_per_word == 2)
                *(u16 *)dspi->rx = rxdata;
+       else /* dspi->bytes_per_word == 4 */
+               *(u32 *)dspi->rx = rxdata;
        dspi->rx += dspi->bytes_per_word;
 }
 
        regmap_write(dspi->regmap, SPI_PUSHR, dspi_pop_tx_pushr(dspi));
 }
 
+static void cmd_fifo_write(struct fsl_dspi *dspi)
+{
+       u16 cmd = dspi->tx_cmd;
+
+       if (dspi->len > 0)
+               cmd |= SPI_PUSHR_CMD_CONT;
+       regmap_write(dspi->regmap_pushr, PUSHR_CMD, cmd);
+}
+
+static void tx_fifo_write(struct fsl_dspi *dspi, u16 txdata)
+{
+       regmap_write(dspi->regmap_pushr, PUSHR_TX, txdata);
+}
+
 static void dspi_tcfq_write(struct fsl_dspi *dspi)
 {
        /* Clear transfer count */
        dspi->tx_cmd |= SPI_PUSHR_CMD_CTCNT;
-       /* Write one entry to both TX FIFO and CMD FIFO simultaneously */
-       fifo_write(dspi);
+
+       if (dspi->devtype_data->xspi_mode && dspi->bits_per_word > 16) {
+               /* Write two TX FIFO entries first, and then the corresponding
+                * CMD FIFO entry.
+                */
+               u32 data = dspi_pop_tx(dspi);
+
+               if (dspi->cur_chip->ctar_val & SPI_CTAR_LSBFE(1)) {
+                       /* LSB */
+                       tx_fifo_write(dspi, data & 0xFFFF);
+                       tx_fifo_write(dspi, data >> 16);
+               } else {
+                       /* MSB */
+                       tx_fifo_write(dspi, data >> 16);
+                       tx_fifo_write(dspi, data & 0xFFFF);
+               }
+               cmd_fifo_write(dspi);
+       } else {
+               /* Write one entry to both TX FIFO and CMD FIFO
+                * simultaneously.
+                */
+               fifo_write(dspi);
+       }
 }
 
 static u32 fifo_read(struct fsl_dspi *dspi)
                dspi->bits_per_word = transfer->bits_per_word;
                if (transfer->bits_per_word <= 8)
                        dspi->bytes_per_word = 1;
-               else
+               else if (transfer->bits_per_word <= 16)
                        dspi->bytes_per_word = 2;
+               else
+                       dspi->bytes_per_word = 4;
 
                regmap_update_bits(dspi->regmap, SPI_MCR,
                                   SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF,