All of lore.kernel.org
 help / color / mirror / Atom feed
From: Guy Shapiro <guy.shapiro@mobi-wize.com>
To: Alexandre Belloni <alexandre.belloni@free-electrons.com>,
	Sebastian Reichel <sre@kernel.org>
Cc: b20788@freescale.com, shawnguo@kernel.org,
	Frank.Li@freescale.com, kernel@pengutronix.de,
	fabio.estevam@nxp.com, a.zummo@towertech.it,
	linux-arm-kernel@lists.infradead.org, rtc-linux@googlegroups.com,
	linux-pm@vger.kernel.org
Subject: [rtc-linux] Re: imx6ul: power-up using the RTC
Date: Sun, 22 Jan 2017 12:46:24 +0200	[thread overview]
Message-ID: <7a2d9e48-9a58-7d79-bc36-05a9b790cce3@mobi-wize.com> (raw)
In-Reply-To: <20170120153459.tewyg54dcgqnpz2j@piout.net>

[-- Attachment #1: Type: text/plain, Size: 4377 bytes --]

On 20/01/2017 17:34, Alexandre Belloni wrote:
> On 20/01/2017 at 13:12:10 +0100, Sebastian Reichel wrote : >> Hi, >> >> On Wed, Jan 18, 2017 at 04:49:11PM +0200, Guy Shapiro
wrote: >>> I'm trying to use the low power RTC of the i.MX6UL to start
from >>> power-off state. >>> >>> I started by hopefully running: # echo
+30 > >>> /sys/class/rtc/rtc0/wakealarm && shutdown -h now The system
was >>> powered down, but it didn't come up after 30 seconds as
expected. >>> >>> So I dug into the datasheet and the source... >>> To
activate the power on alarm, the flags SRTC_ENV, LPTA_EN and LPWUI_EN on
>>> the SNVS_LP Control register (LPCR) should be asserted. The wakeup
time >>> should be written to the SNVS_LP Time alarm register (LPTA).
The code that >>> does this is on
drivers/rtc/rtc-snvs.c:snvs_rtc_set_alarm(). >>> >>> The first problem I
found was with the use of the syscon-poweroff driver. >>> The "Turn off
System Power" flag is part of the same register (LPCR). The >>> current
code of syscon-poweroff set the register to the "mask" property from >>>
the device tree on power off, overriding all the existing flags. >>>
After setting the "mask" property on the device tree to 0x6b instead of
>>> 0x60 (asserting the mentioned bits), the system do power up on
timer, as >>> expected. >>> >>> However, I didn't like the idea of
keeping those flags on even when no one >>> set the alarm. >>> As a
quick test, I modified the syscon-poweroff driver to ignore the bits >>>
that are not on the mask: >>> >>> diff --git
a/drivers/power/reset/syscon-poweroff.c >>>
b/drivers/power/reset/syscon-poweroff.c >>> index b683383..a5da02b
100644 >>> --- a/drivers/power/reset/syscon-poweroff.c >>> +++
b/drivers/power/reset/syscon-poweroff.c >>> @@ -33,7 +33,7 @@ static u32
mask; >>> static void syscon_poweroff(void) >>> { >>>         /* Issue
the poweroff */ >>> -       regmap_write(map, offset, mask); >>> +      
regmap_update_bits(map, offset, mask, mask); >>>         mdelay(1000);
>>> >>> >>> After applying this fix, the wake up alarm didn't work.
Strangely, when I >>> added some debug prints to investigate the case,
it worked again >>> (sometimes... depends on the exact places I add the
prints). >>> I suspect that some other driver clears the flags during
the power down, but >>> I couldn't find such driver. >>> >>> Do you have
any clue what code may change this register during the shutdown >>>
process? Any other insights are welcomed as well :) >> >> To summarize
it looks like this? >> >> | regmap_write       | 0x60 |
broken                     | >> | regmap_write       | 0x6b | works
stable               | >> | regmap_update_bits | 0x60 | works only with
dbg prints | >> >> For me it looks like the debug prints may delay the
poweroff driver >> long enough, that some other driver (rtc?) writes the
0x0b bits. >> > > Is snvs_rtc_alarm_irq_enable() waiting long enough?
I'd say yes but you > never know... You can also use the kernel tracin
infrastructure to trace > every accesses made to that regmap. That could
give you a hint. > > At least you can try a regmap_read before returning
from > snvs_rtc_alarm_irq_enable() and see whether SNVS_LPCR_LPTA_EN and
> SNVS_LPCR_LPWUI_EN are still there. >
I added a debug print on snvs_rtc_alarm_irq_enable. It reads and prints the
value of the control register after the write & sync operation.

Immediately after the write to /sys/class/rtc/rtc0/wakealarm the
register value
is correct (0x2b).
However, during the shutdown process the function is called again via the
rtc_timer_do_work(). I still do not fully understand this flow. This call is
done with the enable parameter == 1, but my debug print shows 0x29,
meaning the
LPTA_EN bit stays low.

My current guess is that the clear of LPTA_EN in snvs_rtc_set_alarm have
internal race with the afterward bit set.
I'll try to check this and update.

-- 
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
--- 
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

[-- Attachment #2: Type: text/html, Size: 5797 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: Guy Shapiro <guy.shapiro-2HKgp+mgmS5l57MIdRCFDg@public.gmane.org>
To: Alexandre Belloni
	<alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>,
	Sebastian Reichel <sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: b20788-KZfg59tc24xl57MIdRCFDg@public.gmane.org,
	shawnguo-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	Frank.Li-KZfg59tc24xl57MIdRCFDg@public.gmane.org,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org,
	fabio.estevam-3arQi8VN3Tc@public.gmane.org,
	a.zummo-BfzFCNDTiLLj+vYz1yj4TQ@public.gmane.org,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	rtc-linux-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org,
	linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: imx6ul: power-up using the RTC
Date: Sun, 22 Jan 2017 12:46:24 +0200	[thread overview]
Message-ID: <7a2d9e48-9a58-7d79-bc36-05a9b790cce3@mobi-wize.com> (raw)
In-Reply-To: <20170120153459.tewyg54dcgqnpz2j-m++hUPXGwpdeoWH0uzbU5w@public.gmane.org>

[-- Attachment #1: Type: text/plain, Size: 4409 bytes --]

On 20/01/2017 17:34, Alexandre Belloni wrote:
> On 20/01/2017 at 13:12:10 +0100, Sebastian Reichel wrote : >> Hi, >> >> On Wed, Jan 18, 2017 at 04:49:11PM +0200, Guy Shapiro
wrote: >>> I'm trying to use the low power RTC of the i.MX6UL to start
from >>> power-off state. >>> >>> I started by hopefully running: # echo
+30 > >>> /sys/class/rtc/rtc0/wakealarm && shutdown -h now The system
was >>> powered down, but it didn't come up after 30 seconds as
expected. >>> >>> So I dug into the datasheet and the source... >>> To
activate the power on alarm, the flags SRTC_ENV, LPTA_EN and LPWUI_EN on
>>> the SNVS_LP Control register (LPCR) should be asserted. The wakeup
time >>> should be written to the SNVS_LP Time alarm register (LPTA).
The code that >>> does this is on
drivers/rtc/rtc-snvs.c:snvs_rtc_set_alarm(). >>> >>> The first problem I
found was with the use of the syscon-poweroff driver. >>> The "Turn off
System Power" flag is part of the same register (LPCR). The >>> current
code of syscon-poweroff set the register to the "mask" property from >>>
the device tree on power off, overriding all the existing flags. >>>
After setting the "mask" property on the device tree to 0x6b instead of
>>> 0x60 (asserting the mentioned bits), the system do power up on
timer, as >>> expected. >>> >>> However, I didn't like the idea of
keeping those flags on even when no one >>> set the alarm. >>> As a
quick test, I modified the syscon-poweroff driver to ignore the bits >>>
that are not on the mask: >>> >>> diff --git
a/drivers/power/reset/syscon-poweroff.c >>>
b/drivers/power/reset/syscon-poweroff.c >>> index b683383..a5da02b
100644 >>> --- a/drivers/power/reset/syscon-poweroff.c >>> +++
b/drivers/power/reset/syscon-poweroff.c >>> @@ -33,7 +33,7 @@ static u32
mask; >>> static void syscon_poweroff(void) >>> { >>>         /* Issue
the poweroff */ >>> -       regmap_write(map, offset, mask); >>> +      
regmap_update_bits(map, offset, mask, mask); >>>         mdelay(1000);
>>> >>> >>> After applying this fix, the wake up alarm didn't work.
Strangely, when I >>> added some debug prints to investigate the case,
it worked again >>> (sometimes... depends on the exact places I add the
prints). >>> I suspect that some other driver clears the flags during
the power down, but >>> I couldn't find such driver. >>> >>> Do you have
any clue what code may change this register during the shutdown >>>
process? Any other insights are welcomed as well :) >> >> To summarize
it looks like this? >> >> | regmap_write       | 0x60 |
broken                     | >> | regmap_write       | 0x6b | works
stable               | >> | regmap_update_bits | 0x60 | works only with
dbg prints | >> >> For me it looks like the debug prints may delay the
poweroff driver >> long enough, that some other driver (rtc?) writes the
0x0b bits. >> > > Is snvs_rtc_alarm_irq_enable() waiting long enough?
I'd say yes but you > never know... You can also use the kernel tracin
infrastructure to trace > every accesses made to that regmap. That could
give you a hint. > > At least you can try a regmap_read before returning
from > snvs_rtc_alarm_irq_enable() and see whether SNVS_LPCR_LPTA_EN and
> SNVS_LPCR_LPWUI_EN are still there. >
I added a debug print on snvs_rtc_alarm_irq_enable. It reads and prints the
value of the control register after the write & sync operation.

Immediately after the write to /sys/class/rtc/rtc0/wakealarm the
register value
is correct (0x2b).
However, during the shutdown process the function is called again via the
rtc_timer_do_work(). I still do not fully understand this flow. This call is
done with the enable parameter == 1, but my debug print shows 0x29,
meaning the
LPTA_EN bit stays low.

My current guess is that the clear of LPTA_EN in snvs_rtc_set_alarm have
internal race with the afterward bit set.
I'll try to check this and update.

-- 
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
--- 
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit https://groups.google.com/d/optout.

[-- Attachment #2: Type: text/html, Size: 5843 bytes --]

  reply	other threads:[~2017-01-22 10:46 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-18 14:49 [rtc-linux] imx6ul: power-up using the RTC Guy Shapiro
2017-01-18 14:49 ` Guy Shapiro
2017-01-18 14:49 ` Guy Shapiro
2017-01-20 12:12 ` [rtc-linux] " Sebastian Reichel
2017-01-20 12:12   ` Sebastian Reichel
2017-01-20 12:12   ` Sebastian Reichel
2017-01-20 15:34   ` [rtc-linux] " Alexandre Belloni
2017-01-20 15:34     ` Alexandre Belloni
2017-01-20 15:34     ` Alexandre Belloni
2017-01-22 10:46     ` Guy Shapiro [this message]
2017-01-22 10:46       ` Guy Shapiro
2017-01-22 11:17     ` [rtc-linux] " Guy Shapiro
2017-01-22 11:17       ` Guy Shapiro
2017-01-22 11:17       ` Guy Shapiro
2017-01-29  7:36       ` [rtc-linux] " Guy Shapiro
2017-01-29  7:36         ` Guy Shapiro
2017-01-29  7:36         ` Guy Shapiro
2017-01-22 10:46   ` [rtc-linux] " Guy Shapiro
2017-01-22 10:46     ` Guy Shapiro
2017-01-22 10:46     ` Guy Shapiro
2017-01-22 11:15   ` [rtc-linux] " Guy Shapiro
2017-01-22 11:15     ` Guy Shapiro
2017-01-22 11:15     ` Guy Shapiro

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=7a2d9e48-9a58-7d79-bc36-05a9b790cce3@mobi-wize.com \
    --to=guy.shapiro@mobi-wize.com \
    --cc=Frank.Li@freescale.com \
    --cc=a.zummo@towertech.it \
    --cc=alexandre.belloni@free-electrons.com \
    --cc=b20788@freescale.com \
    --cc=fabio.estevam@nxp.com \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rtc-linux@googlegroups.com \
    --cc=shawnguo@kernel.org \
    --cc=sre@kernel.org \
    /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.