int irq_int;
        int irq_tx;
        int irq_rx;
+       int irq_rt;
 
        spinlock_t lock;
 
                rz_ssi_reg_mask_setl(ssi, SSIFSR, SSIFSR_RDF, 0);
        }
 
+       if (irq == ssi->irq_rt) {
+               struct snd_pcm_substream *substream = strm->substream;
+
+               if (rz_ssi_stream_is_play(ssi, substream)) {
+                       strm->transfer(ssi, &ssi->playback);
+               } else {
+                       strm->transfer(ssi, &ssi->capture);
+                       rz_ssi_reg_mask_setl(ssi, SSIFSR, SSIFSR_RDF, 0);
+               }
+       }
+
        return IRQ_HANDLED;
 }
 
        if (!rz_ssi_is_dma_enabled(ssi)) {
                /* Tx and Rx interrupts (pio only) */
                ssi->irq_tx = platform_get_irq_byname(pdev, "dma_tx");
-               if (ssi->irq_tx < 0)
-                       return ssi->irq_tx;
-
-               ret = devm_request_irq(&pdev->dev, ssi->irq_tx,
-                                      &rz_ssi_interrupt, 0,
-                                      dev_name(&pdev->dev), ssi);
-               if (ret < 0)
-                       return dev_err_probe(&pdev->dev, ret,
-                                            "irq request error (dma_tx)\n");
-
                ssi->irq_rx = platform_get_irq_byname(pdev, "dma_rx");
-               if (ssi->irq_rx < 0)
-                       return ssi->irq_rx;
-
-               ret = devm_request_irq(&pdev->dev, ssi->irq_rx,
-                                      &rz_ssi_interrupt, 0,
-                                      dev_name(&pdev->dev), ssi);
-               if (ret < 0)
-                       return dev_err_probe(&pdev->dev, ret,
-                                            "irq request error (dma_rx)\n");
+               if (ssi->irq_tx == -ENXIO && ssi->irq_rx == -ENXIO) {
+                       ssi->irq_rt = platform_get_irq_byname(pdev, "dma_rt");
+                       if (ssi->irq_rt < 0)
+                               return ssi->irq_rt;
+
+                       ret = devm_request_irq(&pdev->dev, ssi->irq_rt,
+                                              &rz_ssi_interrupt, 0,
+                                              dev_name(&pdev->dev), ssi);
+                       if (ret < 0)
+                               return dev_err_probe(&pdev->dev, ret,
+                                               "irq request error (dma_tx)\n");
+               } else {
+                       if (ssi->irq_tx < 0)
+                               return ssi->irq_tx;
+
+                       if (ssi->irq_rx < 0)
+                               return ssi->irq_rx;
+
+                       ret = devm_request_irq(&pdev->dev, ssi->irq_tx,
+                                              &rz_ssi_interrupt, 0,
+                                              dev_name(&pdev->dev), ssi);
+                       if (ret < 0)
+                               return dev_err_probe(&pdev->dev, ret,
+                                               "irq request error (dma_tx)\n");
+
+                       ret = devm_request_irq(&pdev->dev, ssi->irq_rx,
+                                              &rz_ssi_interrupt, 0,
+                                              dev_name(&pdev->dev), ssi);
+                       if (ret < 0)
+                               return dev_err_probe(&pdev->dev, ret,
+                                               "irq request error (dma_rx)\n");
+               }
        }
 
        ssi->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);