|
@@ -28,18 +28,20 @@
|
|
|
|
|
|
#include "sdio_ops.h"
|
|
|
|
|
|
-static int process_sdio_pending_irqs(struct mmc_card *card)
|
|
|
+static int process_sdio_pending_irqs(struct mmc_host *host)
|
|
|
{
|
|
|
+ struct mmc_card *card = host->card;
|
|
|
int i, ret, count;
|
|
|
unsigned char pending;
|
|
|
struct sdio_func *func;
|
|
|
|
|
|
/*
|
|
|
* Optimization, if there is only 1 function interrupt registered
|
|
|
- * call irq handler directly
|
|
|
+ * and we know an IRQ was signaled then call irq handler directly.
|
|
|
+ * Otherwise do the full probe.
|
|
|
*/
|
|
|
func = card->sdio_single_irq;
|
|
|
- if (func) {
|
|
|
+ if (func && host->sdio_irq_pending) {
|
|
|
func->irq_handler(func);
|
|
|
return 1;
|
|
|
}
|
|
@@ -116,7 +118,8 @@ static int sdio_irq_thread(void *_host)
|
|
|
ret = __mmc_claim_host(host, &host->sdio_irq_thread_abort);
|
|
|
if (ret)
|
|
|
break;
|
|
|
- ret = process_sdio_pending_irqs(host->card);
|
|
|
+ ret = process_sdio_pending_irqs(host);
|
|
|
+ host->sdio_irq_pending = false;
|
|
|
mmc_release_host(host);
|
|
|
|
|
|
/*
|