diff options
author | Alessandro Zummo <a.zummo@towertech.it> | 2009-01-04 15:00:54 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-04 16:33:20 -0500 |
commit | 099e657625e801adf82054c8050dde5aceb68452 (patch) | |
tree | d6c28df68ab390fa237b8339c6081e4db380aa5f /drivers/rtc/interface.c | |
parent | 54566b2c1594c2326a645a3551f9d989f7ba3c5e (diff) |
rtc: add alarm/update irq interfaces
Add standard interfaces for alarm/update irqs enabling. Drivers are no
more required to implement equivalent ioctl code as rtc-dev will provide
it.
UIE emulation should now be handled correctly and will work even for those
RTC drivers who cannot be configured to do both UIE and AIE.
Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
Cc: David Brownell <david-b@pacbell.net>
Cc: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc/interface.c')
-rw-r--r-- | drivers/rtc/interface.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index a04c1b6b1575..fd2c652504ff 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
@@ -307,6 +307,60 @@ int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
307 | } | 307 | } |
308 | EXPORT_SYMBOL_GPL(rtc_set_alarm); | 308 | EXPORT_SYMBOL_GPL(rtc_set_alarm); |
309 | 309 | ||
310 | int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled) | ||
311 | { | ||
312 | int err = mutex_lock_interruptible(&rtc->ops_lock); | ||
313 | if (err) | ||
314 | return err; | ||
315 | |||
316 | if (!rtc->ops) | ||
317 | err = -ENODEV; | ||
318 | else if (!rtc->ops->alarm_irq_enable) | ||
319 | err = -EINVAL; | ||
320 | else | ||
321 | err = rtc->ops->alarm_irq_enable(rtc->dev.parent, enabled); | ||
322 | |||
323 | mutex_unlock(&rtc->ops_lock); | ||
324 | return err; | ||
325 | } | ||
326 | EXPORT_SYMBOL_GPL(rtc_alarm_irq_enable); | ||
327 | |||
328 | int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled) | ||
329 | { | ||
330 | int err = mutex_lock_interruptible(&rtc->ops_lock); | ||
331 | if (err) | ||
332 | return err; | ||
333 | |||
334 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL | ||
335 | if (enabled == 0 && rtc->uie_irq_active) { | ||
336 | mutex_unlock(&rtc->ops_lock); | ||
337 | return rtc_dev_update_irq_enable_emul(rtc, enabled); | ||
338 | } | ||
339 | #endif | ||
340 | |||
341 | if (!rtc->ops) | ||
342 | err = -ENODEV; | ||
343 | else if (!rtc->ops->update_irq_enable) | ||
344 | err = -EINVAL; | ||
345 | else | ||
346 | err = rtc->ops->update_irq_enable(rtc->dev.parent, enabled); | ||
347 | |||
348 | mutex_unlock(&rtc->ops_lock); | ||
349 | |||
350 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL | ||
351 | /* | ||
352 | * Enable emulation if the driver did not provide | ||
353 | * the update_irq_enable function pointer or if returned | ||
354 | * -EINVAL to signal that it has been configured without | ||
355 | * interrupts or that are not available at the moment. | ||
356 | */ | ||
357 | if (err == -EINVAL) | ||
358 | err = rtc_dev_update_irq_enable_emul(rtc, enabled); | ||
359 | #endif | ||
360 | return err; | ||
361 | } | ||
362 | EXPORT_SYMBOL_GPL(rtc_update_irq_enable); | ||
363 | |||
310 | /** | 364 | /** |
311 | * rtc_update_irq - report RTC periodic, alarm, and/or update irqs | 365 | * rtc_update_irq - report RTC periodic, alarm, and/or update irqs |
312 | * @rtc: the rtc device | 366 | * @rtc: the rtc device |