Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=9b5ef64a3a73757f1acdfb8565b5105115fc6e62
Commit:     9b5ef64a3a73757f1acdfb8565b5105115fc6e62
Parent:     09a21e56dc3767ce444e21c1383d587b261af13c
Author:     Yoichi Yuasa <[EMAIL PROTECTED]>
AuthorDate: Tue May 8 00:33:50 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Tue May 8 11:15:18 2007 -0700

    rtc: update vr41xx alarm handling
    
    - vr41xx_rtc_read_alarm() reports alarm enabled.
    - vr41xx_rtc_set_alarm() sets alarm disable/enable by rtc_wkalrm.enabled.
    
    Signed-off-by: Yoichi Yuasa <[EMAIL PROTECTED]>
    Acked-by: Alessandro Zummo <[EMAIL PROTECTED]>
    Acked-by: David Brownell <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 drivers/rtc/rtc-vr41xx.c |   28 ++++++++++++++++++++++++++--
 1 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c
index e9f9c54..af7596e 100644
--- a/drivers/rtc/rtc-vr41xx.c
+++ b/drivers/rtc/rtc-vr41xx.c
@@ -97,6 +97,7 @@ static DEFINE_SPINLOCK(rtc_lock);
 static char rtc_name[] = "RTC";
 static unsigned long periodic_frequency;
 static unsigned long periodic_count;
+static unsigned int alarm_enabled;
 
 struct resource rtc_resource[2] = {
        {       .name   = rtc_name,
@@ -188,6 +189,7 @@ static int vr41xx_rtc_read_alarm(struct device *dev, struct 
rtc_wkalrm *wkalrm)
        low = rtc1_read(ECMPLREG);
        mid = rtc1_read(ECMPMREG);
        high = rtc1_read(ECMPHREG);
+       wkalrm->enabled = alarm_enabled;
 
        spin_unlock_irq(&rtc_lock);
 
@@ -206,10 +208,18 @@ static int vr41xx_rtc_set_alarm(struct device *dev, 
struct rtc_wkalrm *wkalrm)
 
        spin_lock_irq(&rtc_lock);
 
+       if (alarm_enabled)
+               disable_irq(ELAPSEDTIME_IRQ);
+
        rtc1_write(ECMPLREG, (uint16_t)(alarm_sec << 15));
        rtc1_write(ECMPMREG, (uint16_t)(alarm_sec >> 1));
        rtc1_write(ECMPHREG, (uint16_t)(alarm_sec >> 17));
 
+       if (wkalrm->enabled)
+               enable_irq(ELAPSEDTIME_IRQ);
+
+       alarm_enabled = wkalrm->enabled;
+
        spin_unlock_irq(&rtc_lock);
 
        return 0;
@@ -221,10 +231,24 @@ static int vr41xx_rtc_ioctl(struct device *dev, unsigned 
int cmd, unsigned long
 
        switch (cmd) {
        case RTC_AIE_ON:
-               enable_irq(ELAPSEDTIME_IRQ);
+               spin_lock_irq(&rtc_lock);
+
+               if (!alarm_enabled) {
+                       enable_irq(ELAPSEDTIME_IRQ);
+                       alarm_enabled = 1;
+               }
+
+               spin_unlock_irq(&rtc_lock);
                break;
        case RTC_AIE_OFF:
-               disable_irq(ELAPSEDTIME_IRQ);
+               spin_lock_irq(&rtc_lock);
+
+               if (alarm_enabled) {
+                       disable_irq(ELAPSEDTIME_IRQ);
+                       alarm_enabled = 0;
+               }
+
+               spin_unlock_irq(&rtc_lock);
                break;
        case RTC_PIE_ON:
                enable_irq(RTCLONG1_IRQ);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to