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