All of lore.kernel.org
 help / color / mirror / Atom feed
From: Santosh Shilimkar <santosh.shilimkar@ti.com>
To: Colin Cross <ccross@google.com>
Cc: khilman@ti.com, linux-omap@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, rnayak@ti.com
Subject: Re: [pm-core][PATCH v3 01/21] OMAP4: PM: Add omap WakeupGen module support
Date: Sun, 03 Apr 2011 11:21:00 +0530	[thread overview]
Message-ID: <4D980AC4.2050903@ti.com> (raw)
In-Reply-To: <BANLkTi=DjoDndvnhJyBSUGChdPuAKDL3mg@mail.gmail.com>

On 4/3/2011 1:17 AM, Colin Cross wrote:
> On Sat, Apr 2, 2011 at 2:40 AM, Santosh Shilimkar
> <santosh.shilimkar@ti.com>  wrote:
>> On 4/2/2011 11:40 AM, Colin Cross wrote:

[....]

>>>> +#ifdef CONFIG_PM
>>>> +/*
>>>> + * Architecture specific set_wake extension
>>>> + */
>>>> +static int wakeupgen_set_wake(struct irq_data *d, unsigned int on)
>>>> +{
>>>> +       spin_lock(&wakeupgen_lock);
>>>> +       if (on)
>>>> +               _wakeupgen_set(d->irq);
>>>> +       else
>>>> +               _wakeupgen_clear(d->irq);
>>>> +       spin_unlock(&wakeupgen_lock);
>>>> +
>>>> +       return 0;
>>>> +}
>>>> +
>>>> +#else
>>>> +#define wakeupgen_set_wake     NULL
>>>> +#endif
>>>
>>> I don't think these are correct, and it probably only works at all due
>>> to lazy disabling of interrupts during suspend.
>>>
>>> First, unless I'm missing some code somewhere, all interrupts are
>>> still enabled during suspend.  Any interrupt that has had enable_irq
>>> on it resulted in a call to wakeupgen_unmask, but when disable_irq is
>>> called on all the interrupts during suspend, masking is delayed until
>>> an interrupt is delivered.  If no interrupt is delivered, all enabled
>>> irqs will still be enabled in the wakeupgen module in suspend, and
>>> they will all wake the device out of suspend.
>>>
>> During suspend it's expected that the drivers disables there interrupts
>> as part of suspend hooks. One can used "set_wake" API's to
>> enable/disable wakeups from suspend.
>
> But because of lazy masking, disabling an interrupt is not the same as
> masking.  None of the interrupts will get masked, and they will all
> act as wakeup interrupts, even if enable_irq_wake was never called on
> it.
>
>>
>>> Second, it is possible for a wake interrupt that should be enabled to
>>> end up disabled in suspend.  Consider the following calls that occur
>>> in a driver during its suspend handler:
>>>
>>> enable_irq_wake
>>>    ...
>>>    wakeupgen_unmask (irq is now unmasked)
>>> disable_irq (lazy disable, wakeupgen_mask is not called, irq is still
>>> unmasked)
>>> <irq occurs>
>>> handle_level_irq
>>>    ...
>>>    wakeupgen_mask (irq is now masked)
>>>
>>> The irq will never get unmasked because it is marked disabled, and the
>>> irq will not wake the device from suspend.
>>>
>>> wakeupgen_set_wake needs to set or clear bits in memory, and then
>>> those suspend masks need to be copied into the wakeupgen registers
>>> very late in suspend, after interrupts have been disabled at the cpu.
>>> I think syscore_ops is the right place.
>>>
>> This is a good point about lazy disabling. Copy to memory happens
>> already as part of save in SAR layout.
>> Will think over this one. Thanks for bringing this point here.
>
> The key is that mask/unmask and set_wake must act on different mask
> data - mask/unmask must take effect immediately, so they must write to
> the mask registers, but set_wake takes effect only during suspend, so
> it must write to a copy of the mask registers that gets switched in
> during suspend.
>
Right. I shall fix the set_wake() API to take care of lazy
disabling of IRQs.

