diff options
author | Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 2007-05-08 09:33:50 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 20:15:18 +0200 |
commit | 9b5ef64a3a73757f1acdfb8565b5105115fc6e62 (patch) | |
tree | 9ab0d3b5e2d60160f85a24873e8b428dc5be2941 /drivers/rtc | |
parent | RTC Kconfig cleanup (diff) | |
download | linux-9b5ef64a3a73757f1acdfb8565b5105115fc6e62.tar.xz linux-9b5ef64a3a73757f1acdfb8565b5105115fc6e62.zip |
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 <yoichi_yuasa@tripeaks.co.jp>
Acked-by: Alessandro Zummo <a.zummo@towertech.it>
Acked-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc')
-rw-r--r-- | 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 e9f9c5489468..af7596ef29e2 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); |