Thread (10 messages) 10 messages, 2 authors, 2016-08-31

[rtc-linux] Re: [PATCH 1/2] rtc-cmos: Clear expired alarm after resume

From: Gabriele Mazzotta <hidden>
Date: 2016-08-31 15:06:04
Also in: lkml

On 31/08/2016 01:28, Alexandre Belloni wrote:
Hi,

On 25/08/2016 at 16:54:18 +0200, Gabriele Mazzotta wrote :
quoted
Hi,

were you able to verify that no other driver is affect?
I had a closer look at the issue. I think what is happening is that you
don't enter the do/while loop in cmos_resume twice. That is supposed to
handle then clear the RTC_AIE bit and that is why the alarm still seems
enabled.

Can you add some tracing there to understand why? It is probably also
useful to know the value of cmos->suspend_ctrl in cmos_suspend.
cmos->suspend_ctrl is 0x2 when no alarm is set, 0x22 otherwise.
The only way to clear RTC_AIE is to set an alarm and wait for it to
expire while the system is awake.
My guess is that is_intr(mask) is false and you break out of the loop at
the first pass, meaning that the RTC_AIE bit is never cleared from
RTC_CONTROL. That would also mean that your RTC is not setting RTC_AF
after waking your PC. Am I right?
You are right, is_intr(mask) is false and now I see where the problem is.

I thought cmos_interrupt() was taking care of everything, but I've just
noticed that it's executed only when the system is awake. That's because
cmos->wake_on is not NULL, so enable_irq_wake() is not called.

However, not even rtc_handler() is called, so I guess the BIOS silently
wakes the system when an alarm expires while suspended. This means that
we can't update RTC_CONTROL from rtc_handler() and that we have to do it
from cmos_resume().

There's a problem with this. We don't know whether the system is waking up
because of an alarm or because the user resumed it. In both cases RTC_AIE
is set.

One way to solve this problem is to manually check from cmos_resume() if
any alarm expired while suspended. If we find such an alarm, we don't
break early out of the loop and let it clear the flags.

Is this reasonable?
Regards,
-- 
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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help