public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Kevin Hilman <khilman@linaro.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: rtc-linux@googlegroups.com, linux-omap@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linaro-kernel@lists.linaro.org,
	Alessandro Zummo <a.zummo@towertech.it>,
	Tony Lindgren <tony@atomide.com>,
	linux-kernel@vger.kernel.org (open list)
Subject: Re: [PATCH] rtc: rtc-twl: ensure IRQ is wakeup enabled
Date: Tue, 04 Jun 2013 10:54:54 -0700	[thread overview]
Message-ID: <87k3m93gnl.fsf@linaro.org> (raw)
In-Reply-To: <20130603161303.55e9da049744656541e9048f@linux-foundation.org> (Andrew Morton's message of "Mon, 3 Jun 2013 16:13:03 -0700")

Andrew Morton <akpm@linux-foundation.org> writes:

> On Fri, 31 May 2013 15:37:07 -0700 Kevin Hilman <khilman@linaro.org> wrote:
>
>> Currently, the RTC IRQ is never wakeup-enabled so is not capable of
>> bringing the system out of suspend.
>> 
>> On OMAP platforms, we have gotten by without this because the TWL RTC
>> is on an I2C-connected chip which is capable of waking up the OMAP via
>> the IO ring when the OMAP is in low-power states.
>> 
>> However, if the OMAP suspends without hitting the low-power states
>> (and the IO ring is not enabled), RTC wakeups will not work because
>> the IRQ is not wakeup enabled.
>> 
>> To fix, ensure the RTC IRQ is wakeup enabled whenever the RTC alarm is
>> set.
>> 
>> --- a/drivers/rtc/rtc-twl.c
>> +++ b/drivers/rtc/rtc-twl.c
>> @@ -213,12 +213,24 @@ static int mask_rtc_irq_bit(unsigned char bit)
>>  
>>  static int twl_rtc_alarm_irq_enable(struct device *dev, unsigned enabled)
>>  {
>> +	struct platform_device *pdev = to_platform_device(dev);
>> +	int irq = platform_get_irq(pdev, 0);
>> +	static bool twl_rtc_wake_enabled;
>>  	int ret;
>>  
>> -	if (enabled)
>> +	if (enabled) {
>>  		ret = set_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
>> -	else
>> +		if (device_can_wakeup(dev) && !twl_rtc_wake_enabled) {
>> +			enable_irq_wake(irq);
>> +			twl_rtc_wake_enabled = true;
>> +		}
>> +	} else {
>>  		ret = mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
>> +		if (twl_rtc_wake_enabled) {
>> +			disable_irq_wake(irq);
>> +			twl_rtc_wake_enabled = false;
>> +		}
>> +	}
>
> Why do we need this (slightly racy) logic with twl_rtc_wake_enabled? 
> Other drivers don't do this.

I suspect the other drivers don't do this because they're making these
calls in their suspend/resume callbacks and can make assumptions about 
the order and balance of the calls (e.g. the PM core will not call your
resume callback if your suspend callback hasn't been called.)  What's
being protected against is imbalanced calling of the IRQ wake calls
(e.g. calling disable_irq_wake() on an IRQ where enable_irq_wake() has
not been called.)

In this patch, I'm using the rtc_alarm_irq_enable() function instead of
the suspend/resume functions because of some limitations of parent
device of this one (I described that at the end of a previous reponse to
this thread[1].)  Because of that, I cannot make the same assumptions
about the ordering of enable/disable calls to this function.

> Should we test device_may_wakeup() befre running disable_irq_wake()? 
> Most drivers seem to do this, but it's all a bit foggy.

I suppose I could've added that check too for symmetry, but it would be
redundant because the twl_rtc_wake_enabled flag can only be set when
device_can_wakeup() == true.

Kevin

[1] http://marc.info/?l=linux-omap&m=137036801320665&w=2

  reply	other threads:[~2013-06-04 17:55 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-31 22:37 [PATCH] rtc: rtc-twl: ensure IRQ is wakeup enabled Kevin Hilman
2013-06-03 23:13 ` Andrew Morton
2013-06-04 17:54   ` Kevin Hilman [this message]
2013-06-04 11:32 ` Grygorii Strashko
2013-06-04 17:46   ` Kevin Hilman
2013-06-05 14:32     ` Grygorii Strashko
2013-06-05 15:32       ` Kevin Hilman

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=87k3m93gnl.fsf@linaro.org \
    --to=khilman@linaro.org \
    --cc=a.zummo@towertech.it \
    --cc=akpm@linux-foundation.org \
    --cc=linaro-kernel@lists.linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=rtc-linux@googlegroups.com \
    --cc=tony@atomide.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox