1
2
3
4
5
6
7
8
9
10
11
12
13
14#include <linux/rtc.h>
15#include <linux/sched.h>
16#include <linux/module.h>
17#include <linux/log2.h>
18#include <linux/workqueue.h>
19
20static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer);
21static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer);
22
23static int __rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
24{
25 int err;
26 if (!rtc->ops)
27 err = -ENODEV;
28 else if (!rtc->ops->read_time)
29 err = -EINVAL;
30 else {
31 memset(tm, 0, sizeof(struct rtc_time));
32 err = rtc->ops->read_time(rtc->dev.parent, tm);
33 }
34 return err;
35}
36
37int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
38{
39 int err;
40
41 err = mutex_lock_interruptible(&rtc->ops_lock);
42 if (err)
43 return err;
44
45 err = __rtc_read_time(rtc, tm);
46 mutex_unlock(&rtc->ops_lock);
47 return err;
48}
49EXPORT_SYMBOL_GPL(rtc_read_time);
50
51int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
52{
53 int err;
54
55 err = rtc_valid_tm(tm);
56 if (err != 0)
57 return err;
58
59 err = mutex_lock_interruptible(&rtc->ops_lock);
60 if (err)
61 return err;
62
63 if (!rtc->ops)
64 err = -ENODEV;
65 else if (rtc->ops->set_time)
66 err = rtc->ops->set_time(rtc->dev.parent, tm);
67 else if (rtc->ops->set_mmss) {
68 unsigned long secs;
69 err = rtc_tm_to_time(tm, &secs);
70 if (err == 0)
71 err = rtc->ops->set_mmss(rtc->dev.parent, secs);
72 } else
73 err = -EINVAL;
74
75 pm_stay_awake(rtc->dev.parent);
76 mutex_unlock(&rtc->ops_lock);
77
78 schedule_work(&rtc->irqwork);
79 return err;
80}
81EXPORT_SYMBOL_GPL(rtc_set_time);
82
83int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs)
84{
85 int err;
86
87 err = mutex_lock_interruptible(&rtc->ops_lock);
88 if (err)
89 return err;
90
91 if (!rtc->ops)
92 err = -ENODEV;
93 else if (rtc->ops->set_mmss)
94 err = rtc->ops->set_mmss(rtc->dev.parent, secs);
95 else if (rtc->ops->read_time && rtc->ops->set_time) {
96 struct rtc_time new, old;
97
98 err = rtc->ops->read_time(rtc->dev.parent, &old);
99 if (err == 0) {
100 rtc_time_to_tm(secs, &new);
101
102
103
104
105
106
107
108 if (!((old.tm_hour == 23 && old.tm_min == 59) ||
109 (new.tm_hour == 23 && new.tm_min == 59)))
110 err = rtc->ops->set_time(rtc->dev.parent,
111 &new);
112 }
113 } else {
114 err = -EINVAL;
115 }
116
117 pm_stay_awake(rtc->dev.parent);
118 mutex_unlock(&rtc->ops_lock);
119
120 schedule_work(&rtc->irqwork);
121
122 return err;
123}
124EXPORT_SYMBOL_GPL(rtc_set_mmss);
125
126static int rtc_read_alarm_internal(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
127{
128 int err;
129
130 err = mutex_lock_interruptible(&rtc->ops_lock);
131 if (err)
132 return err;
133
134 if (rtc->ops == NULL)
135 err = -ENODEV;
136 else if (!rtc->ops->read_alarm)
137 err = -EINVAL;
138 else {
139 memset(alarm, 0, sizeof(struct rtc_wkalrm));
140 err = rtc->ops->read_alarm(rtc->dev.parent, alarm);
141 }
142
143 mutex_unlock(&rtc->ops_lock);
144 return err;
145}
146
147int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
148{
149 int err;
150 struct rtc_time before, now;
151 int first_time = 1;
152 unsigned long t_now, t_alm;
153 enum { none, day, month, year } missing = none;
154 unsigned days;
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198 err = rtc_read_time(rtc, &before);
199 if (err < 0)
200 return err;
201 do {
202 if (!first_time)
203 memcpy(&before, &now, sizeof(struct rtc_time));
204 first_time = 0;
205
206
207 err = rtc_read_alarm_internal(rtc, alarm);
208 if (err)
209 return err;
210
211
212 if (rtc_valid_tm(&alarm->time) == 0)
213 return 0;
214
215
216 err = rtc_read_time(rtc, &now);
217 if (err < 0)
218 return err;
219
220
221 } while ( before.tm_min != now.tm_min
222 || before.tm_hour != now.tm_hour
223 || before.tm_mon != now.tm_mon
224 || before.tm_year != now.tm_year);
225
226
227
228
229 if (alarm->time.tm_sec == -1)
230 alarm->time.tm_sec = now.tm_sec;
231 if (alarm->time.tm_min == -1)
232 alarm->time.tm_min = now.tm_min;
233 if (alarm->time.tm_hour == -1)
234 alarm->time.tm_hour = now.tm_hour;
235
236
237 if (alarm->time.tm_mday < 1 || alarm->time.tm_mday > 31) {
238 alarm->time.tm_mday = now.tm_mday;
239 missing = day;
240 }
241 if ((unsigned)alarm->time.tm_mon >= 12) {
242 alarm->time.tm_mon = now.tm_mon;
243 if (missing == none)
244 missing = month;
245 }
246 if (alarm->time.tm_year == -1) {
247 alarm->time.tm_year = now.tm_year;
248 if (missing == none)
249 missing = year;
250 }
251
252
253 rtc_tm_to_time(&now, &t_now);
254 rtc_tm_to_time(&alarm->time, &t_alm);
255 if (t_now < t_alm)
256 goto done;
257
258 switch (missing) {
259
260
261
262
263
264
265 case day:
266 dev_dbg(&rtc->dev, "alarm rollover: %s\n", "day");
267 t_alm += 24 * 60 * 60;
268 rtc_time_to_tm(t_alm, &alarm->time);
269 break;
270
271
272
273
274
275
276 case month:
277 dev_dbg(&rtc->dev, "alarm rollover: %s\n", "month");
278 do {
279 if (alarm->time.tm_mon < 11)
280 alarm->time.tm_mon++;
281 else {
282 alarm->time.tm_mon = 0;
283 alarm->time.tm_year++;
284 }
285 days = rtc_month_days(alarm->time.tm_mon,
286 alarm->time.tm_year);
287 } while (days < alarm->time.tm_mday);
288 break;
289
290
291 case year:
292 dev_dbg(&rtc->dev, "alarm rollover: %s\n", "year");
293 do {
294 alarm->time.tm_year++;
295 } while (!is_leap_year(alarm->time.tm_year + 1900)
296 && rtc_valid_tm(&alarm->time) != 0);
297 break;
298
299 default:
300 dev_warn(&rtc->dev, "alarm rollover not handled\n");
301 }
302
303done:
304 err = rtc_valid_tm(&alarm->time);
305
306 if (err) {
307 dev_warn(&rtc->dev, "invalid alarm value: %d-%d-%d %d:%d:%d\n",
308 alarm->time.tm_year + 1900, alarm->time.tm_mon + 1,
309 alarm->time.tm_mday, alarm->time.tm_hour, alarm->time.tm_min,
310 alarm->time.tm_sec);
311 }
312
313 return err;
314}
315
316int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
317{
318 int err;
319
320 err = mutex_lock_interruptible(&rtc->ops_lock);
321 if (err)
322 return err;
323 if (rtc->ops == NULL)
324 err = -ENODEV;
325 else if (!rtc->ops->read_alarm)
326 err = -EINVAL;
327 else {
328 memset(alarm, 0, sizeof(struct rtc_wkalrm));
329 alarm->enabled = rtc->aie_timer.enabled;
330 alarm->time = rtc_ktime_to_tm(rtc->aie_timer.node.expires);
331 }
332 mutex_unlock(&rtc->ops_lock);
333
334 return err;
335}
336EXPORT_SYMBOL_GPL(rtc_read_alarm);
337
338static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
339{
340 struct rtc_time tm;
341 long now, scheduled;
342 int err;
343
344 err = rtc_valid_tm(&alarm->time);
345 if (err)
346 return err;
347 rtc_tm_to_time(&alarm->time, &scheduled);
348
349
350 err = __rtc_read_time(rtc, &tm);
351 rtc_tm_to_time(&tm, &now);
352 if (scheduled <= now)
353 return -ETIME;
354
355
356
357
358
359
360
361 if (!rtc->ops)
362 err = -ENODEV;
363 else if (!rtc->ops->set_alarm)
364 err = -EINVAL;
365 else
366 err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
367
368 return err;
369}
370
371int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
372{
373 int err;
374
375 err = rtc_valid_tm(&alarm->time);
376 if (err != 0)
377 return err;
378
379 err = mutex_lock_interruptible(&rtc->ops_lock);
380 if (err)
381 return err;
382 if (rtc->aie_timer.enabled)
383 rtc_timer_remove(rtc, &rtc->aie_timer);
384
385 rtc->aie_timer.node.expires = rtc_tm_to_ktime(alarm->time);
386 rtc->aie_timer.period = ktime_set(0, 0);
387 if (alarm->enabled)
388 err = rtc_timer_enqueue(rtc, &rtc->aie_timer);
389
390 mutex_unlock(&rtc->ops_lock);
391 return err;
392}
393EXPORT_SYMBOL_GPL(rtc_set_alarm);
394
395
396int rtc_initialize_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
397{
398 int err;
399 struct rtc_time now;
400
401 err = rtc_valid_tm(&alarm->time);
402 if (err != 0)
403 return err;
404
405 err = rtc_read_time(rtc, &now);
406 if (err)
407 return err;
408
409 err = mutex_lock_interruptible(&rtc->ops_lock);
410 if (err)
411 return err;
412
413 rtc->aie_timer.node.expires = rtc_tm_to_ktime(alarm->time);
414 rtc->aie_timer.period = ktime_set(0, 0);
415
416
417 if (alarm->enabled && (rtc_tm_to_ktime(now).tv64 <
418 rtc->aie_timer.node.expires.tv64)) {
419
420 rtc->aie_timer.enabled = 1;
421 timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node);
422 }
423 mutex_unlock(&rtc->ops_lock);
424 return err;
425}
426EXPORT_SYMBOL_GPL(rtc_initialize_alarm);
427
428
429
430int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled)
431{
432 int err = mutex_lock_interruptible(&rtc->ops_lock);
433 if (err)
434 return err;
435
436 if (rtc->aie_timer.enabled != enabled) {
437 if (enabled)
438 err = rtc_timer_enqueue(rtc, &rtc->aie_timer);
439 else
440 rtc_timer_remove(rtc, &rtc->aie_timer);
441 }
442
443 if (err)
444 ;
445 else if (!rtc->ops)
446 err = -ENODEV;
447 else if (!rtc->ops->alarm_irq_enable)
448 err = -EINVAL;
449 else
450 err = rtc->ops->alarm_irq_enable(rtc->dev.parent, enabled);
451
452 mutex_unlock(&rtc->ops_lock);
453 return err;
454}
455EXPORT_SYMBOL_GPL(rtc_alarm_irq_enable);
456
457int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
458{
459 int err = mutex_lock_interruptible(&rtc->ops_lock);
460 if (err)
461 return err;
462
463#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
464 if (enabled == 0 && rtc->uie_irq_active) {
465 mutex_unlock(&rtc->ops_lock);
466 return rtc_dev_update_irq_enable_emul(rtc, 0);
467 }
468#endif
469
470 if (rtc->uie_rtctimer.enabled == enabled)
471 goto out;
472
473 if (rtc->uie_unsupported) {
474 err = -EINVAL;
475 goto out;
476 }
477
478 if (enabled) {
479 struct rtc_time tm;
480 ktime_t now, onesec;
481
482 __rtc_read_time(rtc, &tm);
483 onesec = ktime_set(1, 0);
484 now = rtc_tm_to_ktime(tm);
485 rtc->uie_rtctimer.node.expires = ktime_add(now, onesec);
486 rtc->uie_rtctimer.period = ktime_set(1, 0);
487 err = rtc_timer_enqueue(rtc, &rtc->uie_rtctimer);
488 } else
489 rtc_timer_remove(rtc, &rtc->uie_rtctimer);
490
491out:
492 mutex_unlock(&rtc->ops_lock);
493#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
494
495
496
497
498
499
500 if (err == -EINVAL)
501 err = rtc_dev_update_irq_enable_emul(rtc, enabled);
502#endif
503 return err;
504
505}
506EXPORT_SYMBOL_GPL(rtc_update_irq_enable);
507
508
509
510
511
512
513
514
515
516
517
518void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode)
519{
520 unsigned long flags;
521
522
523 spin_lock_irqsave(&rtc->irq_lock, flags);
524 rtc->irq_data = (rtc->irq_data + (num << 8)) | (RTC_IRQF|mode);
525 spin_unlock_irqrestore(&rtc->irq_lock, flags);
526
527
528 spin_lock_irqsave(&rtc->irq_task_lock, flags);
529 if (rtc->irq_task)
530 rtc->irq_task->func(rtc->irq_task->private_data);
531 spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
532
533 wake_up_interruptible(&rtc->irq_queue);
534 kill_fasync(&rtc->async_queue, SIGIO, POLL_IN);
535}
536
537
538
539
540
541
542
543
544void rtc_aie_update_irq(void *private)
545{
546 struct rtc_device *rtc = (struct rtc_device *)private;
547 rtc_handle_legacy_irq(rtc, 1, RTC_AF);
548}
549
550
551
552
553
554
555
556
557void rtc_uie_update_irq(void *private)
558{
559 struct rtc_device *rtc = (struct rtc_device *)private;
560 rtc_handle_legacy_irq(rtc, 1, RTC_UF);
561}
562
563
564
565
566
567
568
569
570
571
572enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer)
573{
574 struct rtc_device *rtc;
575 ktime_t period;
576 int count;
577 rtc = container_of(timer, struct rtc_device, pie_timer);
578
579 period = ktime_set(0, NSEC_PER_SEC/rtc->irq_freq);
580 count = hrtimer_forward_now(timer, period);
581
582 rtc_handle_legacy_irq(rtc, count, RTC_PF);
583
584 return HRTIMER_RESTART;
585}
586
587
588
589
590
591
592
593
594void rtc_update_irq(struct rtc_device *rtc,
595 unsigned long num, unsigned long events)
596{
597 if (unlikely(IS_ERR_OR_NULL(rtc)))
598 return;
599
600 pm_stay_awake(rtc->dev.parent);
601 schedule_work(&rtc->irqwork);
602}
603EXPORT_SYMBOL_GPL(rtc_update_irq);
604
605static int __rtc_match(struct device *dev, const void *data)
606{
607 const char *name = data;
608
609 if (strcmp(dev_name(dev), name) == 0)
610 return 1;
611 return 0;
612}
613
614struct rtc_device *rtc_class_open(const char *name)
615{
616 struct device *dev;
617 struct rtc_device *rtc = NULL;
618
619 dev = class_find_device(rtc_class, NULL, name, __rtc_match);
620 if (dev)
621 rtc = to_rtc_device(dev);
622
623 if (rtc) {
624 if (!try_module_get(rtc->owner)) {
625 put_device(dev);
626 rtc = NULL;
627 }
628 }
629
630 return rtc;
631}
632EXPORT_SYMBOL_GPL(rtc_class_open);
633
634void rtc_class_close(struct rtc_device *rtc)
635{
636 module_put(rtc->owner);
637 put_device(&rtc->dev);
638}
639EXPORT_SYMBOL_GPL(rtc_class_close);
640
641int rtc_irq_register(struct rtc_device *rtc, struct rtc_task *task)
642{
643 int retval = -EBUSY;
644
645 if (task == NULL || task->func == NULL)
646 return -EINVAL;
647
648
649 if (test_and_set_bit_lock(RTC_DEV_BUSY, &rtc->flags))
650 return -EBUSY;
651
652 spin_lock_irq(&rtc->irq_task_lock);
653 if (rtc->irq_task == NULL) {
654 rtc->irq_task = task;
655 retval = 0;
656 }
657 spin_unlock_irq(&rtc->irq_task_lock);
658
659 clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags);
660
661 return retval;
662}
663EXPORT_SYMBOL_GPL(rtc_irq_register);
664
665void rtc_irq_unregister(struct rtc_device *rtc, struct rtc_task *task)
666{
667 spin_lock_irq(&rtc->irq_task_lock);
668 if (rtc->irq_task == task)
669 rtc->irq_task = NULL;
670 spin_unlock_irq(&rtc->irq_task_lock);
671}
672EXPORT_SYMBOL_GPL(rtc_irq_unregister);
673
674static int rtc_update_hrtimer(struct rtc_device *rtc, int enabled)
675{
676
677
678
679
680
681
682
683
684
685
686 if (hrtimer_try_to_cancel(&rtc->pie_timer) < 0)
687 return -1;
688
689 if (enabled) {
690 ktime_t period = ktime_set(0, NSEC_PER_SEC / rtc->irq_freq);
691
692 hrtimer_start(&rtc->pie_timer, period, HRTIMER_MODE_REL);
693 }
694 return 0;
695}
696
697
698
699
700
701
702
703
704
705
706
707int rtc_irq_set_state(struct rtc_device *rtc, struct rtc_task *task, int enabled)
708{
709 int err = 0;
710 unsigned long flags;
711
712retry:
713 spin_lock_irqsave(&rtc->irq_task_lock, flags);
714 if (rtc->irq_task != NULL && task == NULL)
715 err = -EBUSY;
716 else if (rtc->irq_task != task)
717 err = -EACCES;
718 else {
719 if (rtc_update_hrtimer(rtc, enabled) < 0) {
720 spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
721 cpu_relax();
722 goto retry;
723 }
724 rtc->pie_enabled = enabled;
725 }
726 spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
727 return err;
728}
729EXPORT_SYMBOL_GPL(rtc_irq_set_state);
730
731
732
733
734
735
736
737
738
739
740
741int rtc_irq_set_freq(struct rtc_device *rtc, struct rtc_task *task, int freq)
742{
743 int err = 0;
744 unsigned long flags;
745
746 if (freq <= 0 || freq > RTC_MAX_FREQ)
747 return -EINVAL;
748retry:
749 spin_lock_irqsave(&rtc->irq_task_lock, flags);
750 if (rtc->irq_task != NULL && task == NULL)
751 err = -EBUSY;
752 else if (rtc->irq_task != task)
753 err = -EACCES;
754 else {
755 rtc->irq_freq = freq;
756 if (rtc->pie_enabled && rtc_update_hrtimer(rtc, 1) < 0) {
757 spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
758 cpu_relax();
759 goto retry;
760 }
761 }
762 spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
763 return err;
764}
765EXPORT_SYMBOL_GPL(rtc_irq_set_freq);
766
767
768
769
770
771
772
773
774
775
776
777
778
779static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
780{
781 timer->enabled = 1;
782 timerqueue_add(&rtc->timerqueue, &timer->node);
783 if (&timer->node == timerqueue_getnext(&rtc->timerqueue)) {
784 struct rtc_wkalrm alarm;
785 int err;
786 alarm.time = rtc_ktime_to_tm(timer->node.expires);
787 alarm.enabled = 1;
788 err = __rtc_set_alarm(rtc, &alarm);
789 if (err == -ETIME) {
790 pm_stay_awake(rtc->dev.parent);
791 schedule_work(&rtc->irqwork);
792 } else if (err) {
793 timerqueue_del(&rtc->timerqueue, &timer->node);
794 timer->enabled = 0;
795 return err;
796 }
797 }
798 return 0;
799}
800
801static void rtc_alarm_disable(struct rtc_device *rtc)
802{
803 if (!rtc->ops || !rtc->ops->alarm_irq_enable)
804 return;
805
806 rtc->ops->alarm_irq_enable(rtc->dev.parent, false);
807}
808
809
810
811
812
813
814
815
816
817
818
819
820
821static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer)
822{
823 struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
824 timerqueue_del(&rtc->timerqueue, &timer->node);
825 timer->enabled = 0;
826 if (next == &timer->node) {
827 struct rtc_wkalrm alarm;
828 int err;
829 next = timerqueue_getnext(&rtc->timerqueue);
830 if (!next) {
831 rtc_alarm_disable(rtc);
832 return;
833 }
834 alarm.time = rtc_ktime_to_tm(next->expires);
835 alarm.enabled = 1;
836 err = __rtc_set_alarm(rtc, &alarm);
837 if (err == -ETIME) {
838 pm_stay_awake(rtc->dev.parent);
839 schedule_work(&rtc->irqwork);
840 }
841 }
842}
843
844
845
846
847
848
849
850
851
852
853
854void rtc_timer_do_work(struct work_struct *work)
855{
856 struct rtc_timer *timer;
857 struct timerqueue_node *next;
858 ktime_t now;
859 struct rtc_time tm;
860
861 struct rtc_device *rtc =
862 container_of(work, struct rtc_device, irqwork);
863
864 mutex_lock(&rtc->ops_lock);
865again:
866 __rtc_read_time(rtc, &tm);
867 now = rtc_tm_to_ktime(tm);
868 while ((next = timerqueue_getnext(&rtc->timerqueue))) {
869 if (next->expires.tv64 > now.tv64)
870 break;
871
872
873 timer = container_of(next, struct rtc_timer, node);
874 timerqueue_del(&rtc->timerqueue, &timer->node);
875 timer->enabled = 0;
876 if (timer->task.func)
877 timer->task.func(timer->task.private_data);
878
879
880 if (ktime_to_ns(timer->period)) {
881 timer->node.expires = ktime_add(timer->node.expires,
882 timer->period);
883 timer->enabled = 1;
884 timerqueue_add(&rtc->timerqueue, &timer->node);
885 }
886 }
887
888
889 if (next) {
890 struct rtc_wkalrm alarm;
891 int err;
892 alarm.time = rtc_ktime_to_tm(next->expires);
893 alarm.enabled = 1;
894 err = __rtc_set_alarm(rtc, &alarm);
895 if (err == -ETIME)
896 goto again;
897 } else
898 rtc_alarm_disable(rtc);
899
900 pm_relax(rtc->dev.parent);
901 mutex_unlock(&rtc->ops_lock);
902}
903
904
905
906
907
908
909
910
911
912void rtc_timer_init(struct rtc_timer *timer, void (*f)(void *p), void *data)
913{
914 timerqueue_init(&timer->node);
915 timer->enabled = 0;
916 timer->task.func = f;
917 timer->task.private_data = data;
918}
919
920
921
922
923
924
925
926
927
928int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer *timer,
929 ktime_t expires, ktime_t period)
930{
931 int ret = 0;
932 mutex_lock(&rtc->ops_lock);
933 if (timer->enabled)
934 rtc_timer_remove(rtc, timer);
935
936 timer->node.expires = expires;
937 timer->period = period;
938
939 ret = rtc_timer_enqueue(rtc, timer);
940
941 mutex_unlock(&rtc->ops_lock);
942 return ret;
943}
944
945
946
947
948
949
950
951int rtc_timer_cancel(struct rtc_device *rtc, struct rtc_timer *timer)
952{
953 int ret = 0;
954 mutex_lock(&rtc->ops_lock);
955 if (timer->enabled)
956 rtc_timer_remove(rtc, timer);
957 mutex_unlock(&rtc->ops_lock);
958 return ret;
959}
960
961
962