#define QSPI_GLOBAL_CONFIG                     0X1a4
 #define QSPI_CMB_SEQ_EN                                BIT(0)
+#define QSPI_TPM_WAIT_POLL_EN                  BIT(1)
 
 #define QSPI_CMB_SEQ_ADDR                      0x1a8
 #define QSPI_ADDRESS_VALUE_SET(X)              (((x) & 0xFFFF) << 0)
 struct tegra_qspi_soc_data {
        bool has_dma;
        bool cmb_xfer_capable;
+       bool supports_tpm;
        unsigned int cs_count;
 };
 
 
        /* Enable Combined sequence mode */
        val = tegra_qspi_readl(tqspi, QSPI_GLOBAL_CONFIG);
+       if (spi->mode & SPI_TPM_HW_FLOW) {
+               if (tqspi->soc_data->supports_tpm)
+                       val |= QSPI_TPM_WAIT_POLL_EN;
+               else
+                       return -EIO;
+       }
        val |= QSPI_CMB_SEQ_EN;
        tegra_qspi_writel(tqspi, val, QSPI_GLOBAL_CONFIG);
        /* Process individual transfer list */
        /* Disable Combined sequence mode */
        val = tegra_qspi_readl(tqspi, QSPI_GLOBAL_CONFIG);
        val &= ~QSPI_CMB_SEQ_EN;
+       if (tqspi->soc_data->supports_tpm)
+               val &= ~QSPI_TPM_WAIT_POLL_EN;
        tegra_qspi_writel(tqspi, val, QSPI_GLOBAL_CONFIG);
        list_for_each_entry(transfer, &msg->transfers, transfer_list) {
                struct spi_transfer *xfer = transfer;
 static struct tegra_qspi_soc_data tegra210_qspi_soc_data = {
        .has_dma = true,
        .cmb_xfer_capable = false,
+       .supports_tpm = false,
        .cs_count = 1,
 };
 
 static struct tegra_qspi_soc_data tegra186_qspi_soc_data = {
        .has_dma = true,
        .cmb_xfer_capable = true,
+       .supports_tpm = false,
        .cs_count = 1,
 };
 
 static struct tegra_qspi_soc_data tegra234_qspi_soc_data = {
        .has_dma = false,
        .cmb_xfer_capable = true,
+       .supports_tpm = true,
        .cs_count = 1,
 };
 
 static struct tegra_qspi_soc_data tegra241_qspi_soc_data = {
        .has_dma = false,
        .cmb_xfer_capable = true,
+       .supports_tpm = true,
        .cs_count = 4,
 };