2013/1/7 Ulf Hansson <ulf.hans...@linaro.org>:
> On 7 January 2013 12:16, Kevin Liu <keyuan....@gmail.com> wrote:
>> 2013/1/7 Ulf Hansson <ulf.hans...@linaro.org>:
>>> On 21 December 2012 13:59, Kevin Liu <keyuan....@gmail.com> wrote:
>>>> 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.
>>>
>>> That is because the sdio host, when in a suspended state, does a
>>> mmc_signal_sdio_irq call. Is that really what the host should do in
>>> this state?
>>>
>>
>> Yes, the host should do this because we want the sdio to wakeup host
>> after system suspended.
>> So we must keep interrupt enabled after suspended.
>
> I see that you need to keep the irqs enabled. But that does not mean
> you need to call the mmc_signal_sdio_irq, when the host is in
> suspended. You should only need to keep the irqs enabled to wake up
> the system from suspend, that is enough, the rest could be handled
> through the normal resume sequence. Don't you think?
>

mmc_signal_sdio_irq is called by sdhci_irq if card interrupt occur.
So if the irqs enabled, then mmc_signal_sdio_irq will be called when
card int from sdio occur even after host suspended and before resumed.

>>
>>>>
>>>> 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