1 /* cpufreq_pmqos_input */
3 #include <linux/input.h>
5 struct input_dev touch_booster;
6 static int touch_booster_state;
7 const char touch_booster_name[] = "TOUCH_BOOSTER";
9 struct input_dev rotary_booster;
10 const char rotary_booster_name[] = "ROTARY_BOOSTER";
11 static int touch_boost_initialized;
14 struct mutex tb_muxtex_lock;
15 struct delayed_work tb_work_off;
16 struct delayed_work tb_work_chg;
19 #if defined(TRM_TOUCH_BOOSTER_EN)
20 static struct pm_qos_request touch_press_qos_array[NUMBER_OF_LOCK];
21 static struct pm_qos_request touch_move_qos_array[NUMBER_OF_LOCK];
22 static struct pm_qos_request touch_release_qos_array[NUMBER_OF_LOCK];
25 #if defined(TOUCH_WAKEUP_BOOSTER)
26 /* Touch Wakeup Booster */
27 static int touch_wakeup_initialized;
28 struct mutex touch_wakeup_booter_lock;
29 struct delayed_work touch_wakeup_booster_off_work;
30 static struct pm_qos_request pm_qos_cpufreq_touch_wakeup;
31 static struct pm_qos_request pm_qos_cpuonline_touch_wakeup;
33 extern int suspend_state;
34 void touch_wakeup_booster_turn_on(void)
39 if (!touch_wakeup_initialized)
42 mutex_lock(&touch_wakeup_booter_lock);
44 pr_info("%s\n", __FUNCTION__);
46 if (!pm_qos_request_active(&pm_qos_cpufreq_touch_wakeup)) {
47 pm_qos_add_request(&pm_qos_cpufreq_touch_wakeup
48 , PM_QOS_CPU_FREQ_MIN, touch_wakeup_min_cpu_freq);
49 if (!pm_qos_request_active(&pm_qos_cpuonline_touch_wakeup)) {
50 pm_qos_add_request(&pm_qos_cpuonline_touch_wakeup
51 , PM_QOS_CPU_ONLINE_MIN, 2);
54 schedule_delayed_work(&touch_wakeup_booster_off_work
55 ,msecs_to_jiffies(TOUCH_WAKEUP_BOOSTER_DELAY));
58 mutex_unlock(&touch_wakeup_booter_lock);
61 static void touch_wakeup_off_work_func(struct work_struct *work)
63 mutex_lock(&touch_wakeup_booter_lock);
65 if (pm_qos_request_active(&pm_qos_cpufreq_touch_wakeup))
66 pm_qos_remove_request(&pm_qos_cpufreq_touch_wakeup);
68 if (pm_qos_request_active(&pm_qos_cpuonline_touch_wakeup))
69 pm_qos_remove_request(&pm_qos_cpuonline_touch_wakeup);
71 mutex_unlock(&touch_wakeup_booter_lock);
73 pr_info("%s\n", __FUNCTION__);
78 #if defined(HARD_KEY_BOOSTER)
79 /* Hard Key Booster */
80 static int hard_key_initialized;
81 struct mutex hard_key_booster_lock;
82 struct delayed_work hardkey_booster_off_work;
83 static struct pm_qos_request pm_qos_cpufreq_hard_key;
84 static struct pm_qos_request pm_qos_cpuonline_hard_key;
86 extern int suspend_state;
87 void hard_key_booster_turn_on(void)
92 if (!hard_key_initialized)
95 mutex_lock(&hard_key_booster_lock);
97 pr_info("%s\n", __FUNCTION__);
99 if (!pm_qos_request_active(&pm_qos_cpufreq_hard_key)) {
100 pm_qos_add_request(&pm_qos_cpufreq_hard_key
101 , PM_QOS_CPU_FREQ_MIN, hard_key_min_cpu_freq);
102 if (!pm_qos_request_active(&pm_qos_cpuonline_hard_key)) {
103 pm_qos_add_request(&pm_qos_cpuonline_hard_key
104 , PM_QOS_CPU_ONLINE_MIN, 2);
107 schedule_delayed_work(&hardkey_booster_off_work
108 ,msecs_to_jiffies(KEY_BOOSTER_DELAY));
111 mutex_unlock(&hard_key_booster_lock);
114 static void hard_key_off_work_func(struct work_struct *work)
116 mutex_lock(&hard_key_booster_lock);
118 if (pm_qos_request_active(&pm_qos_cpufreq_hard_key))
119 pm_qos_remove_request(&pm_qos_cpufreq_hard_key);
121 if (pm_qos_request_active(&pm_qos_cpuonline_hard_key))
122 pm_qos_remove_request(&pm_qos_cpuonline_hard_key);
124 mutex_unlock(&hard_key_booster_lock);
126 pr_info("%s\n", __FUNCTION__);
131 #if defined(ROTARY_BOOSTER)
132 #include <linux/pm_qos.h>
134 struct delayed_work rotary_booster_off_work;
135 static struct pm_qos_request pm_qos_rotary_cpufreq;
136 static struct pm_qos_request pm_qos_rotary_miffreq;
138 struct mutex rotary_dvfs_lock;
139 struct mutex rotary_off_dvfs_lock;
140 static int rotary_initialized;
142 static void rotary_off_work_func(struct work_struct *work)
144 #if defined(CONFIG_SLP_MINI_TRACER)
145 kernel_mini_tracer_smp("rotary_off_1\n");
147 mutex_lock(&rotary_off_dvfs_lock);
148 #if defined(CONFIG_SLP_MINI_TRACER)
149 kernel_mini_tracer_smp("rotary_off_2\n");
151 if (pm_qos_request_active(&pm_qos_rotary_cpufreq))
152 pm_qos_remove_request(&pm_qos_rotary_cpufreq);
154 if (pm_qos_request_active(&pm_qos_rotary_miffreq))
155 pm_qos_remove_request(&pm_qos_rotary_miffreq);
156 #if defined(CONFIG_SLP_MINI_TRACER)
157 kernel_mini_tracer_smp("rotary_off_3\n");
159 mutex_unlock(&rotary_off_dvfs_lock);
160 #if defined(CONFIG_SLP_MINI_TRACER)
161 kernel_mini_tracer_smp("rotary_off_4\n");
166 void rotary_booster_turn_on(void)
168 if (!rotary_initialized)
171 #if defined(CONFIG_SLP_INPUT_REC)
172 __slp_store_input_history(&rotary_booster, ROTORY_BOOSTER_TURN, 0, 0);
175 #if defined(ROTARY_BOOSTER)
176 #if defined(CONFIG_SLP_MINI_TRACER)
177 kernel_mini_tracer_smp("rotary_0\n");
179 mutex_lock(&rotary_dvfs_lock);
180 #if defined(CONFIG_SLP_MINI_TRACER)
181 kernel_mini_tracer_smp("rotary_1\n");
184 if (!pm_qos_request_active(&pm_qos_rotary_cpufreq)) {
185 #if defined(CONFIG_SLP_MINI_TRACER)
186 kernel_mini_tracer_smp("rotary_2\n");
188 pm_qos_add_request(&pm_qos_rotary_cpufreq
189 , PM_QOS_CPU_FREQ_MIN, rotary_min_cpu_freq);
191 if (!pm_qos_request_active(&pm_qos_rotary_miffreq)) {
192 pm_qos_add_request(&pm_qos_rotary_miffreq
193 , PM_QOS_BUS_THROUGHPUT, rotary_min_mif_freq);
196 schedule_delayed_work(&rotary_booster_off_work
197 ,msecs_to_jiffies(ROTARY_BOOSTER_DELAY));
199 #if defined(CONFIG_SLP_MINI_TRACER)
200 kernel_mini_tracer_smp("rotary_3\n");
202 cancel_delayed_work_sync(&rotary_booster_off_work);
203 schedule_delayed_work(&rotary_booster_off_work
204 ,msecs_to_jiffies(ROTARY_BOOSTER_DELAY));
206 #if defined(CONFIG_SLP_MINI_TRACER)
207 kernel_mini_tracer_smp("rotary_4\n");
209 mutex_unlock(&rotary_dvfs_lock);
210 #if defined(CONFIG_SLP_MINI_TRACER)
211 kernel_mini_tracer_smp("rotary_5\n");
220 void touch_booster_move(struct work_struct *work)
222 #if defined(CONFIG_SLP_INPUT_REC)
223 __slp_store_input_history(&touch_booster, TOUCH_BOOSTER_MOVE, 0, 0);
226 if (touch_booster_state == TOUCH_BOOSTER_PRESS) {
227 mutex_lock(&tb_muxtex_lock);
229 touch_booster_move_sub();
231 mutex_unlock(&tb_muxtex_lock);
236 void touch_booster_press(void)
238 if (!touch_boost_initialized)
241 #if defined(CONFIG_SLP_INPUT_REC)
242 __slp_store_input_history(&touch_booster, TOUCH_BOOSTER_PRESS, 0, 0);
245 mutex_lock(&tb_muxtex_lock);
246 cancel_delayed_work(&tb_work_off);
248 if ((touch_booster_state == TOUCH_BOOSTER_RELEASE)
249 && (cpufreq_get_touch_boost_en() == 1)) {
250 touch_booster_press_sub();
251 schedule_delayed_work(&tb_work_chg
252 , msecs_to_jiffies(TOUCH_BOOSTER_CHG_TIME));
255 touch_booster_state = TOUCH_BOOSTER_PRESS;
258 mutex_unlock(&tb_muxtex_lock);
262 void touch_booster_release(void)
264 #if defined(CONFIG_SLP_INPUT_REC)
265 __slp_store_input_history(&touch_booster, TOUCH_BOOSTER_RELEASE, 0, 0);
268 if (touch_booster_state == TOUCH_BOOSTER_PRESS) {
269 touch_booster_release_sub();
271 cancel_delayed_work(&tb_work_chg);
272 schedule_delayed_work(&tb_work_off,
273 msecs_to_jiffies(TOUCH_BOOSTER_OFF_TIME));
278 void touch_booster_off(struct work_struct *work)
280 mutex_lock(&tb_muxtex_lock);
282 touch_booster_off_sub();
283 touch_booster_state = TOUCH_BOOSTER_RELEASE;
285 mutex_unlock(&tb_muxtex_lock);
289 void touch_booster_release_all(void)
291 #if defined(CONFIG_SLP_INPUT_REC)
292 __slp_store_input_history(&touch_booster, TOUCH_BOOSTER_RELEASE_ALL, 0, 0);
295 mutex_lock(&tb_muxtex_lock);
297 cancel_delayed_work(&tb_work_off);
298 cancel_delayed_work(&tb_work_chg);
299 schedule_work(&tb_work_off.work);
301 mutex_unlock(&tb_muxtex_lock);
306 #if defined(TRM_TOUCH_BOOSTER_EN)
307 static bool touch_boost_en_value = 1;
308 static ssize_t show_touch_boost_en(struct kobject *kobj,
309 struct attribute *attr, char *buf)
311 unsigned int ret = 0;
312 ret = sprintf(buf, "%d\n", touch_boost_en_value);
316 static ssize_t store_touch_boost_en(struct kobject *a, struct attribute *b,
317 const char *buf, size_t count)
323 if ((input == 0 ) || (input == 1 ))
324 touch_boost_en_value = input;
330 bool cpufreq_get_touch_boost_en(void)
332 return touch_boost_en_value;
335 static unsigned int touch_boost_press_value = PM_QOS_TOUCH_PRESS_DEFAULT_VALUE;
336 static ssize_t show_touch_boost_press(struct kobject *kobj,
337 struct attribute *attr, char *buf)
339 unsigned int ret = 0;
340 ret = sprintf(buf, "%d\n", cpufreq_get_touch_boost_press());
344 static ssize_t store_touch_boost_press(struct kobject *a, struct attribute *b,
345 const char *buf, size_t count)
347 set_pmqos_data(touch_press_qos_array, PM_QOS_TOUCH_PRESS, buf);
353 unsigned int cpufreq_get_touch_boost_press(void)
356 touch_boost_press_value = pm_qos_request(PM_QOS_TOUCH_PRESS);
358 return touch_boost_press_value;
364 static unsigned int touch_boost_move_value = PM_QOS_TOUCH_MOVE_DEFAULT_VALUE;
365 static ssize_t show_touch_boost_move(struct kobject *kobj,
366 struct attribute *attr, char *buf)
368 unsigned int ret = 0;
369 ret = sprintf(buf, "%d\n", cpufreq_get_touch_boost_move());
373 static ssize_t store_touch_boost_move(struct kobject *a, struct attribute *b,
374 const char *buf, size_t count)
377 set_pmqos_data(touch_move_qos_array, PM_QOS_TOUCH_MOVE, buf);
382 unsigned int cpufreq_get_touch_boost_move(void)
384 touch_boost_move_value = pm_qos_request(PM_QOS_TOUCH_MOVE);
386 return touch_boost_move_value;
392 static unsigned int touch_boost_release_value = PM_QOS_TOUCH_RELEASE_DEFAULT_VALUE;
393 static ssize_t show_touch_boost_release(struct kobject *kobj,
394 struct attribute *attr, char *buf)
396 unsigned int ret = 0;
397 ret = sprintf(buf, "%d\n", cpufreq_get_touch_boost_release());
401 static ssize_t store_touch_boost_release(struct kobject *a, struct attribute *b,
402 const char *buf, size_t count)
405 set_pmqos_data(touch_release_qos_array, PM_QOS_TOUCH_RELEASE, buf);
411 unsigned int cpufreq_get_touch_boost_release(void)
413 touch_boost_release_value = pm_qos_request(PM_QOS_TOUCH_RELEASE);
415 return touch_boost_release_value;
419 static int touch_cpu_online_min_value;
420 unsigned int touch_cpu_get_online_min(void)
422 return touch_cpu_online_min_value;
425 static ssize_t show_touch_cpu_online_min(struct kobject *kobj,
426 struct attribute *attr, char *buf)
428 unsigned int ret = 0;
429 ret = sprintf(buf, "%d\n", touch_cpu_get_online_min());
434 static ssize_t __ref store_touch_cpu_online_min(struct kobject *a, struct attribute *b,
435 const char *buf, size_t count)
439 if (strstr(buf, "-1")!=NULL)
442 lock_value = atoi(buf);
444 if ((lock_value > 0) && (lock_value <= NR_CPUS))
445 touch_cpu_online_min_value = lock_value;
446 else if (lock_value == -1)
447 touch_cpu_online_min_value = lock_value;
455 #if defined(TRM_TOUCH_BOOSTER_EN)
456 define_one_root_rw(touch_boost_en);
457 define_one_root_rw(touch_boost_press);
458 define_one_root_rw(touch_boost_move);
459 define_one_root_rw(touch_boost_release);
460 define_one_root_rw(touch_cpu_online_min);
464 void input_booster_init(void)
466 /* STEP 1 : TOUCH BOOSTER INIT */
467 touch_booster.name = touch_booster_name;
468 mutex_init(&tb_muxtex_lock);
470 INIT_DELAYED_WORK(&tb_work_off, touch_booster_off);
471 INIT_DELAYED_WORK(&tb_work_chg, touch_booster_move);
472 touch_booster_state = TOUCH_BOOSTER_RELEASE;
473 touch_boost_initialized = 1;
475 /* STEP 2 : ROTARY BOOSTER INIT */
476 #if defined(ROTARY_BOOSTER)
477 rotary_booster.name = rotary_booster_name;
478 mutex_init(&rotary_dvfs_lock);
479 mutex_init(&rotary_off_dvfs_lock);
480 INIT_DELAYED_WORK(&rotary_booster_off_work, rotary_off_work_func);
481 rotary_initialized = 1;
484 #if defined(HARD_KEY_BOOSTER)
485 mutex_init(&hard_key_booster_lock);
486 INIT_DELAYED_WORK(&hardkey_booster_off_work, hard_key_off_work_func);
487 hard_key_initialized = 1;
490 #if defined(TOUCH_WAKEUP_BOOSTER)
491 mutex_init(&touch_wakeup_booter_lock);
492 INIT_DELAYED_WORK(&touch_wakeup_booster_off_work, touch_wakeup_off_work_func);
493 touch_wakeup_initialized = 1;