static int spi_gpio_set_direction(struct spi_device *spi, bool output)
 {
        struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
+       int ret;
 
        if (output)
                return gpiod_direction_output(spi_gpio->mosi, 1);
-       else
-               return gpiod_direction_input(spi_gpio->mosi);
+
+       ret = gpiod_direction_input(spi_gpio->mosi);
+       if (ret)
+               return ret;
+       /*
+        * Send a turnaround high impedance cycle when switching
+        * from output to input. Theoretically there should be
+        * a clock delay here, but as has been noted above, the
+        * nsec delay function for bit-banged GPIO is simply
+        * {} because bit-banging just doesn't get fast enough
+        * anyway.
+        */
+       if (spi->mode & SPI_3WIRE_HIZ) {
+               gpiod_set_value_cansleep(spi_gpio->sck,
+                                        !(spi->mode & SPI_CPOL));
+               gpiod_set_value_cansleep(spi_gpio->sck,
+                                        !!(spi->mode & SPI_CPOL));
+       }
+       return 0;
 }
 
 static void spi_gpio_cleanup(struct spi_device *spi)
                return status;
 
        master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32);
-       master->mode_bits = SPI_3WIRE | SPI_CPHA | SPI_CPOL;
+       master->mode_bits = SPI_3WIRE | SPI_3WIRE_HIZ | SPI_CPHA | SPI_CPOL;
        master->flags = master_flags;
        master->bus_num = pdev->id;
        /* The master needs to think there is a chipselect even if not connected */
 
 #define        SPI_RX_DUAL     0x400                   /* receive with 2 wires */
 #define        SPI_RX_QUAD     0x800                   /* receive with 4 wires */
 #define SPI_CS_WORD    0x1000                  /* toggle cs after each word */
+#define        SPI_3WIRE_HIZ   0x2000                  /* high impedance turnaround */
        int                     irq;
        void                    *controller_state;
        void                    *controller_data;