mtk_spi_setup_packet(master);
 
        cnt = xfer->len / 4;
-       iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt);
+       if (xfer->tx_buf)
+               iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt);
+
+       if (xfer->rx_buf)
+               ioread32_rep(mdata->base + SPI_RX_DATA_REG, xfer->rx_buf, cnt);
 
        remainder = xfer->len % 4;
        if (remainder > 0) {
                reg_val = 0;
-               memcpy(®_val, xfer->tx_buf + (cnt * 4), remainder);
-               writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+               if (xfer->tx_buf) {
+                       memcpy(®_val, xfer->tx_buf + (cnt * 4), remainder);
+                       writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+               }
+               if (xfer->rx_buf) {
+                       reg_val = readl(mdata->base + SPI_RX_DATA_REG);
+                       memcpy(xfer->rx_buf + (cnt * 4), ®_val, remainder);
+               }
        }
 
        mtk_spi_enable_transfer(master);