Regards
Santosh



WARNING: multiple messages have this Message-ID (diff)
From: santosh.shilimkar@ti.com (Santosh Shilimkar)
To: linux-arm-kernel@lists.infradead.org
Subject: [pm-core][PATCH v3 01/21] OMAP4: PM: Add omap WakeupGen module support
Date: Sun, 03 Apr 2011 11:21:00 +0530	[thread overview]
Message-ID: <4D980AC4.2050903@ti.com> (raw)
In-Reply-To: <BANLkTi=DjoDndvnhJyBSUGChdPuAKDL3mg@mail.gmail.com>

On 4/3/2011 1:17 AM, Colin Cross wrote:
> On Sat, Apr 2, 2011 at 2:40 AM, Santosh Shilimkar
> <santosh.shilimkar@ti.com>  wrote:
>> On 4/2/2011 11:40 AM, Colin Cross wrote:

[....]

>>>> +#ifdef CONFIG_PM
>>>> +/*
>>>> + * Architecture specific set_wake extension
>>>> + */
>>>> +static int wakeupgen_set_wake(struct irq_data *d, unsigned int on)
>>>> +{
>>>> +       spin_lock(&wakeupgen_lock);
>>>> +       if (on)
>>>> +               _wakeupgen_set(d->irq);
>>>> +       else
>>>> +               _wakeupgen_clear(d->irq);
>>>> +       spin_unlock(&wakeupgen_lock);
>>>> +
>>>> +       return 0;
>>>> +}
>>>> +
>>>> +#else
>>>> +#define wakeupgen_set_wake     NULL
>>>> +#endif
>>>
>>> I don't think these are correct, and it probably only works at all due
>>> to lazy disabling of interrupts during suspend.
>>>
>>> First, unless I'm missing some code somewhere, all interrupts are
>>> still enabled during suspend.  Any interrupt that has had enable_irq
>>> on it resulted in a call to wakeupgen_unmask, but when disable_irq is
>>> called on all the interrupts during suspend, masking is delayed until
>>> an interrupt is delivered.  If no interrupt is delivered, all enabled
>>> irqs will still be enabled in the wakeupgen module in suspend, and
>>> they will all wake the device out of suspend.
>>>
>> During suspend it's expected that the drivers disables there interrupts
>> as part of suspend hooks. One can used "set_wake" API's to
>> enable/disable wakeups from suspend.
>
> But because of lazy masking, disabling an interrupt is not the same as
> masking.  None of the interrupts will get masked, and they will all
> act as wakeup interrupts, even if enable_irq_wake was never called on
> it.
>
>>
>>> Second, it is possible for a wake interrupt that should be enabled to
>>> end up disabled in suspend.  Consider the following calls that occur
>>> in a driver during its suspend handler:
>>>
>>> enable_irq_wake
>>>    ...
>>>    wakeupgen_unmask (irq is now unmasked)
>>> disable_irq (lazy disable, wakeupgen_mask is not called, irq is still
>>> unmasked)
>>> <irq occurs>
>>> handle_level_irq
>>>    ...
>>>    wakeupgen_mask (irq is now masked)
>>>
>>> The irq will never get unmasked because it is marked disabled, and the
>>> irq will not wake the device from suspend.
>>>
>>> wakeupgen_set_wake needs to set or clear bits in memory, and then
>>> those suspend masks need to be copied into the wakeupgen registers
>>> very late in suspend, after interrupts have been disabled at the cpu.
>>> I think syscore_ops is the right place.
>>>
>> This is a good point about lazy disabling. Copy to memory happens
>> already as part of save in SAR layout.
>> Will think over this one. Thanks for bringing this point here.
>
> The key is that mask/unmask and set_wake must act on different mask
> data - mask/unmask must take effect immediately, so they must write to
> the mask registers, but set_wake takes effect only during suspend, so
> it must write to a copy of the mask registers that gets switched in
> during suspend.
>
Right. I shall fix the set_wake() API to take care of lazy
disabling of IRQs.

