Skip to content

Commit d737f0b

Browse files
committed
mmc: litex_mmc: acknowledge all handled IRQs at once
Collect all handled IRQs and acknowledge them all at once, factoring out the MMIO port write required to do so. Signed-off-by: Gabriel Somlo <[email protected]>
1 parent c48941f commit d737f0b

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

drivers/mmc/host/litex_mmc.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -244,25 +244,24 @@ static irqreturn_t litex_mmc_interrupt(int irq, void *arg)
244244
struct mmc_host *mmc = arg;
245245
struct litex_mmc_host *host = mmc_priv(mmc);
246246
u32 pending = litex_read32(host->sdirq + LITEX_IRQ_PENDING);
247-
irqreturn_t ret = IRQ_NONE;
247+
u32 handled = 0;
248248

249249
/* Check for card change interrupt */
250250
if (pending & SDIRQ_CARD_DETECT) {
251-
litex_write32(host->sdirq + LITEX_IRQ_PENDING,
252-
SDIRQ_CARD_DETECT);
251+
handled |= SDIRQ_CARD_DETECT;
253252
mmc_detect_change(mmc, msecs_to_jiffies(10));
254-
ret = IRQ_HANDLED;
255253
}
256254

257255
/* Check for command completed */
258256
if (pending & SDIRQ_CMD_DONE) {
259-
litex_write32(host->sdirq + LITEX_IRQ_PENDING,
260-
SDIRQ_CMD_DONE);
257+
handled |= SDIRQ_CMD_DONE;
261258
complete(&host->cmd_done);
262-
ret = IRQ_HANDLED;
263259
}
264260

265-
return ret;
261+
/* Acknowledge handled interrupts */
262+
litex_write32(host->sdirq + LITEX_IRQ_PENDING, handled);
263+
264+
return handled ? IRQ_HANDLED : IRQ_NONE;
266265
}
267266

268267
static u32 litex_mmc_response_len(struct mmc_command *cmd)

0 commit comments

Comments
 (0)