rk30: pm: fix usb uart bupass support
[firefly-linux-kernel-4.4.55.git] / arch / arm / plat-rk / rk_pm_tests / auto_wakeup.c
1 #include <linux/android_alarm.h>\r
2 #include <linux/mutex.h>\r
3 #include <linux/kobject.h>\r
4 #include <linux/string.h>\r
5 \r
6 #include "rk_pm_tests.h"\r
7 #include "auto_wakeup.h"\r
8 static struct alarm alarm;\r
9 static struct timespec period;\r
10 static int alarm_status = 0;\r
11 static DEFINE_MUTEX(mutex);\r
12 \r
13 static int get_alarm_status(void)\r
14 {\r
15         return alarm_status;\r
16 }\r
17 \r
18 static void alarm_update(struct alarm *alarm)\r
19 {\r
20         struct timespec now_time;\r
21         struct timespec new_time;\r
22 \r
23         now_time = ktime_to_timespec(alarm_get_elapsed_realtime());\r
24 \r
25         PM_DBG("now_time %ld\n",now_time.tv_sec);\r
26 \r
27         new_time.tv_sec = now_time.tv_sec + period.tv_sec;\r
28         new_time.tv_nsec = now_time.tv_nsec + period.tv_nsec;\r
29 \r
30         alarm_start_range(alarm, timespec_to_ktime(new_time), timespec_to_ktime(new_time));\r
31 }\r
32 \r
33 static void stop_auto_wakeup(void)\r
34 {\r
35         mutex_lock(&mutex);\r
36 \r
37         if(alarm_status) {\r
38                 alarm_cancel(&alarm);\r
39                 alarm_status = 0;\r
40         }\r
41 \r
42         mutex_unlock(&mutex);\r
43 }\r
44 \r
45 static void start_auto_wakeup(long second)\r
46 {\r
47         stop_auto_wakeup();\r
48 \r
49         mutex_lock(&mutex);\r
50 \r
51         period.tv_sec = second;\r
52         period.tv_nsec = 0;\r
53 \r
54         alarm_init(&alarm, ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP, alarm_update);        \r
55         alarm_update(&alarm);\r
56         alarm_status = 1;\r
57 \r
58         mutex_unlock(&mutex);\r
59 }\r
60 \r
61 ssize_t auto_wakeup_show(struct kobject *kobj, struct kobj_attribute *attr,\r
62                 char *buf)\r
63 {\r
64         char *s = buf;\r
65 \r
66         if(get_alarm_status())\r
67                 s += sprintf(s, "%s\n", "on");\r
68         else\r
69                 s += sprintf(s, "%s\n", "off");\r
70 \r
71         return (s - buf);\r
72 }\r
73 \r
74 ssize_t auto_wakeup_store(struct kobject *kobj, struct kobj_attribute *attr,\r
75                 const char *buf, size_t n)\r
76 {\r
77         char cmd[10];\r
78         long val;\r
79         int len;\r
80         int error = -EINVAL;\r
81 \r
82         sscanf(buf, "%s %ld", cmd, &val);\r
83         len = strlen(cmd);\r
84 \r
85         if (len == strlen("on") && !strncmp(cmd,"on",len)) {\r
86                 start_auto_wakeup(val);\r
87                 error = 0;\r
88         }\r
89         else if(len == strlen("off") && !strncmp(cmd,"off",len)) {\r
90                 stop_auto_wakeup();\r
91                 error = 0;\r
92         }\r
93 \r
94         return error ? error : n;\r
95 }\r
96 \r
97 \r