Merge tag 'v3.10.107' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / rtc / interface.c
index 09198941ee2249611f293474d8d9b313cb8f7e47..8cfd20f79da86442baafb94ab16bf4e574d2b8ef 100644 (file)
@@ -303,6 +303,9 @@ done:
 
 int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
 {
+#ifdef RTC_LEGACY_ALARM_IMPL
+       return __rtc_read_alarm(rtc, alarm);
+#else  
        int err;
 
        err = mutex_lock_interruptible(&rtc->ops_lock);
@@ -320,11 +323,16 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
        mutex_unlock(&rtc->ops_lock);
 
        return err;
+#endif
 }
 EXPORT_SYMBOL_GPL(rtc_read_alarm);
 
 static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
 {
+#ifdef RTC_LEGACY_ALARM_IMPL
+       WARN(1, "__rtc_set_alarm() is not supported!!\n");
+       return -EPERM;
+#else  
        struct rtc_time tm;
        long now, scheduled;
        int err;
@@ -354,6 +362,7 @@ static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
                err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
 
        return err;
+#endif
 }
 
 int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
@@ -367,6 +376,15 @@ int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
        err = mutex_lock_interruptible(&rtc->ops_lock);
        if (err)
                return err;
+#ifdef RTC_LEGACY_ALARM_IMPL
+       if (!rtc->ops)
+               err = -ENODEV;
+       else if (!rtc->ops->set_alarm)
+               err = -EINVAL;
+       else
+               err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
+#else
+
        if (rtc->aie_timer.enabled) {
                rtc_timer_remove(rtc, &rtc->aie_timer);
        }
@@ -375,14 +393,42 @@ int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
        if (alarm->enabled) {
                err = rtc_timer_enqueue(rtc, &rtc->aie_timer);
        }
+#endif
        mutex_unlock(&rtc->ops_lock);
        return err;
 }
 EXPORT_SYMBOL_GPL(rtc_set_alarm);
 
+int rtc_set_alarm_poweron(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
+{
+       int err;
+
+       err = rtc_valid_tm(&alarm->time);
+       if (err != 0)
+               return err;
+
+       err = mutex_lock_interruptible(&rtc->ops_lock);
+       if (err)
+               return err;
+               
+       if (!rtc->ops)
+               err = -ENODEV;
+       else if (!rtc->ops->set_alarm)
+               err = -EINVAL;
+       else
+               err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
+       
+       mutex_unlock(&rtc->ops_lock);
+       return err;     
+}
+EXPORT_SYMBOL_GPL(rtc_set_alarm_poweron);
+
 /* Called once per device from rtc_device_register */
 int rtc_initialize_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
 {
+#ifdef RTC_LEGACY_ALARM_IMPL
+                       return 0;
+#else
        int err;
        struct rtc_time now;
 
@@ -410,6 +456,7 @@ int rtc_initialize_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
        }
        mutex_unlock(&rtc->ops_lock);
        return err;
+#endif
 }
 EXPORT_SYMBOL_GPL(rtc_initialize_alarm);