|
|
@@ -35,6 +35,7 @@ static int process_sdio_pending_irqs(struct mmc_host *host)
|
|
|
{
|
|
|
struct mmc_card *card = host->card;
|
|
|
int i, ret, count;
|
|
|
+ bool sdio_irq_pending = host->sdio_irq_pending;
|
|
|
unsigned char pending;
|
|
|
struct sdio_func *func;
|
|
|
|
|
|
@@ -42,13 +43,16 @@ static int process_sdio_pending_irqs(struct mmc_host *host)
|
|
|
if (mmc_card_suspended(card))
|
|
|
return 0;
|
|
|
|
|
|
+ /* Clear the flag to indicate that we have processed the IRQ. */
|
|
|
+ host->sdio_irq_pending = false;
|
|
|
+
|
|
|
/*
|
|
|
* Optimization, if there is only 1 function interrupt registered
|
|
|
* and we know an IRQ was signaled then call irq handler directly.
|
|
|
* Otherwise do the full probe.
|
|
|
*/
|
|
|
func = card->sdio_single_irq;
|
|
|
- if (func && host->sdio_irq_pending) {
|
|
|
+ if (func && sdio_irq_pending) {
|
|
|
func->irq_handler(func);
|
|
|
return 1;
|
|
|
}
|
|
|
@@ -100,7 +104,6 @@ void sdio_run_irqs(struct mmc_host *host)
|
|
|
{
|
|
|
mmc_claim_host(host);
|
|
|
if (host->sdio_irqs) {
|
|
|
- host->sdio_irq_pending = true;
|
|
|
process_sdio_pending_irqs(host);
|
|
|
if (host->ops->ack_sdio_irq)
|
|
|
host->ops->ack_sdio_irq(host);
|
|
|
@@ -119,6 +122,7 @@ void sdio_irq_work(struct work_struct *work)
|
|
|
|
|
|
void sdio_signal_irq(struct mmc_host *host)
|
|
|
{
|
|
|
+ host->sdio_irq_pending = true;
|
|
|
queue_delayed_work(system_wq, &host->sdio_irq_work, 0);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(sdio_signal_irq);
|
|
|
@@ -164,7 +168,6 @@ static int sdio_irq_thread(void *_host)
|
|
|
if (ret)
|
|
|
break;
|
|
|
ret = process_sdio_pending_irqs(host);
|
|
|
- host->sdio_irq_pending = false;
|
|
|
mmc_release_host(host);
|
|
|
|
|
|
/*
|