|
48 | 48 |
|
49 | 49 | void tmio_mmc_enable_mmc_irqs(struct tmio_mmc_host *host, u32 i)
|
50 | 50 | {
|
51 |
| - u32 mask = sd_ctrl_read32(host, CTL_IRQ_MASK) & ~(i & TMIO_MASK_IRQ); |
52 |
| - sd_ctrl_write32(host, CTL_IRQ_MASK, mask); |
| 51 | + host->sdcard_irq_mask &= ~(i & TMIO_MASK_IRQ); |
| 52 | + sd_ctrl_write32(host, CTL_IRQ_MASK, host->sdcard_irq_mask); |
53 | 53 | }
|
54 | 54 |
|
55 | 55 | void tmio_mmc_disable_mmc_irqs(struct tmio_mmc_host *host, u32 i)
|
56 | 56 | {
|
57 |
| - u32 mask = sd_ctrl_read32(host, CTL_IRQ_MASK) | (i & TMIO_MASK_IRQ); |
58 |
| - sd_ctrl_write32(host, CTL_IRQ_MASK, mask); |
| 57 | + host->sdcard_irq_mask |= (i & TMIO_MASK_IRQ); |
| 58 | + sd_ctrl_write32(host, CTL_IRQ_MASK, host->sdcard_irq_mask); |
59 | 59 | }
|
60 | 60 |
|
61 | 61 | static void tmio_mmc_ack_mmc_irqs(struct tmio_mmc_host *host, u32 i)
|
@@ -127,11 +127,13 @@ static void tmio_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
|
127 | 127 |
|
128 | 128 | if (enable) {
|
129 | 129 | host->sdio_irq_enabled = 1;
|
| 130 | + host->sdio_irq_mask = TMIO_SDIO_MASK_ALL & |
| 131 | + ~TMIO_SDIO_STAT_IOIRQ; |
130 | 132 | sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0001);
|
131 |
| - sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, |
132 |
| - (TMIO_SDIO_MASK_ALL & ~TMIO_SDIO_STAT_IOIRQ)); |
| 133 | + sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask); |
133 | 134 | } else {
|
134 |
| - sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, TMIO_SDIO_MASK_ALL); |
| 135 | + host->sdio_irq_mask = TMIO_SDIO_MASK_ALL; |
| 136 | + sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask); |
135 | 137 | sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0000);
|
136 | 138 | host->sdio_irq_enabled = 0;
|
137 | 139 | }
|
@@ -548,26 +550,25 @@ irqreturn_t tmio_mmc_irq(int irq, void *devid)
|
548 | 550 | struct tmio_mmc_host *host = devid;
|
549 | 551 | struct mmc_host *mmc = host->mmc;
|
550 | 552 | struct tmio_mmc_data *pdata = host->pdata;
|
551 |
| - unsigned int ireg, irq_mask, status; |
552 |
| - unsigned int sdio_ireg, sdio_irq_mask, sdio_status; |
| 553 | + unsigned int ireg, status; |
| 554 | + unsigned int sdio_ireg, sdio_status; |
553 | 555 |
|
554 | 556 | pr_debug("MMC IRQ begin\n");
|
555 | 557 |
|
556 | 558 | status = sd_ctrl_read32(host, CTL_STATUS);
|
557 |
| - irq_mask = sd_ctrl_read32(host, CTL_IRQ_MASK); |
558 |
| - ireg = status & TMIO_MASK_IRQ & ~irq_mask; |
| 559 | + ireg = status & TMIO_MASK_IRQ & ~host->sdcard_irq_mask; |
559 | 560 |
|
560 | 561 | sdio_ireg = 0;
|
561 | 562 | if (!ireg && pdata->flags & TMIO_MMC_SDIO_IRQ) {
|
562 | 563 | sdio_status = sd_ctrl_read16(host, CTL_SDIO_STATUS);
|
563 |
| - sdio_irq_mask = sd_ctrl_read16(host, CTL_SDIO_IRQ_MASK); |
564 |
| - sdio_ireg = sdio_status & TMIO_SDIO_MASK_ALL & ~sdio_irq_mask; |
| 564 | + sdio_ireg = sdio_status & TMIO_SDIO_MASK_ALL & |
| 565 | + ~host->sdio_irq_mask; |
565 | 566 |
|
566 | 567 | sd_ctrl_write16(host, CTL_SDIO_STATUS, sdio_status & ~TMIO_SDIO_MASK_ALL);
|
567 | 568 |
|
568 | 569 | if (sdio_ireg && !host->sdio_irq_enabled) {
|
569 | 570 | pr_warning("tmio_mmc: Spurious SDIO IRQ, disabling! 0x%04x 0x%04x 0x%04x\n",
|
570 |
| - sdio_status, sdio_irq_mask, sdio_ireg); |
| 571 | + sdio_status, host->sdio_irq_mask, sdio_ireg); |
571 | 572 | tmio_mmc_enable_sdio_irq(mmc, 0);
|
572 | 573 | goto out;
|
573 | 574 | }
|
@@ -623,9 +624,9 @@ irqreturn_t tmio_mmc_irq(int irq, void *devid)
|
623 | 624 | }
|
624 | 625 |
|
625 | 626 | pr_warning("tmio_mmc: Spurious irq, disabling! "
|
626 |
| - "0x%08x 0x%08x 0x%08x\n", status, irq_mask, ireg); |
| 627 | + "0x%08x 0x%08x 0x%08x\n", status, host->sdcard_irq_mask, ireg); |
627 | 628 | pr_debug_status(status);
|
628 |
| - tmio_mmc_disable_mmc_irqs(host, status & ~irq_mask); |
| 629 | + tmio_mmc_disable_mmc_irqs(host, status & ~host->sdcard_irq_mask); |
629 | 630 |
|
630 | 631 | out:
|
631 | 632 | return IRQ_HANDLED;
|
@@ -882,6 +883,7 @@ int __devinit tmio_mmc_host_probe(struct tmio_mmc_host **host,
|
882 | 883 | tmio_mmc_clk_stop(_host);
|
883 | 884 | tmio_mmc_reset(_host);
|
884 | 885 |
|
| 886 | + _host->sdcard_irq_mask = sd_ctrl_read32(_host, CTL_IRQ_MASK); |
885 | 887 | tmio_mmc_disable_mmc_irqs(_host, TMIO_MASK_ALL);
|
886 | 888 | if (pdata->flags & TMIO_MMC_SDIO_IRQ)
|
887 | 889 | tmio_mmc_enable_sdio_irq(mmc, 0);
|
|
0 commit comments