diff options
| author | Rafael J. Wysocki <rjw@sisk.pl> | 2011-12-21 03:51:23 -0500 |
|---|---|---|
| committer | Rafael J. Wysocki <rjw@sisk.pl> | 2011-12-21 03:51:23 -0500 |
| commit | dfa9d178cd28caf5d76bc4f37f4b3e7e8df8e697 (patch) | |
| tree | d97ca7790d8a622cba9fdd19832decdb0aa6418a /drivers/rtc/interface.c | |
| parent | 3f19f08a7ec74cfc50fbad3c5e615760afbd23a0 (diff) | |
| parent | 7b4050381127ae11fcfc74a106d715a5fbbf888a (diff) | |
Merge branch 'devfreq-for-next' of git://git.infradead.org/users/kmpark/linux-samsung into pm-devfreq
* 'devfreq-for-next' of git://git.infradead.org/users/kmpark/linux-samsung: (765 commits)
PM/Devfreq: Add Exynos4-bus device DVFS driver for Exynos4210/4212/4412.
pci: Fix hotplug of Express Module with pci bridges
i2c-eg20t: correct the driver init order of pch_i2c_probe()
I2C: OMAP: fix FIFO usage for OMAP4
i2c-s3c2410: Fix return code of s3c24xx_i2c_parse_dt_gpio
i2c: i2c-s3c2410: Add a cpu_relax() to busy wait for bus idle
Linux 3.2-rc6
Revert "drm/i915: fix infinite recursion on unbind due to ilk vt-d w/a"
btrfs: lower the dirty balance poll interval
drm/i915/dp: Dither down to 6bpc if it makes the mode fit
drm/i915: enable semaphores on per-device defaults
drm/i915: don't set unpin_work if vblank_get fails
drm/i915: By default, enable RC6 on IVB and SNB when reasonable
iommu: Export intel_iommu_enabled to signal when iommu is in use
drm/i915/sdvo: Include LVDS panels for the IS_DIGITAL check
drm/i915: prevent division by zero when asking for chipset power
drm/i915: add PCH info to i915_capabilities
drm/i915: set the right SDVO transcoder for CPT
drm/i915: no-lvds quirk for ASUS AT5NM10T-I
sched: Fix select_idle_sibling() regression in selecting an idle SMT sibling
...
Diffstat (limited to 'drivers/rtc/interface.c')
| -rw-r--r-- | drivers/rtc/interface.c | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 8e286259a007..fa4d9f324189 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
| @@ -319,6 +319,20 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
| 319 | } | 319 | } |
| 320 | EXPORT_SYMBOL_GPL(rtc_read_alarm); | 320 | EXPORT_SYMBOL_GPL(rtc_read_alarm); |
| 321 | 321 | ||
| 322 | static int ___rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | ||
| 323 | { | ||
| 324 | int err; | ||
| 325 | |||
| 326 | if (!rtc->ops) | ||
| 327 | err = -ENODEV; | ||
| 328 | else if (!rtc->ops->set_alarm) | ||
| 329 | err = -EINVAL; | ||
| 330 | else | ||
| 331 | err = rtc->ops->set_alarm(rtc->dev.parent, alarm); | ||
| 332 | |||
| 333 | return err; | ||
| 334 | } | ||
| 335 | |||
| 322 | static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | 336 | static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) |
| 323 | { | 337 | { |
| 324 | struct rtc_time tm; | 338 | struct rtc_time tm; |
| @@ -342,14 +356,7 @@ static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
| 342 | * over right here, before we set the alarm. | 356 | * over right here, before we set the alarm. |
| 343 | */ | 357 | */ |
| 344 | 358 | ||
| 345 | if (!rtc->ops) | 359 | return ___rtc_set_alarm(rtc, alarm); |
| 346 | err = -ENODEV; | ||
| 347 | else if (!rtc->ops->set_alarm) | ||
| 348 | err = -EINVAL; | ||
| 349 | else | ||
| 350 | err = rtc->ops->set_alarm(rtc->dev.parent, alarm); | ||
| 351 | |||
| 352 | return err; | ||
| 353 | } | 360 | } |
| 354 | 361 | ||
| 355 | int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | 362 | int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) |
| @@ -763,6 +770,20 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer) | |||
| 763 | return 0; | 770 | return 0; |
| 764 | } | 771 | } |
| 765 | 772 | ||
| 773 | static void rtc_alarm_disable(struct rtc_device *rtc) | ||
| 774 | { | ||
| 775 | struct rtc_wkalrm alarm; | ||
| 776 | struct rtc_time tm; | ||
| 777 | |||
| 778 | __rtc_read_time(rtc, &tm); | ||
| 779 | |||
| 780 | alarm.time = rtc_ktime_to_tm(ktime_add(rtc_tm_to_ktime(tm), | ||
| 781 | ktime_set(300, 0))); | ||
| 782 | alarm.enabled = 0; | ||
| 783 | |||
| 784 | ___rtc_set_alarm(rtc, &alarm); | ||
| 785 | } | ||
| 786 | |||
| 766 | /** | 787 | /** |
| 767 | * rtc_timer_remove - Removes a rtc_timer from the rtc_device timerqueue | 788 | * rtc_timer_remove - Removes a rtc_timer from the rtc_device timerqueue |
| 768 | * @rtc rtc device | 789 | * @rtc rtc device |
| @@ -784,8 +805,10 @@ static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer) | |||
| 784 | struct rtc_wkalrm alarm; | 805 | struct rtc_wkalrm alarm; |
| 785 | int err; | 806 | int err; |
| 786 | next = timerqueue_getnext(&rtc->timerqueue); | 807 | next = timerqueue_getnext(&rtc->timerqueue); |
| 787 | if (!next) | 808 | if (!next) { |
| 809 | rtc_alarm_disable(rtc); | ||
| 788 | return; | 810 | return; |
| 811 | } | ||
| 789 | alarm.time = rtc_ktime_to_tm(next->expires); | 812 | alarm.time = rtc_ktime_to_tm(next->expires); |
| 790 | alarm.enabled = 1; | 813 | alarm.enabled = 1; |
| 791 | err = __rtc_set_alarm(rtc, &alarm); | 814 | err = __rtc_set_alarm(rtc, &alarm); |
| @@ -847,7 +870,8 @@ again: | |||
| 847 | err = __rtc_set_alarm(rtc, &alarm); | 870 | err = __rtc_set_alarm(rtc, &alarm); |
| 848 | if (err == -ETIME) | 871 | if (err == -ETIME) |
| 849 | goto again; | 872 | goto again; |
| 850 | } | 873 | } else |
| 874 | rtc_alarm_disable(rtc); | ||
| 851 | 875 | ||
| 852 | mutex_unlock(&rtc->ops_lock); | 876 | mutex_unlock(&rtc->ops_lock); |
| 853 | } | 877 | } |
