UPSTREAM: clk: rockchip: rk3036: fix uarts clock error
[firefly-linux-kernel-4.4.55.git] / drivers / rtc / auto-wake.c
1 #include <linux/android_alarm.h>
2 #include <linux/device.h>
3 #include <linux/miscdevice.h>
4 #include <linux/platform_device.h>
5 #include <linux/rtc.h>
6 #include <linux/sched.h>
7 #include <linux/spinlock.h>
8 #include <linux/sysdev.h>
9 #include <linux/wakelock.h>
10 #include <linux/power_supply.h>
11 #include <linux/suspend.h>
12
13 #include <asm/mach/time.h>
14
15 struct auto_wake
16 {
17         struct alarm alarm;
18         struct timespec timer;
19         //struct notifier_block pm_nb;
20 };
21
22 static struct auto_wake auto_wake;
23 struct timespec set_atuo_wake_time( struct timespec timer)
24 {
25         struct timespec new_time;
26         struct timespec tmp_time;
27         
28         tmp_time =ktime_to_timespec(alarm_get_elapsed_realtime());
29
30         printk("nowtime = %ld \n",tmp_time.tv_sec);
31         
32         new_time.tv_nsec = timer.tv_nsec+ tmp_time.tv_nsec;
33         new_time.tv_sec =  timer.tv_sec+ tmp_time.tv_sec;
34
35         return new_time;
36 }
37
38 static void auto_wake_update(struct auto_wake *auto_wake)
39 {
40
41         struct timespec new_alarm_time;
42         
43 //      printk("auto_wake_update\n");
44         new_alarm_time = set_atuo_wake_time(auto_wake->timer);
45         alarm_start_range(&auto_wake->alarm,
46                         timespec_to_ktime(new_alarm_time),
47                         timespec_to_ktime(new_alarm_time));
48 }
49
50 static void atuo_wake_trigger(struct alarm *alarm)
51 {
52
53         struct auto_wake *auto_wake = container_of(alarm, struct auto_wake,
54                                                     alarm);
55
56         auto_wake_update(auto_wake);
57 }
58
59
60 #if 0
61 static void auto_wake_cancel(struct auto_wake *auto_wake)
62 {
63         alarm_cancel(&auto_wake->alarm);
64 }
65
66
67
68 static int auto_wake_callback(struct notifier_block *nfb,
69                                         unsigned long action,
70                                         void *ignored)
71 {
72
73         struct auto_wake *auto_wake = container_of(nfb, struct auto_wake,
74                                                     pm_nb);
75
76         switch (action)
77         {
78                 case PM_SUSPEND_PREPARE:
79                 {
80                         printk("PM_SUSPEND_PREPARExsf \n");
81                         auto_wake_update(auto_wake);
82                         return NOTIFY_OK;
83                 }
84                 case PM_POST_SUSPEND:
85                 {
86                         printk("PM_POST_SUSPENDxsf \n");
87                 //      auto_wake_cancel(auto_wake);
88                         return NOTIFY_OK;
89                 }
90         }
91
92         return NOTIFY_DONE;
93 }
94
95
96 static struct notifier_block auto_wake_pm_notifier = {
97         .notifier_call = auto_wake_callback,
98         .priority = 0,
99 };
100
101 #endif
102
103 void auto_wake_init(struct auto_wake *auto_wake,struct timespec timer)
104 {
105 //      auto_wake->pm_nb = auto_wake_pm_notifier;
106         auto_wake->timer = timer;
107         
108         alarm_init(&auto_wake->alarm,   ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP, atuo_wake_trigger);
109
110         //register_pm_notifier(&auto_wake->pm_nb);// xsf
111
112 }
113
114 static int  __init start_auto_wake(void)
115 {
116    
117         struct timespec timer;
118
119         printk("CONFIG_AUTO_WAKE_UP_PERIOD = %d\n", CONFIG_AUTO_WAKE_UP_PERIOD);
120         timer.tv_sec =   CONFIG_AUTO_WAKE_UP_PERIOD;
121         timer.tv_nsec = 0;
122         
123         auto_wake_init(&auto_wake,timer);
124         auto_wake_update(&auto_wake);
125         return 0;
126
127
128 late_initcall_sync(start_auto_wake);