| From 1e336b0d7c70bd78d887aa0eb8ef68333d0ac171 Mon Sep 17 00:00:00 2001 |
| From: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Date: Thu, 19 Jan 2017 21:07:18 +0100 |
| Subject: [PATCH 157/255] mmc: tmio: discard obsolete SDIO irqs before enabling |
| irqs |
| |
| Before enabling SDIO irqs, clear the status bit, so we discard old and |
| stale interrupts. Needed to get two wireless cards working. Use the |
| newly introduced macro in all places. |
| |
| Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| (cherry picked from commit ee28981535f4261ed5d127ddf4d1a3f8778f520d) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/mmc/host/tmio_mmc.h | 2 ++ |
| drivers/mmc/host/tmio_mmc_pio.c | 13 +++++++++++-- |
| 2 files changed, 13 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/mmc/host/tmio_mmc.h |
| +++ b/drivers/mmc/host/tmio_mmc.h |
| @@ -90,6 +90,8 @@ |
| #define TMIO_SDIO_STAT_EXWT 0x8000 |
| #define TMIO_SDIO_MASK_ALL 0xc007 |
| |
| +#define TMIO_SDIO_SETBITS_MASK 0x0006 |
| + |
| /* Define some IRQ masks */ |
| /* This is the mask used at reset by the chip */ |
| #define TMIO_MASK_ALL 0x837f031d |
| --- a/drivers/mmc/host/tmio_mmc_pio.c |
| +++ b/drivers/mmc/host/tmio_mmc_pio.c |
| @@ -134,12 +134,21 @@ static void tmio_mmc_enable_sdio_irq(str |
| struct tmio_mmc_host *host = mmc_priv(mmc); |
| |
| if (enable && !host->sdio_irq_enabled) { |
| + u16 sdio_status; |
| + |
| /* Keep device active while SDIO irq is enabled */ |
| pm_runtime_get_sync(mmc_dev(mmc)); |
| - host->sdio_irq_enabled = true; |
| |
| + host->sdio_irq_enabled = true; |
| host->sdio_irq_mask = TMIO_SDIO_MASK_ALL & |
| ~TMIO_SDIO_STAT_IOIRQ; |
| + |
| + /* Clear obsolete interrupts before enabling */ |
| + sdio_status = sd_ctrl_read16(host, CTL_SDIO_STATUS) & ~TMIO_SDIO_MASK_ALL; |
| + if (host->pdata->flags & TMIO_MMC_SDIO_STATUS_SETBITS) |
| + sdio_status |= TMIO_SDIO_SETBITS_MASK; |
| + sd_ctrl_write16(host, CTL_SDIO_STATUS, sdio_status); |
| + |
| sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask); |
| } else if (!enable && host->sdio_irq_enabled) { |
| host->sdio_irq_mask = TMIO_SDIO_MASK_ALL; |
| @@ -724,7 +733,7 @@ static void __tmio_mmc_sdio_irq(struct t |
| |
| sdio_status = status & ~TMIO_SDIO_MASK_ALL; |
| if (pdata->flags & TMIO_MMC_SDIO_STATUS_SETBITS) |
| - sdio_status |= 6; |
| + sdio_status |= TMIO_SDIO_SETBITS_MASK; |
| |
| sd_ctrl_write16(host, CTL_SDIO_STATUS, sdio_status); |
| |