2013/1/8 Ulf Hansson <[email protected]>:
> On 7 January 2013 17:04, Kevin Liu <[email protected]> wrote:
>> 2013/1/7 Ulf Hansson <[email protected]>:
>>> On 7 January 2013 12:16, Kevin Liu <[email protected]> wrote:
>>>> 2013/1/7 Ulf Hansson <[email protected]>:
>>>>> On 21 December 2012 13:59, Kevin Liu <[email protected]> wrote:
>>>>>> 2012/12/21 Ulf Hansson <[email protected]>:
>>>>>>> On 19 December 2012 13:12, Kevin Liu <[email protected]> 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.
>>
>
> Yes, but is that really correct? Should the host really do
> mmc_signal_sdio_irq when the host is suspended? To me it feel like a
> more proper way of dealing with this is to let the normal resume
> sequence eventually handle it instead?
>

Yes, it seems more reasonable...
Just skip the wake_up if suspended...I will update the patch. Thanks!

>>>>
>>>>>>
>>>>>> 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 <[email protected]>
>>>>>>>> Signed-off-by: Kevin Liu <[email protected]>
>>>>>>>> ---
>>>>>>>>  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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to