2012/12/21 Ulf Hansson <ulf.hans...@linaro.org>:
> On 19 December 2012 13:12, Kevin Liu <kl...@marvell.com> wrote:
>> If sdio host can wakeup system, its interrupt will _NOT_ be disabled
>> during suspending. So when card interrupt happens, the sdio irq thread
>> will be woken up.
>
> Is that really needed to handle the irq?
>
> I think you should instead wait on the system resume to be handled
> properly. In the mmc_sdio_resume, sdio_irq thread is woken up to find
> out if there is an irq to handle.
>
> ....
> if (!err && host->sdio_irqs)
>   wake_up_process(host->sdio_irq_thread);
> ....
>
> Would that not solve your issue?
>

With current code, if irq keeps on during suspend/resume, when
interrupt happen, sdio_irq_thread will be woken up and handle the
interrupt immediately while sdio host has suspended. It won't wait.

Just as you said, this patch just let sdio_irq_thread wait untill sdio
host resume back to handle the interrupt.

>> Claim the host  to avoid sdio irq thread handling the pending interrupt
>> while sdio host suspended. The pending interrupt will be handled after
>> the host released in resume when sdio host has been resumed.
>>
>> Signed-off-by: Jialing Fu <j...@marvell.com>
>> Signed-off-by: Kevin Liu <kl...@marvell.com>
>> ---
>>  drivers/mmc/core/sdio.c |   20 ++++++++++++++++++--
>>  1 files changed, 18 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c
>> index 2273ce6..81140b9 100644
>> --- a/drivers/mmc/core/sdio.c
>> +++ b/drivers/mmc/core/sdio.c
>> @@ -11,6 +11,7 @@
>>
>>  #include <linux/err.h>
>>  #include <linux/pm_runtime.h>
>> +#include <linux/pm_wakeup.h>
>>
>>  #include <linux/mmc/host.h>
>>  #include <linux/mmc/card.h>
>> @@ -923,6 +924,17 @@ static int mmc_sdio_suspend(struct mmc_host *host)
>>                 mmc_release_host(host);
>>         }
>>
>> +       /*
>> +       * If sdio host can wakeup system, its interrupt will _NOT_ be 
>> disabled
>> +       * during suspending. So the card interrupt may occur after host has
>> +       * suspended. Claim the host here to avoid sdio irq thread handling 
>> the
>> +       * pending interrupt while sdio host suspended. The pending interrupt
>> +       * will be handled after the host released in resume when sdio host 
>> has
>> +       * been resumed.
>> +       */
>> +       if (!err && device_may_wakeup(mmc_dev(host)))
>> +               mmc_claim_host(host);
>> +
>>         return err;
>>  }
>>
>> @@ -933,8 +945,12 @@ static int mmc_sdio_resume(struct mmc_host *host)
>>         BUG_ON(!host);
>>         BUG_ON(!host->card);
>>
>> -       /* Basic card reinitialization. */
>> -       mmc_claim_host(host);
>> +       /*
>> +       * Basic card reinitialization.
>> +       * if sdio host can wakeup system, the host has been claimed in 
>> suspend.
>> +       */
>> +       if (!device_may_wakeup(mmc_dev(host)))
>> +               mmc_claim_host(host);
>>
>>         /* No need to reinitialize powered-resumed nonremovable cards */
>>         if (mmc_card_is_removable(host) || !mmc_card_keep_power(host))
>> --
>> 1.7.0.4
>>
>
> Kind regards
> Ulf Hansson
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to