diff options
| -rw-r--r-- | drivers/rtc/interface.c | 18 | ||||
| -rw-r--r-- | drivers/rtc/rtc-dev.c | 2 | ||||
| -rw-r--r-- | include/linux/rtc.h | 1 |
3 files changed, 19 insertions, 2 deletions
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 413ae053791..cb2f0728fd7 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
| @@ -228,6 +228,12 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled) | |||
| 228 | if (err) | 228 | if (err) |
| 229 | return err; | 229 | return err; |
| 230 | 230 | ||
| 231 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL | ||
| 232 | if (enabled == 0 && rtc->uie_irq_active) { | ||
| 233 | mutex_unlock(&rtc->ops_lock); | ||
| 234 | return rtc_dev_update_irq_enable_emul(rtc, 0); | ||
| 235 | } | ||
| 236 | #endif | ||
| 231 | /* make sure we're changing state */ | 237 | /* make sure we're changing state */ |
| 232 | if (rtc->uie_rtctimer.enabled == enabled) | 238 | if (rtc->uie_rtctimer.enabled == enabled) |
| 233 | goto out; | 239 | goto out; |
| @@ -247,6 +253,16 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled) | |||
| 247 | 253 | ||
| 248 | out: | 254 | out: |
| 249 | mutex_unlock(&rtc->ops_lock); | 255 | mutex_unlock(&rtc->ops_lock); |
| 256 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL | ||
| 257 | /* | ||
| 258 | * Enable emulation if the driver did not provide | ||
| 259 | * the update_irq_enable function pointer or if returned | ||
| 260 | * -EINVAL to signal that it has been configured without | ||
| 261 | * interrupts or that are not available at the moment. | ||
| 262 | */ | ||
| 263 | if (err == -EINVAL) | ||
| 264 | err = rtc_dev_update_irq_enable_emul(rtc, enabled); | ||
| 265 | #endif | ||
| 250 | return err; | 266 | return err; |
| 251 | 267 | ||
| 252 | } | 268 | } |
| @@ -262,7 +278,7 @@ EXPORT_SYMBOL_GPL(rtc_update_irq_enable); | |||
| 262 | * | 278 | * |
| 263 | * Triggers the registered irq_task function callback. | 279 | * Triggers the registered irq_task function callback. |
| 264 | */ | 280 | */ |
| 265 | static void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode) | 281 | void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode) |
| 266 | { | 282 | { |
| 267 | unsigned long flags; | 283 | unsigned long flags; |
| 268 | 284 | ||
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c index dfa72c9c268..d0e06edb14c 100644 --- a/drivers/rtc/rtc-dev.c +++ b/drivers/rtc/rtc-dev.c | |||
| @@ -76,7 +76,7 @@ static void rtc_uie_task(struct work_struct *work) | |||
| 76 | } | 76 | } |
| 77 | spin_unlock_irq(&rtc->irq_lock); | 77 | spin_unlock_irq(&rtc->irq_lock); |
| 78 | if (num) | 78 | if (num) |
| 79 | rtc_update_irq(rtc, num, RTC_UF | RTC_IRQF); | 79 | rtc_handle_legacy_irq(rtc, num, RTC_UF); |
| 80 | } | 80 | } |
| 81 | static void rtc_uie_timer(unsigned long data) | 81 | static void rtc_uie_timer(unsigned long data) |
| 82 | { | 82 | { |
diff --git a/include/linux/rtc.h b/include/linux/rtc.h index 80408e711be..89c3e518299 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h | |||
| @@ -250,6 +250,7 @@ extern int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled); | |||
| 250 | extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, | 250 | extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, |
| 251 | unsigned int enabled); | 251 | unsigned int enabled); |
| 252 | 252 | ||
| 253 | void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode); | ||
| 253 | void rtc_aie_update_irq(void *private); | 254 | void rtc_aie_update_irq(void *private); |
| 254 | void rtc_uie_update_irq(void *private); | 255 | void rtc_uie_update_irq(void *private); |
| 255 | enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer); | 256 | enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer); |
