msmsdcc_writel(host, host->cmd_timeout, MMCIDATATIMER);
        msmsdcc_writel(host, (unsigned int)host->curr.xfer_size,
                       MMCIDATALENGTH);
-       msmsdcc_writel(host, host->cmd_pio_irqmask, MMCIMASK1);
+       msmsdcc_writel(host, (msmsdcc_readl(host, MMCIMASK0) &
+                       (~MCI_IRQ_PIO)) | host->cmd_pio_irqmask, MMCIMASK0);
        msmsdcc_writel(host, host->cmd_datactrl, MMCIDATACTRL);
 
        if (host->cmd_cmd) {
 
                msmsdcc_writel(host, host->curr.xfer_size, MMCIDATALENGTH);
 
-               msmsdcc_writel(host, pio_irqmask, MMCIMASK1);
+               msmsdcc_writel(host, (msmsdcc_readl(host, MMCIMASK0) &
+                               (~MCI_IRQ_PIO)) | pio_irqmask, MMCIMASK0);
+
                msmsdcc_writel(host, datactrl, MMCIDATACTRL);
 
                if (cmd) {
 {
        struct msmsdcc_host     *host = dev_id;
        uint32_t                status;
+       u32 mci_mask0;
 
        status = msmsdcc_readl(host, MMCISTATUS);
+       mci_mask0 = msmsdcc_readl(host, MMCIMASK0);
+
+       if (((mci_mask0 & status) & MCI_IRQ_PIO) == 0)
+               return IRQ_NONE;
 
        do {
                unsigned long flags;
        } while (1);
 
        if (status & MCI_RXACTIVE && host->curr.xfer_remain < MCI_FIFOSIZE)
-               msmsdcc_writel(host, MCI_RXDATAAVLBLMASK, MMCIMASK1);
+               msmsdcc_writel(host, (mci_mask0 & (~MCI_IRQ_PIO)) |
+                                       MCI_RXDATAAVLBLMASK, MMCIMASK0);
 
        if (!host->curr.xfer_remain)
-               msmsdcc_writel(host, 0, MMCIMASK1);
+               msmsdcc_writel(host, (mci_mask0 & (~MCI_IRQ_PIO)) | 0,
+                                       MMCIMASK0);
 
        return IRQ_HANDLED;
 }
        do {
                status = msmsdcc_readl(host, MMCISTATUS);
                status &= msmsdcc_readl(host, MMCIMASK0);
+               if ((status & (~MCI_IRQ_PIO)) == 0)
+                       break;
                msmsdcc_writel(host, status, MMCICLEAR);
 
                if (status & MCI_SDIOINTR)