Regards
Santosh

  reply	other threads:[~2011-04-03  5:51 UTC|newest]

Thread overview: 132+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-28  9:22 [pm-core][PATCH v3 00/21] OMAP4: PM: suspend, CPU-hotplug and CPUilde support Santosh Shilimkar
2011-03-28  9:22 ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 01/21] OMAP4: PM: Add omap WakeupGen module support Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28 20:50   ` Tony Lindgren
2011-03-28 20:50     ` Tony Lindgren
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29 17:01       ` Tony Lindgren
2011-03-29 17:01         ` Tony Lindgren
2011-03-30  6:15         ` Santosh
2011-03-30  6:15           ` Santosh
2011-03-30 18:40           ` Tony Lindgren
2011-03-30 18:40             ` Tony Lindgren
2011-03-31  6:28             ` Santosh Shilimkar
2011-03-31  6:28               ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-03-29  5:49     ` Santosh Shilimkar
2011-03-29  5:49       ` Santosh Shilimkar
2011-04-02  6:10   ` Colin Cross
2011-04-02  6:10     ` Colin Cross
2011-04-02  9:40     ` Santosh Shilimkar
2011-04-02  9:40       ` Santosh Shilimkar
2011-04-02 19:47       ` Colin Cross
2011-04-02 19:47         ` Colin Cross
2011-04-03  5:51         ` Santosh Shilimkar [this message]
2011-04-03  5:51           ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 02/21] OMAP4: Use WARN_ON() instead of BUG_ON() with graceful exit Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28 20:53   ` Tony Lindgren
2011-03-28 20:53     ` Tony Lindgren
2011-03-31  8:35     ` Santosh Shilimkar
2011-03-31  8:35       ` Santosh Shilimkar
2011-03-31 14:04       ` Kevin Hilman
2011-03-31 14:04         ` Kevin Hilman
2011-03-31 14:39         ` Santosh Shilimkar
2011-03-31 14:39           ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 03/21] OMAP4: PM: Export omap4_get_base*() rather than global address pointers Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 04/21] OMAP4: PM: Add SAR RAM support Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 05/21] OMAP4: PM: Add CPUX OFF mode support Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 06/21] OMAP4: PM: Initialise all the clockdomains to supported states Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 07/21] OMAP4: PM: Program CPU1 to hit OFF when off-lined Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 08/21] OMAP4: PM: CPU1 wakeup workaround from Low power modes Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 09/21] OMAP4: PM: Add GIC distributor and interface enable/disable accessory API Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 10/21] OMAP4: PM: Add GIC save/restore support Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 11/21] OMAP4: PM: Add WakeupGen " Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 12/21] OMAP4: PM: Add L2 cache lowpower support Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 13/21] OMAP4: suspend: Add MPUSS RET and OFF support Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 14/21] OMAP4: pm-debug: Add wakeup timer and debug counters Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28 21:00   ` Tony Lindgren
2011-03-28 21:00     ` Tony Lindgren
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  6:27       ` Shilimkar, Santosh
2011-03-29  6:27         ` Shilimkar, Santosh
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-29  5:50     ` Santosh Shilimkar
2011-03-29  5:50       ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 15/21] OMAP4: cpuidle: Basic CPUidle support Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 16/21] OMAP4: cpuidle: Add MPUSS RET OFF states Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 17/21] OMAP4: cpuidle: Switch to gptimer from twd in deeper C-states Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 18/21] OMAP4: cpuidle: Add CPU hotplug notifier and prepare() hook Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 19/21] OMAP4: Remove un-used do_wfi() macro Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 20/21] OMAP4: PM: Set static dependency between MPUSS-EMIF and MPUSS-L3_1 Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar
2011-03-28  9:22 ` [pm-core][PATCH v3 21/21] OMAP4: PM: Avoid omap4_pm_init() on OMAP4430 ES1.0 Santosh Shilimkar
2011-03-28  9:22   ` Santosh Shilimkar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4D980AC4.2050903@ti.com \
    --to=santosh.shilimkar@ti.com \
    --cc=ccross@google.com \
    --cc=khilman@ti.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=rnayak@ti.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.