ret = sdhci_runtime_suspend_host(host);
 
-       clk_disable_unprepare(imx_data->clk_per);
-       clk_disable_unprepare(imx_data->clk_ipg);
+       if (!sdhci_sdio_irq_enabled(host)) {
+               clk_disable_unprepare(imx_data->clk_per);
+               clk_disable_unprepare(imx_data->clk_ipg);
+       }
        clk_disable_unprepare(imx_data->clk_ahb);
 
        return ret;
        struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
        struct pltfm_imx_data *imx_data = pltfm_host->priv;
 
-       clk_prepare_enable(imx_data->clk_per);
-       clk_prepare_enable(imx_data->clk_ipg);
+       if (!sdhci_sdio_irq_enabled(host)) {
+               clk_prepare_enable(imx_data->clk_per);
+               clk_prepare_enable(imx_data->clk_ipg);
+       }
        clk_prepare_enable(imx_data->clk_ahb);
 
        return sdhci_runtime_resume_host(host);
 
 
 static void sdhci_enable_sdio_irq_nolock(struct sdhci_host *host, int enable)
 {
-       /* SDIO IRQ will be enabled as appropriate in runtime resume */
-       if (!(host->flags & SDHCI_DEVICE_DEAD) || host->runtime_suspended) {
+       if (!(host->flags & SDHCI_DEVICE_DEAD)) {
                if (enable)
                        sdhci_unmask_irqs(host, SDHCI_INT_CARD_INT);
                else
 
        spin_lock(&host->lock);
 
-       if (host->runtime_suspended) {
+       if (host->runtime_suspended && !sdhci_sdio_irq_enabled(host)) {
                spin_unlock(&host->lock);
                return IRQ_NONE;
        }
        }
 
        spin_lock_irqsave(&host->lock, flags);
-       sdhci_mask_irqs(host, SDHCI_INT_ALL_MASK);
+       sdhci_mask_irqs(host, SDHCI_INT_ALL_MASK & ~SDHCI_INT_CARD_INT);
        spin_unlock_irqrestore(&host->lock, flags);
 
        synchronize_hardirq(host->irq);
 
 extern void sdhci_send_command(struct sdhci_host *host,
                                struct mmc_command *cmd);
 
+static inline bool sdhci_sdio_irq_enabled(struct sdhci_host *host)
+{
+       return !!(host->flags & SDHCI_SDIO_IRQ_ENABLED);
+}
+
 #ifdef CONFIG_PM
 extern int sdhci_suspend_host(struct sdhci_host *host);
 extern int sdhci_resume_host(struct sdhci_host *host);