{
        void __iomem *tx_reg, *rx_reg, *int_reg;
        struct orion_spi *orion_spi;
+       bool cs_single_byte;
+
+       cs_single_byte = spi->mode & SPI_CS_WORD;
 
        orion_spi = spi_master_get_devdata(spi->master);
+
+       if (cs_single_byte)
+               orion_spi_set_cs(spi, 0);
+
        tx_reg = spi_reg(orion_spi, ORION_SPI_DATA_OUT_REG);
        rx_reg = spi_reg(orion_spi, ORION_SPI_DATA_IN_REG);
        int_reg = spi_reg(orion_spi, ORION_SPI_INT_CAUSE_REG);
                writel(0, tx_reg);
 
        if (orion_spi_wait_till_ready(orion_spi) < 0) {
+               if (cs_single_byte) {
+                       orion_spi_set_cs(spi, 1);
+                       /* Satisfy some SLIC devices requirements */
+                       udelay(4);
+               }
                dev_err(&spi->dev, "TXS timed out\n");
                return -1;
        }
        if (rx_buf && *rx_buf)
                *(*rx_buf)++ = readl(rx_reg);
 
+       if (cs_single_byte) {
+               orion_spi_set_cs(spi, 1);
+               /* Satisfy some SLIC devices requirements */
+               udelay(4);
+       }
+
        return 1;
 }
 
        void __iomem *tx_reg, *rx_reg, *int_reg;
        struct orion_spi *orion_spi;
 
+       if (spi->mode & SPI_CS_WORD) {
+               dev_err(&spi->dev, "SPI_CS_WORD is only supported for 8 bit words\n");
+               return -1;
+       }
+
        orion_spi = spi_master_get_devdata(spi->master);
        tx_reg = spi_reg(orion_spi, ORION_SPI_DATA_OUT_REG);
        rx_reg = spi_reg(orion_spi, ORION_SPI_DATA_IN_REG);
        orion_spi = spi_master_get_devdata(spi->master);
 
        /*
-        * Use SPI direct write mode if base address is available. Otherwise
-        * fall back to PIO mode for this transfer.
+        * Use SPI direct write mode if base address is available
+        * and SPI_CS_WORD flag is not set.
+        * Otherwise fall back to PIO mode for this transfer.
         */
        vaddr = orion_spi->child[cs].direct_access.vaddr;
 
-       if (vaddr && xfer->tx_buf && word_len == 8) {
+       if (vaddr && xfer->tx_buf && word_len == 8 && (spi->mode & SPI_CS_WORD) == 0) {
                unsigned int cnt = count / 4;
                unsigned int rem = count % 4;
 
        }
 
        /* we support all 4 SPI modes and LSB first option */
-       master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST;
+       master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST | SPI_CS_WORD;
        master->set_cs = orion_spi_set_cs;
        master->transfer_one = orion_spi_transfer_one;
        master->num_chipselect = ORION_NUM_CHIPSELECTS;