mask |= STM32F4_SPI_SR_TXE;
        }
 
-       if (!spi->cur_usedma && spi->cur_comm == SPI_FULL_DUPLEX) {
+       if (!spi->cur_usedma && (spi->cur_comm == SPI_FULL_DUPLEX ||
+                               spi->cur_comm == SPI_SIMPLEX_RX ||
+                               spi->cur_comm == SPI_3WIRE_RX)) {
                /* TXE flag is set and is handled when RXNE flag occurs */
                sr &= ~STM32F4_SPI_SR_TXE;
                mask |= STM32F4_SPI_SR_RXNE | STM32F4_SPI_SR_OVR;
                stm32f4_spi_read_rx(spi);
                if (spi->rx_len == 0)
                        end = true;
-               else /* Load data for discontinuous mode */
+               else if (spi->tx_buf)/* Load data for discontinuous mode */
                        stm32f4_spi_write_tx(spi);
        }
 
        /* Enable the interrupts relative to the current communication mode */
        if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX) {
                cr2 |= STM32F4_SPI_CR2_TXEIE;
-       } else if (spi->cur_comm == SPI_FULL_DUPLEX) {
+       } else if (spi->cur_comm == SPI_FULL_DUPLEX ||
+                               spi->cur_comm == SPI_SIMPLEX_RX ||
+                               spi->cur_comm == SPI_3WIRE_RX) {
                /* In transmit-only mode, the OVR flag is set in the SR register
                 * since the received data are never read. Therefore set OVR
                 * interrupt only when rx buffer is available.
                stm32_spi_set_bits(spi, STM32F4_SPI_CR1,
                                        STM32F4_SPI_CR1_BIDIMODE |
                                        STM32F4_SPI_CR1_BIDIOE);
-       } else if (comm_type == SPI_FULL_DUPLEX) {
+       } else if (comm_type == SPI_FULL_DUPLEX ||
+                               comm_type == SPI_SIMPLEX_RX) {
                stm32_spi_clr_bits(spi, STM32F4_SPI_CR1,
                                        STM32F4_SPI_CR1_BIDIMODE |
                                        STM32F4_SPI_CR1_BIDIOE);
+       } else if (comm_type == SPI_3WIRE_RX) {
+               stm32_spi_set_bits(spi, STM32F4_SPI_CR1,
+                                       STM32F4_SPI_CR1_BIDIMODE);
+               stm32_spi_clr_bits(spi, STM32F4_SPI_CR1,
+                                       STM32F4_SPI_CR1_BIDIOE);
        } else {
                return -EINVAL;
        }
        master->prepare_message = stm32_spi_prepare_msg;
        master->transfer_one = stm32_spi_transfer_one;
        master->unprepare_message = stm32_spi_unprepare_msg;
+       master->flags = SPI_MASTER_MUST_TX;
 
        spi->dma_tx = dma_request_chan(spi->dev, "tx");
        if (IS_ERR(spi->dma_tx)) {