merge with master
[platform/adaptation/intel_mfld/device-manager-plugin-mfld-blackbay.git] / src / device_manager_plugin_mfld.c
1 /*
2 * Copyright (c) 2012 Intel Co., Ltd All Rights Reserved
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18 #include <string.h>
19 #include <sys/types.h>
20 #include <stdio.h>
21 #include <dirent.h>
22 #include <errno.h>
23 #include <devman_plugin_intf.h>
24
25 #include "devman_define_node_path.h"
26 #include "vibrator.h"
27
28 #define EXPORT_API  __attribute__((visibility("default")))
29
30 #define BUFF_MAX        255
31 #define MAX_NAME 255
32
33 /* TODO: Add APIs has (char *) params */
34
35 #define GENERATE_ACCESSORS_INT_RW(_suffix, _item)       \
36 int OEM_sys_get_##_suffix(int *value)                   \
37 {                                               \
38         return sys_get_int(_item, value);       \
39 }                                               \
40                                                 \
41 int OEM_sys_set_##_suffix(int value)    \
42 {                                               \
43         return sys_set_int(_item, value);       \
44 }
45
46 #define GENERATE_ACCESSORS_INT_R(_suffix, _item)        \
47 int OEM_sys_get_##_suffix(int *value)                   \
48 {                                               \
49         return sys_get_int(_item, value);       \
50 }
51
52 #define GENERATE_ACCESSORS_INT_W(_suffix, _item)        \
53 int OEM_sys_set_##_suffix(int value)                    \
54 {                                               \
55         return sys_set_int(_item, value);       \
56 }
57
58 /*
59 GENERATE_ACCESSORS_INT_R(backlight_max_brightness, BACKLIGHT_MAX_BRIGHTNESS_PATH)
60 GENERATE_ACCESSORS_INT_RW(backlight_brightness, BACKLIGHT_BRIGHTNESS_PATH)
61 GENERATE_ACCESSORS_INT_RW(backlight_acl_control, LCD_ACL_CONTROL_PATH)
62 GENERATE_ACCESSORS_INT_RW(lcd_power, LCD_POWER_PATH)
63 */
64 #if defined(DEVMGR_LOG)
65 #define devmgr_log(fmt, args...) \
66         do { \
67                 printf("%s:"fmt"\n", __func__, ##args); \
68         }while(0);
69 #else
70 #define devmgr_log(fmt, args...)
71 #endif
72
73 enum display_type
74 {
75         DISP_MAIN = 0,
76         DISP_SUB,
77         DISP_MAX
78 };
79
80 enum lux_status {
81         decrement,
82         no_change,
83         increment,
84 };
85
86 struct display_info
87 {
88         enum display_type etype; /* FIXME:!! Main LCD or Sub LCD node */
89         char bl_name[MAX_NAME]; /* backlight name */
90         char lcd_name[MAX_NAME]; /* lcd name */
91 };
92
93 #define MAX_CANDELA_CRITERION   300
94 #define PWR_SAVING_CANDELA_CRITERION    20
95
96 /* FIXME:!! change to global_ctx */
97 __thread int lcd_index;
98 __thread int bl_index;
99 __thread struct display_info disp_info[DISP_MAX];
100
101 int OEM_sys_get_backlight_brightness_by_lux(unsigned int lux, enum lux_status status)
102 {
103         static __thread int brightness = -1;
104
105         if (status == no_change) {
106                 if (brightness == -1)
107                         status = increment;
108                 else
109                         return brightness;
110         }
111         if (status == decrement) {
112                 switch (lux) {
113                 case 10000 ... 0xffffffff:
114                         brightness =  100;
115                         break;
116                 case 1000 ... 9999:
117                         brightness =  80;
118                         break;
119                 case 75 ... 999:
120                         brightness =  60;
121                         break;
122                 case 7 ... 74:
123                         brightness =  40;
124                         break;
125                 case 0 ... 6:
126                         brightness =  1;
127                         break;
128                 default:
129                         return -1;
130                 }
131         } else if (status == increment) {
132                 switch (lux) {
133                 case 15001 ... 0xffffffff:
134                         brightness =  100;
135                         break;
136                 case 1501 ... 15000:
137                         brightness =  80;
138                         break;
139                 case 151 ...  1500:
140                         brightness =  60;
141                         break;
142                 case 16 ... 150:
143                         brightness =  40;
144                         break;
145                 case 0 ... 15:
146                         brightness =  1;
147                         break;
148                 default:
149                         return -1;
150                 }
151         } else
152                 return -1;
153
154         return brightness;
155 }
156
157 static int OEM_sys_display_info(struct display_info *disp_info)
158 {
159         struct dirent *dent;
160         DIR *dirp;
161         int i, index;
162         const char * bl_path = BACKLIGHT_PATH;
163         const char * lcd_path = LCD_PATH;
164
165         /* Backlight */
166         index = 0;
167         dirp = opendir(bl_path);
168         if (dirp) {
169                 while(dent = readdir(dirp)) {
170                         if (index >= DISP_MAX) {
171                                 devmgr_log("supports %d display node", DISP_MAX);
172                                 break;
173                         }
174
175                         if (!strcmp(".", dent->d_name) || !strcmp("..", dent->d_name))
176                                 continue;
177                         else {
178                                 strcpy(disp_info[index].bl_name, dent->d_name);
179                                 index++;
180                         }
181                 }
182                 closedir(dirp);
183         }
184
185         for (i = 0; i < index; i++)
186                 devmgr_log("bl_name[%s]", disp_info[i].bl_name);
187
188         bl_index = index;
189
190         /* LCD */
191         index = 0;
192         dirp = opendir(lcd_path);
193         if (dirp) {
194                 while(dent = readdir(dirp)) {
195                         if (index >= DISP_MAX) {
196                                 devmgr_log("supports %d display node", DISP_MAX);
197                                 break;
198                         }
199
200                         if (!strcmp(".", dent->d_name) || !strcmp("..", dent->d_name))
201                                 continue;
202                         else {
203                                 strcpy(disp_info[index].lcd_name, dent->d_name);
204                                 index++;
205                         }
206                 }
207                 closedir(dirp);
208         }
209
210         for (i = 0; i < index; i++)
211                 devmgr_log("lcd_name[%s]", disp_info[i].lcd_name);
212
213         lcd_index = index;
214 }
215
216 int OEM_sys_get_display_count(int *value)
217 {
218         int ret = -1;
219
220         /* TODO: We should implement to find out current number of display */
221         *value = (lcd_index == 0 ? bl_index : lcd_index) ;
222         ret = 0;
223         /* ********************* */
224
225         devmgr_log("value[%d]", *value);
226
227         return ret;
228 }
229
230 int OEM_sys_get_backlight_max_brightness(int index, int *value)
231 {
232         int ret = -1;
233         char path[MAX_NAME+1];
234
235         if (index >= DISP_MAX) {
236                 devmgr_log("supports %d display node", DISP_MAX);
237                 return ret;
238         }
239
240         snprintf(path, MAX_NAME, BACKLIGHT_MAX_BRIGHTNESS_PATH, disp_info[index].bl_name);
241         ret = sys_get_int(path, value);
242         devmgr_log("path[%s]value[%d]", path, *value);
243
244         return ret;
245 }
246
247 int OEM_sys_get_backlight_min_brightness(int index, int *value)
248 {
249         int ret = -1;
250         char path[MAX_NAME+1];
251
252         if (index >= DISP_MAX) {
253                 devmgr_log("supports %d display node", DISP_MAX);
254                 return ret;
255         }
256
257         snprintf(path, MAX_NAME, BACKLIGHT_MIN_BRIGHTNESS_PATH, disp_info[index].bl_name);
258         ret = sys_get_int(path, value);
259
260     //FIXME: this is a workaround for TZSP-3141 before kernel exports min_brightness.
261     if(ret < 0){
262         *value = 0;
263         ret = 0;
264     } 
265
266         devmgr_log("path[%s]value[%d]", path, *value);
267
268         return ret;
269 }
270
271
272 int OEM_sys_get_backlight_brightness(int index, int *value, int power_saving)
273 {
274         int ret = -1;
275         char path[MAX_NAME+1];
276         int max_brightness;
277         int pwr_saving_offset;
278
279         if (index >= DISP_MAX) {
280                 devmgr_log("supports %d display node", DISP_MAX);
281                 return ret;
282         }
283
284         snprintf(path, MAX_NAME, BACKLIGHT_BRIGHTNESS_PATH, disp_info[index].bl_name);
285         ret = sys_get_int(path, value);
286         devmgr_log("path[%s]value[%d]power_saving[%d]", path, *value, power_saving);
287
288         if (power_saving){
289                 snprintf(path, MAX_NAME, BACKLIGHT_MAX_BRIGHTNESS_PATH, disp_info[index].bl_name);
290                 ret = sys_get_int(path, &max_brightness);
291                 if (ret)
292                 {
293                         devmgr_log("Can't read max_brightness node[%s]", path);
294                         return ret;
295                 }
296                 pwr_saving_offset = (PWR_SAVING_CANDELA_CRITERION * max_brightness / MAX_CANDELA_CRITERION) + 0.5;
297
298                 if (*value > max_brightness - pwr_saving_offset)
299                         *value = max_brightness;
300                 else
301                         *value = *value + pwr_saving_offset;
302
303                 devmgr_log("power_saving result[%d]", *value);
304         }
305
306         return ret;
307 }
308
309
310 int OEM_sys_set_backlight_dimming(int index, int value)
311 {
312         int ret = -1;
313         char path[MAX_NAME+1];
314
315         devmgr_log("index is %d, value is %d",  index, value);
316         if (index >= DISP_MAX) {
317                 devmgr_log("supports %d display node", DISP_MAX);
318                 return ret;
319         }
320
321         snprintf(path, MAX_NAME, BACKLIGHT_DIMMING_PATH, disp_info[index].bl_name);
322         devmgr_log("path[%s]value[%d]", path, value);
323         ret = sys_set_int(path, value);
324
325         return ret;
326 }
327
328 int OEM_sys_set_backlight_brightness(int index, int value, int power_saving)
329 {
330         int ret = -1;
331         char path[MAX_NAME+1];
332         int max_brightness;
333         int pwr_saving_offset;
334
335         if (index >= DISP_MAX) {
336                 devmgr_log("supports %d display node", DISP_MAX);
337                 return ret;
338         }
339
340         devmgr_log("path[%s]value[%d]power_saving[%d]", path, value, power_saving);
341
342         if (power_saving){
343                 snprintf(path, MAX_NAME, BACKLIGHT_MAX_BRIGHTNESS_PATH, disp_info[index].bl_name);
344                 ret = sys_get_int(path, &max_brightness);
345                 if (ret)
346                 {
347                         devmgr_log("Can't read max_brightness node[%s]", path);
348                         return ret;
349                 }
350                 pwr_saving_offset = (PWR_SAVING_CANDELA_CRITERION * max_brightness / MAX_CANDELA_CRITERION) + 0.5;
351
352                 if (value < pwr_saving_offset)
353                         value = 0;
354                 else
355                         value = value - pwr_saving_offset;
356
357                 devmgr_log("power_saving result[%d]", value);
358         }
359
360         snprintf(path, MAX_NAME, BACKLIGHT_BRIGHTNESS_PATH, disp_info[index].bl_name);
361         ret = sys_set_int(path, value);
362
363         return ret;
364 }
365
366 int OEM_sys_get_backlight_acl_control(int index, int *value)
367 {
368         int ret = -1;
369         char path[MAX_NAME+1];
370
371         if (index >= DISP_MAX) {
372                 devmgr_log("supports %d display node", DISP_MAX);
373                 return ret;
374         }
375
376         snprintf(path, MAX_NAME, LCD_ACL_CONTROL_PATH, disp_info[index].lcd_name);
377         ret = sys_get_int(path, value);
378         devmgr_log("path[%s]value[%d]", path, *value);
379
380         return ret;
381 }
382
383 int OEM_sys_set_backlight_acl_control(int index, int value)
384 {
385         int ret = -1;
386         char path[MAX_NAME+1];
387
388         if (index >= DISP_MAX) {
389                 devmgr_log("supports %d display node", DISP_MAX);
390                 return ret;
391         }
392
393         snprintf(path, MAX_NAME, LCD_ACL_CONTROL_PATH, disp_info[index].lcd_name);
394         devmgr_log("path[%s]value[%d]", path, value);
395         ret = sys_set_int(path, value);
396
397         return ret;
398 }
399
400 int OEM_sys_get_lcd_power(int index, int *value)
401 {
402         int ret = -1;
403         char path[MAX_NAME+1];
404
405         if (index >= DISP_MAX) {
406                 devmgr_log("supports %d display node", DISP_MAX);
407                 return ret;
408         }
409
410         snprintf(path, MAX_NAME, LCD_POWER_PATH, disp_info[index].lcd_name);
411         ret = sys_get_int(path, value);
412         devmgr_log("path[%s]value[%d]", path, *value);
413
414         return ret;
415 }
416
417 int OEM_sys_set_lcd_power(int index, int value)
418 {
419         int ret = -1;
420         char path[MAX_NAME+1];
421
422         if (index >= DISP_MAX) {
423                 devmgr_log("supports %d display node", DISP_MAX);
424                 return ret;
425         }
426
427         snprintf(path, MAX_NAME, LCD_POWER_PATH, disp_info[index].lcd_name);
428         devmgr_log("path[%s]value[%d]", path, value);
429         ret = sys_set_int(path, value);
430
431         return ret;
432 }
433
434 /* image_enhance */
435 /* mode - dynamic, standard, natural, movie */
436 enum image_enhance_mode {
437         MODE_DYNAMIC = 0,
438         MODE_STANDARD,
439         MODE_NATURAL,
440         MODE_MOVIE,
441 };
442
443 /* scenario - ui, gallery, video, vtcall, camera, browser, negative, bypass */
444 enum image_enhance_scenario {
445         SCENARIO_UI = 0,
446         SCENARIO_GALLERY,
447         SCENARIO_VIDEO,
448         SCENARIO_VTCALL,
449         SCENARIO_CAMERA,
450         SCENARIO_BROWSER,
451         SCENARIO_NEGATIVE,
452         SCENARIO_BYPASS,
453 };
454
455 /* tone - normal, warm, cold */
456 enum image_enhance_tone {
457         TONE_NORMAL = 0,
458         TONE_WARM,
459         TONE_COLD,
460 };
461
462 /* tone browser - tone1, tone2, tone3 */
463 enum image_enhance_tone_br {
464         TONE_1 = 0,
465         TONE_2,
466         TONE_3,
467 };
468
469 /* outdoor - off, on */
470 enum image_enhance_outdoor {
471         OUTDOOR_OFF = 0,
472         OUTDOOR_ON,
473 };
474
475 /* index - mode, scenario, tone, outdoor, tune */
476 enum image_enhance_index {
477         INDEX_MODE,
478         INDEX_SCENARIO,
479         INDEX_TONE,
480         INDEX_OUTDOOR,
481         INDEX_TUNE,
482         INDEX_MAX,
483 };
484
485 const char *image_enhance_str[INDEX_MAX] = {
486         "mode",
487         "scenario",
488         "tone",
489         "outdoor",
490         "tune",
491 };
492
493 struct image_enhance_info {
494         enum image_enhance_mode mode;
495         enum image_enhance_scenario scenario;
496         enum image_enhance_tone tone;
497         enum image_enhance_outdoor outdoor;
498 };
499
500 int OEM_sys_get_image_enhance_save(void *image_enhance)
501 {
502         int ret = -1;
503         char path[MAX_NAME+1];
504         struct image_enhance_info *image_enhance_save = (struct image_enhance_info *)image_enhance;
505
506         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_MODE]);
507         ret = sys_get_int(path, &image_enhance_save->mode);
508         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_SCENARIO]);
509         ret = sys_get_int(path, &image_enhance_save->scenario);
510         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_TONE]);
511         ret = sys_get_int(path, &image_enhance_save->tone);
512         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_OUTDOOR]);
513         ret = sys_get_int(path, &image_enhance_save->outdoor);
514         devmgr_log("path[%s]mode[%d]scenario[%d]tone[%d]outdoor[%d]", path, image_enhance_save->mode,
515                 image_enhance_save->scenario, image_enhance_save->tone, image_enhance_save->outdoor);
516
517         return ret;
518 }
519
520 int OEM_sys_set_image_enhance_restore(void *image_enhance)
521 {
522         int ret = -1;
523         char path[MAX_NAME+1];
524         struct image_enhance_info *image_enhance_restore = (struct image_enhance_info *)image_enhance;
525
526         devmgr_log("path[%s]mode[%d]scenario[%d]tone[%d]outdoor[%d]", path, image_enhance_restore->mode,
527                 image_enhance_restore->scenario, image_enhance_restore->tone, image_enhance_restore->outdoor);
528         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_MODE]);
529         ret = sys_set_int(path, image_enhance_restore->mode);
530         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_SCENARIO]);
531         ret = sys_set_int(path, image_enhance_restore->scenario);
532         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_TONE]);
533         ret = sys_set_int(path, image_enhance_restore->tone);
534         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_OUTDOOR]);
535         ret = sys_set_int(path, image_enhance_restore->outdoor);
536
537         return ret;
538 }
539
540 int OEM_sys_get_image_enhance_mode(int *value)
541 {
542         int ret = -1;
543         char path[MAX_NAME+1];
544
545         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_MODE]);
546         ret = sys_get_int(path, value);
547         devmgr_log("path[%s]value[%d]", path, *value);
548
549         return ret;
550 }
551
552 int OEM_sys_set_image_enhance_mode(int value)
553 {
554         int ret = -1;
555         char path[MAX_NAME+1];
556
557         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_MODE]);
558         devmgr_log("path[%s]value[%d]", path, value);
559         ret = sys_set_int(path, value);
560
561         return ret;
562 }
563
564 int OEM_sys_get_image_enhance_scenario(int *value)
565 {
566         int ret = -1;
567         char path[MAX_NAME+1];
568
569         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_SCENARIO]);
570         ret = sys_get_int(path, value);
571         devmgr_log("path[%s]value[%d]", path, *value);
572
573         return ret;
574 }
575
576 int OEM_sys_set_image_enhance_scenario(int value)
577 {
578         int ret = -1;
579         char path[MAX_NAME+1];
580
581         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_SCENARIO]);
582         devmgr_log("path[%s]value[%d]", path, value);
583         ret = sys_set_int(path, value);
584
585         return ret;
586 }
587
588 int OEM_sys_get_image_enhance_tone(int *value)
589 {
590         int ret = -1;
591         char path[MAX_NAME+1];
592
593         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_TONE]);
594         ret = sys_get_int(path, value);
595         devmgr_log("path[%s]value[%d]", path, *value);
596
597         return ret;
598 }
599
600 int OEM_sys_set_image_enhance_tone(int value)
601 {
602         int ret = -1;
603         char path[MAX_NAME+1];
604
605         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_TONE]);
606         devmgr_log("path[%s]value[%d]", path, value);
607         ret = sys_set_int(path, value);
608
609         return ret;
610 }
611
612 int OEM_sys_get_image_enhance_outdoor(int *value)
613 {
614         int ret = -1;
615         char path[MAX_NAME+1];
616
617         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_OUTDOOR]);
618         ret = sys_get_int(path, value);
619         devmgr_log("path[%s]value[%d]", path, *value);
620
621         return ret;
622 }
623
624 int OEM_sys_set_image_enhance_outdoor(int value)
625 {
626         int ret = -1;
627         char path[MAX_NAME+1];
628
629         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_OUTDOOR]);
630         devmgr_log("path[%s]value[%d]", path, value);
631         ret = sys_set_int(path, value);
632
633         return ret;
634 }
635
636 int OEM_sys_get_image_enhance_tune(int *value)
637 {
638         int ret = -1;
639         char path[MAX_NAME+1];
640
641         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_TUNE]);
642         ret = sys_get_int(path, value);
643         devmgr_log("path[%s]value[%d]", path, *value);
644
645         return ret;
646 }
647
648 int OEM_sys_set_image_enhance_tune(int value)
649 {
650         int ret = -1;
651         char path[MAX_NAME+1];
652
653         snprintf(path, MAX_NAME, IMAGE_ENHANCE_PATH, image_enhance_str[INDEX_TUNE]);
654         devmgr_log("path[%s]value[%d]", path, value);
655         ret = sys_set_int(path, value);
656
657         return ret;
658 }
659
660 int OEM_sys_image_enhance_info(int *value)
661 {
662         DIR *dir_info;
663         struct dirent *dir_entry;
664         int ret = -1;
665         const char * image_enhance_path_info = IMAGE_ENHANCE_PATH_INFO;
666
667         dir_info = opendir(image_enhance_path_info);
668
669         if (NULL != dir_info) {
670                 *value = 1;
671                 ret = 0;
672         } else {
673                 *value = 0;
674                 ret = -ENOENT;
675         }
676
677         closedir(dir_info);
678         return ret;
679 }
680
681 int OEM_sys_set_display_frame_rate(int value)
682 {
683         if(value){
684                 devmgr_log("Display frame rate limited to 40Hz");
685                 return sys_set_str(DISPLAY_FRAME_RATE_PATH, "40");
686         }else{
687                 devmgr_log("Display frame rate change 40Hz and 60Hz");
688                 return sys_set_str(DISPLAY_FRAME_RATE_PATH, "60");
689         }
690
691         return -1;
692 }
693
694 int OEM_sys_set_haptic_motor_oneshot(int value)
695 {
696         int ret;
697
698         // workaround: duration==50 doesn't vibrate in PR3 hardware
699         if( 50 == value) value = 100;
700
701         //assemble all possible times (Vibra1 On Time * Vibra1 Cycle Count)
702         ret = find_suit_value_and_set(value);
703         if(ret < 0) {
704                 devmgr_log("set oneshot faild");
705                 return ret;
706         }
707
708     // workaround: toggle vibration on org.tizen.settings->sound doesn't work
709     // settings applicaton will do something like below, while HAPTIC_PROP_ENABLE is never been set to 1 then.
710     // haptic_stop_all_effects->
711     // haptic_internal_stop_effect->
712     // device_set_property(DEVTYPE_HAPTIC, HAPTIC_PROP_ENABLE, 0);
713     //OEM_sys_set_haptic_vibetones_enable(1);
714
715 #if 0
716         //use settimer
717         ret = settimer_and_vibrate(value);
718         if(ret < 0) {
719                 devmgr_log("set oneshot faild");
720                 return ret;
721         }
722 #endif
723
724         return 0;
725 }
726
727 int OEM_sys_set_haptic_motor_level(int value)
728 {
729         int input_value = 0;
730
731         devmgr_log("input vibration level=%d", value);
732         switch(value) {
733                 case 0 ... 20:
734                         input_value = 20;
735                         break;
736                 case 21 ... 40:
737                         input_value = 40;
738                         break;
739                 case 41 ... 60:
740                         input_value = 60;
741                         break;
742                 case 61 ... 80:
743                         input_value = 80;
744                         break;
745                 case 81 ... 100:
746                         input_value = 100;
747                         break;
748                 default:
749                         devmgr_log("input vibration level=%d err", value);
750                         return -1;
751
752         }
753         return vib_hw_ctrl(VIBRA_DUTY_CYCLE, 1, input_value, NULL, NULL);
754 }
755
756 int OEM_sys_get_haptic_motor_level(int *value)
757 {
758     return vib_hw_ctrl(VIBRA_DUTY_CYCLE, 0, 0, value, NULL);
759 }
760
761 int OEM_sys_set_haptic_motor_enable(int value)
762 {
763         int vib_num_ontime, vib_num_cycle_count;
764
765         if(value == 1) {
766                 if(vib_hw_ctrl(VIBRA_GET_NUM_ON_TIME, 0, 0, &vib_num_ontime, NULL)) {
767                         devmgr_log("get VIBRA_GET_NUM_ON_TIME err");
768                         return -1;
769                 }
770
771                 if(vib_hw_ctrl(VIBRA_ON_TIME, 1, vib_num_ontime - 1 , NULL, NULL)) {
772                         devmgr_log("set VIBRA_ON_TIME err");
773                         return -1;
774                 }
775
776                 if(vib_hw_ctrl(VIBRA_GET_NUM_CYCLECOUNT, 0, 0, &vib_num_cycle_count, NULL)) {
777                         devmgr_log("get VIBRA_GET_NUM_CYCLECOUNT err");
778                         return -1;
779                 }
780
781                 if(vib_hw_ctrl(VIBRA_CYCLE_COUNT, 1, vib_num_cycle_count - 1, NULL, NULL)) {
782                         devmgr_log("set VIBRA_CYCLE_COUNT err");
783                         return -1;
784                 }
785         }
786
787         if(vib_hw_ctrl(VIBRA_START, 1, value, NULL, NULL)) {
788                 devmgr_log("set VIBRA_START err");
789                 return -1;
790         }
791
792         return 0;
793 }
794
795 int OEM_sys_get_haptic_motor_level_max(int *value)
796 {
797     return vib_hw_ctrl(VIBRA_GET_LEVEL_MAX, 0, 0, value, NULL);
798 }
799
800 GENERATE_ACCESSORS_INT_R(battery_capacity, BATTERY_CAPACITY_PATH)
801 /*
802 GENERATE_ACCESSORS_INT_R(battery_charge_full, BATTERY_CHARGE_FULL_PATH)
803 GENERATE_ACCESSORS_INT_R(battery_charge_now, BATTERY_CHARGE_NOW_PATH)
804 */
805 GENERATE_ACCESSORS_INT_R(battery_present, BATTERY_PRESENT_PATH)
806
807 enum battery_status_type
808 {
809         BATTERY_STATUS_FULL = 0,
810         BATTERY_STATUS_CHARGING,
811         BATTERY_STATUS_DISCHARGING,
812         BATTERY_STATUS_MAX,
813 };
814
815 static char *status_text[] = {
816         "Full", "Charging", "Discharging"
817 };
818
819 int OEM_sys_get_battery_charge_full(int *value)
820 {
821     char buf[BUFF_MAX] = {0};
822     int ret = -1;
823
824     ret = sys_get_str(BATTERY_CHARGE_STATUS_PATH, buf);
825
826     if(0 == ret){
827         if(0 == strncmp(buf, status_text[BATTERY_STATUS_FULL], strlen(status_text[BATTERY_STATUS_FULL]))){
828             *value = 1;
829         }else{
830             *value = 0;
831         }
832
833         ret = 0;
834     }
835
836     return ret;
837 }
838
839 int OEM_sys_get_battery_charge_now(int *value)
840 {
841     char buf[BUFF_MAX] = {0};
842     int ret = -1;
843
844     ret = sys_get_str(BATTERY_CHARGE_STATUS_PATH, buf);
845
846     if(0 == ret){
847         if(0 == strncmp(buf, status_text[BATTERY_STATUS_CHARGING], strlen(status_text[BATTERY_STATUS_CHARGING]))){
848             *value = 1;
849         }else{
850             *value = 0;
851         }
852
853         ret = 0;
854     }
855
856     return ret;
857 }
858
859 int OEM_sys_get_battery_capacity_raw(int *value)
860 {
861         int ret;
862
863         ret = sys_get_int(BATTERY_CAPACITY_RAW_PATH, value);
864         if (ret == -1) {
865                 return -ENODEV;
866         }
867
868         return ret;
869 }
870
871 static char *health_text[] = {
872         "Unknown", "Good", "Overheat", "Dead", "Over voltage",
873         "Unspecified failure", "Cold",
874 };
875
876 int OEM_sys_get_battery_health(int *value)
877 {
878         char buf[BUFF_MAX] = {0};
879         int ret = 0;
880         int i = 0;
881
882         ret = sys_get_str(BATTERY_HEALTH_PATH, buf);
883         if (ret == -1)
884                 return -1;
885
886         for (i = 0; i < BATTERY_HEALTH_MAX; i++) {
887                 if (strncmp(buf, health_text[i], strlen(health_text[i])) == 0) {
888                         *value = i;
889                         return 0;
890                 }
891         }
892
893         return -1;
894 }
895
896 int OEM_sys_get_battery_polling_required(int *value)
897 {
898         *value = 0;
899
900         return 0;
901 }
902
903 int OEM_sys_get_battery_support_insuspend_charging(int *value)
904 {
905         *value = 1;
906
907         return 0;
908 }
909
910 static char uart_node_path[MAX_NAME];
911 static char usb_node_path[MAX_NAME];
912
913 /* find uart/usb node path */
914 static int OEM_sys_muic_node_path_info()
915 {
916         int err = -1;
917
918         err = sys_check_node(UART_PATH);
919         if (!err)
920                 sys_get_node(UART_PATH, uart_node_path);
921         else {
922                 err = sys_check_node(UART_PATH_TRATS);
923                 if (err) {
924                         devmgr_log("uart path node not found");
925                         return -1;
926                 }
927                 sys_get_node(UART_PATH_TRATS, uart_node_path);
928         }
929
930         err = sys_check_node(USB_PATH);
931         if (!err)
932                 sys_get_node(USB_PATH, usb_node_path);
933         else {
934                 err = sys_check_node(USB_PATH_TRATS);
935                 if (err) {
936                         devmgr_log("usb path node not found");
937                         return -1;
938                 }
939                 sys_get_node(USB_PATH_TRATS, usb_node_path);
940         }
941         return 0;
942 }
943
944 int OEM_sys_get_uart_path(int *value)
945 {
946         char buf[BUFF_MAX] = {0};
947         int ret = 0;
948
949         ret = sys_get_str(uart_node_path, buf);
950         if (ret == -1)
951                 return -1;
952
953         if (strncmp(buf, "CP", 2) == 0) {
954                 *value = PATH_CP;
955                 return 0;
956         } else if (strncmp(buf, "AP", 2) == 0) {
957                 *value = PATH_AP;
958                 return 0;
959         }
960
961         return -1;
962 }
963
964 int OEM_sys_set_uart_path(int value)
965 {
966         switch (value) {
967         case PATH_CP:
968                 return sys_set_str(uart_node_path, "CP");
969         case PATH_AP:
970                 return sys_set_str(uart_node_path, "AP");
971         }
972
973         return -1;
974 }
975
976
977 int OEM_sys_get_usb_path(int *value)
978 {
979         char buf[BUFF_MAX] = {0};
980         int ret = 0;
981
982         ret = sys_get_str(usb_node_path, buf);
983         if (ret == -1)
984                 return -1;
985
986         if (strncmp(buf, "PDA", 3) == 0) {
987                 *value = PATH_AP;
988                 return 0;
989         } else if (strncmp(buf, "MODEM", 5) == 0) {
990                 *value = PATH_CP;
991                 return 0;
992         }
993
994         return -1;
995 }
996
997 int OEM_sys_set_usb_path(int value)
998 {
999         switch (value) {
1000         case PATH_CP:
1001                 return sys_set_str(usb_node_path, "MODEM");
1002         case PATH_AP:
1003                 return sys_set_str(usb_node_path, "PDA");
1004         }
1005
1006         return -1;
1007 }
1008
1009 GENERATE_ACCESSORS_INT_R(jack_charger_online, JACK_CHARGER_ONLINE_PATH)
1010 GENERATE_ACCESSORS_INT_R(jack_earjack_online, JACK_EARJACK_ONLINE_PATH)
1011 GENERATE_ACCESSORS_INT_R(jack_earkey_online, JACK_EARKEY_ONLINE_PATH)
1012 GENERATE_ACCESSORS_INT_R(jack_hdmi_online, JACK_HDMI_ONLINE_PATH)
1013 GENERATE_ACCESSORS_INT_R(jack_usb_online, JACK_USB_ONLINE_PATH)
1014 GENERATE_ACCESSORS_INT_R(jack_cradle_online, JACK_CRADLE_ONLINE_PATH)
1015 GENERATE_ACCESSORS_INT_R(jack_tvout_online, JACK_TVOUT_ONLINE_PATH)
1016
1017 int OEM_sys_get_jack_keyboard_online(int *value)
1018 {
1019         /* Currently, We don't provide SLP Based platform with keyboard I/F */
1020         int ret = -1;
1021         /*return sys_get_int(JACK_KEYBOARD_ONLINE_PATH, value);*/
1022         return ret;
1023 }
1024
1025 int OEM_sys_get_hdmi_support(int *value)
1026 {
1027         *value = 1;
1028
1029         return 0;
1030 }
1031
1032 GENERATE_ACCESSORS_INT_R(leds_torch_max_brightness, LEDS_TORCH_MAX_BRIGHTNESS_PATH)
1033 GENERATE_ACCESSORS_INT_RW(leds_torch_brightness, LEDS_TORCH_BRIGHTNESS_PATH)
1034
1035 int OEM_sys_set_power_state(int value)
1036 {
1037         switch (value) {
1038         case POWER_STATE_SUSPEND:
1039                 return sys_set_str(POWER_STATE_PATH, "mem");
1040         case POWER_STATE_PRE_SUSPEND:
1041                 return sys_set_str(POWER_STATE_PATH, "pre_suspend");
1042         case POWER_STATE_POST_RESUME:
1043                 return sys_set_str(POWER_STATE_PATH, "post_resume");
1044         }
1045
1046         return -1;
1047 }
1048
1049 GENERATE_ACCESSORS_INT_RW(power_wakeup_count, POWER_WAKEUP_COUNT_PATH)
1050
1051 GENERATE_ACCESSORS_INT_W(memnotify_threshold_lv1, MEMNOTIFY_THRESHOLD_LV1_PATH)
1052 GENERATE_ACCESSORS_INT_W(memnotify_threshold_lv2, MEMNOTIFY_THRESHOLD_LV2_PATH)
1053
1054 GENERATE_ACCESSORS_INT_R(cpufreq_cpuinfo_max_freq, CPUFREQ_CPUINFO_MAX_FREQ_PATH)
1055 GENERATE_ACCESSORS_INT_R(cpufreq_cpuinfo_min_freq, CPUFREQ_CPUINFO_MIN_FREQ_PATH)
1056 GENERATE_ACCESSORS_INT_RW(cpufreq_scaling_max_freq, CPUFREQ_SCALING_MAX_FREQ_PATH)
1057 GENERATE_ACCESSORS_INT_RW(cpufreq_scaling_min_freq, CPUFREQ_SCALING_MIN_FREQ_PATH)
1058
1059 #define GENERATE_ACCESSORS_INT_R_NO_CONVERT(_suffix, _item)     \
1060 int OEM_sys_get_##_suffix(int *value)                   \
1061 {                                               \
1062         return sys_get_int_wo_convert(_item, value);    \
1063 }
1064
1065 #define GENERATE_ACCESSORS_INT_W_NO_CONVERT(_suffix, _item)     \
1066 int OEM_sys_set_##_suffix(int value)                    \
1067 {                                               \
1068         return sys_set_int_wo_convert(_item, value);    \
1069 }
1070
1071 GENERATE_ACCESSORS_INT_R_NO_CONVERT(memnotify_victim_task, MEMNOTIFY_VICTIM_TASK_PATH)
1072 GENERATE_ACCESSORS_INT_W_NO_CONVERT(process_monitor_mp_pnp, PROCESS_MONITOR_MP_PNP_PATH)
1073 GENERATE_ACCESSORS_INT_W_NO_CONVERT(process_monitor_mp_vip, PROCESS_MONITOR_MP_VIP_PATH)
1074
1075 #define GENERATE_ACCESSORS_GET_NODE_PATH(_suffix, _item)        \
1076 int OEM_sys_get_##_suffix(char *node)                   \
1077 {                                               \
1078         return sys_get_node(_item, node);       \
1079 }
1080
1081 GENERATE_ACCESSORS_GET_NODE_PATH(touch_event, TOUCH_EVENT_NODE)
1082 GENERATE_ACCESSORS_GET_NODE_PATH(memnotify_node, MEMNOTIFY_NODE)
1083 GENERATE_ACCESSORS_GET_NODE_PATH(process_monitor_node, PROCESS_MONITOR_NODE)
1084
1085 static OEM_sys_devman_plugin_interface devman_plugin_interface_mfld;
1086
1087 EXPORT_API const OEM_sys_devman_plugin_interface *OEM_sys_get_devman_plugin_interface()
1088 {
1089         /* Light interfaces */
1090         devman_plugin_interface_mfld.OEM_sys_get_display_count = &OEM_sys_get_display_count;
1091         devman_plugin_interface_mfld.OEM_sys_get_backlight_min_brightness = &OEM_sys_get_backlight_min_brightness;
1092         devman_plugin_interface_mfld.OEM_sys_get_backlight_max_brightness = &OEM_sys_get_backlight_max_brightness;
1093         devman_plugin_interface_mfld.OEM_sys_get_backlight_brightness = &OEM_sys_get_backlight_brightness;
1094         devman_plugin_interface_mfld.OEM_sys_set_backlight_brightness = &OEM_sys_set_backlight_brightness;
1095         devman_plugin_interface_mfld.OEM_sys_set_backlight_dimming = &OEM_sys_set_backlight_dimming;
1096         devman_plugin_interface_mfld.OEM_sys_get_backlight_acl_control = &OEM_sys_get_backlight_acl_control;
1097         devman_plugin_interface_mfld.OEM_sys_set_backlight_acl_control = &OEM_sys_set_backlight_acl_control;
1098
1099         devman_plugin_interface_mfld.OEM_sys_get_lcd_power = &OEM_sys_get_lcd_power;
1100         devman_plugin_interface_mfld.OEM_sys_set_lcd_power = &OEM_sys_set_lcd_power;
1101
1102         /* Image Ehnhace interfaces */
1103         devman_plugin_interface_mfld.OEM_sys_get_image_enhance_mode = &OEM_sys_get_image_enhance_mode;
1104         devman_plugin_interface_mfld.OEM_sys_set_image_enhance_mode = &OEM_sys_set_image_enhance_mode;
1105         devman_plugin_interface_mfld.OEM_sys_get_image_enhance_scenario = &OEM_sys_get_image_enhance_scenario;
1106         devman_plugin_interface_mfld.OEM_sys_set_image_enhance_scenario = &OEM_sys_set_image_enhance_scenario;
1107         devman_plugin_interface_mfld.OEM_sys_get_image_enhance_tone = &OEM_sys_get_image_enhance_tone;
1108         devman_plugin_interface_mfld.OEM_sys_set_image_enhance_tone = &OEM_sys_set_image_enhance_tone;
1109         devman_plugin_interface_mfld.OEM_sys_get_image_enhance_outdoor = &OEM_sys_get_image_enhance_outdoor;
1110         devman_plugin_interface_mfld.OEM_sys_set_image_enhance_outdoor = &OEM_sys_set_image_enhance_outdoor;
1111
1112         devman_plugin_interface_mfld.OEM_sys_get_image_enhance_tune = &OEM_sys_get_image_enhance_tune;
1113         devman_plugin_interface_mfld.OEM_sys_set_image_enhance_tune = &OEM_sys_set_image_enhance_tune;
1114
1115         devman_plugin_interface_mfld.OEM_sys_image_enhance_info = &OEM_sys_image_enhance_info;
1116
1117         devman_plugin_interface_mfld.OEM_sys_set_display_frame_rate = &OEM_sys_set_display_frame_rate;
1118
1119         /* UART path interfaces */
1120         devman_plugin_interface_mfld.OEM_sys_get_uart_path = &OEM_sys_get_uart_path;
1121         devman_plugin_interface_mfld.OEM_sys_set_uart_path = &OEM_sys_set_uart_path;
1122
1123         /* USB path interfaces */
1124         devman_plugin_interface_mfld.OEM_sys_get_usb_path = &OEM_sys_get_usb_path;
1125         devman_plugin_interface_mfld.OEM_sys_set_usb_path = &OEM_sys_set_usb_path;
1126
1127         /* Vibrator interfaces */
1128         devman_plugin_interface_mfld.OEM_sys_get_haptic_vibetones_level_max = &OEM_sys_get_haptic_motor_level_max;
1129         devman_plugin_interface_mfld.OEM_sys_get_haptic_vibetones_level = &OEM_sys_get_haptic_motor_level;
1130         devman_plugin_interface_mfld.OEM_sys_set_haptic_vibetones_level = &OEM_sys_set_haptic_motor_level;
1131         devman_plugin_interface_mfld.OEM_sys_set_haptic_vibetones_enable = &OEM_sys_set_haptic_motor_enable;
1132         devman_plugin_interface_mfld.OEM_sys_set_haptic_vibetones_oneshot = &OEM_sys_set_haptic_motor_oneshot;
1133
1134         /* Battery interfaces */
1135         devman_plugin_interface_mfld.OEM_sys_get_battery_capacity = &OEM_sys_get_battery_capacity;
1136         devman_plugin_interface_mfld.OEM_sys_get_battery_capacity_raw = &OEM_sys_get_battery_capacity_raw;
1137         devman_plugin_interface_mfld.OEM_sys_get_battery_charge_full = &OEM_sys_get_battery_charge_full;
1138         devman_plugin_interface_mfld.OEM_sys_get_battery_charge_now = &OEM_sys_get_battery_charge_now;
1139         devman_plugin_interface_mfld.OEM_sys_get_battery_present = &OEM_sys_get_battery_present;
1140         devman_plugin_interface_mfld.OEM_sys_get_battery_health = &OEM_sys_get_battery_health;
1141         devman_plugin_interface_mfld.OEM_sys_get_battery_polling_required= &OEM_sys_get_battery_polling_required;
1142         devman_plugin_interface_mfld.OEM_sys_get_battery_support_insuspend_charging = &OEM_sys_get_battery_support_insuspend_charging;
1143
1144         /* Connection interfaces  */
1145         devman_plugin_interface_mfld.OEM_sys_get_jack_charger_online = &OEM_sys_get_jack_charger_online;
1146         devman_plugin_interface_mfld.OEM_sys_get_jack_earjack_online = &OEM_sys_get_jack_earjack_online;
1147         devman_plugin_interface_mfld.OEM_sys_get_jack_earkey_online = &OEM_sys_get_jack_earkey_online;
1148         devman_plugin_interface_mfld.OEM_sys_get_jack_hdmi_online = &OEM_sys_get_jack_hdmi_online;
1149         devman_plugin_interface_mfld.OEM_sys_get_jack_usb_online = &OEM_sys_get_jack_usb_online;
1150         devman_plugin_interface_mfld.OEM_sys_get_jack_cradle_online = &OEM_sys_get_jack_cradle_online;
1151         devman_plugin_interface_mfld.OEM_sys_get_jack_tvout_online = &OEM_sys_get_jack_tvout_online;
1152         devman_plugin_interface_mfld.OEM_sys_get_jack_keyboard_online = &OEM_sys_get_jack_keyboard_online;
1153
1154         devman_plugin_interface_mfld.OEM_sys_get_hdmi_support = &OEM_sys_get_hdmi_support;
1155
1156         /* Torch interfaces */
1157         devman_plugin_interface_mfld.OEM_sys_get_leds_torch_max_brightness = &OEM_sys_get_leds_torch_max_brightness;
1158         devman_plugin_interface_mfld.OEM_sys_get_leds_torch_brightness = &OEM_sys_get_leds_torch_brightness;
1159         devman_plugin_interface_mfld.OEM_sys_set_leds_torch_brightness = &OEM_sys_set_leds_torch_brightness;
1160
1161         /* Power management interfaces */
1162         devman_plugin_interface_mfld.OEM_sys_set_power_state = &OEM_sys_set_power_state;
1163         devman_plugin_interface_mfld.OEM_sys_get_power_wakeup_count = &OEM_sys_get_power_wakeup_count;
1164         devman_plugin_interface_mfld.OEM_sys_set_power_wakeup_count = &OEM_sys_set_power_wakeup_count;
1165
1166         /* OOM interfaces */
1167         devman_plugin_interface_mfld.OEM_sys_get_memnotify_node = &OEM_sys_get_memnotify_node;
1168         devman_plugin_interface_mfld.OEM_sys_get_memnotify_victim_task = &OEM_sys_get_memnotify_victim_task;
1169         devman_plugin_interface_mfld.OEM_sys_set_memnotify_threshold_lv1 = &OEM_sys_set_memnotify_threshold_lv1;
1170         devman_plugin_interface_mfld.OEM_sys_set_memnotify_threshold_lv2 = &OEM_sys_set_memnotify_threshold_lv2;
1171
1172         /* Process monitor interfaces */
1173         devman_plugin_interface_mfld.OEM_sys_get_process_monitor_node = &OEM_sys_get_process_monitor_node;
1174         devman_plugin_interface_mfld.OEM_sys_set_process_monitor_mp_pnp = &OEM_sys_set_process_monitor_mp_pnp;
1175         devman_plugin_interface_mfld.OEM_sys_set_process_monitor_mp_vip = &OEM_sys_set_process_monitor_mp_vip;
1176
1177         /* UART path interfaces */
1178         devman_plugin_interface_mfld.OEM_sys_get_cpufreq_cpuinfo_max_freq = &OEM_sys_get_cpufreq_cpuinfo_max_freq;
1179         devman_plugin_interface_mfld.OEM_sys_get_cpufreq_cpuinfo_min_freq = &OEM_sys_get_cpufreq_cpuinfo_min_freq;
1180         devman_plugin_interface_mfld.OEM_sys_get_cpufreq_scaling_max_freq = &OEM_sys_get_cpufreq_scaling_max_freq;
1181         devman_plugin_interface_mfld.OEM_sys_set_cpufreq_scaling_max_freq = &OEM_sys_set_cpufreq_scaling_max_freq;
1182         devman_plugin_interface_mfld.OEM_sys_get_cpufreq_scaling_min_freq = &OEM_sys_get_cpufreq_scaling_min_freq;
1183         devman_plugin_interface_mfld.OEM_sys_set_cpufreq_scaling_min_freq = &OEM_sys_set_cpufreq_scaling_min_freq;
1184
1185         devman_plugin_interface_mfld.OEM_sys_get_backlight_brightness_by_lux = &OEM_sys_get_backlight_brightness_by_lux;
1186         OEM_sys_display_info(disp_info);
1187         OEM_sys_muic_node_path_info();
1188
1189         return &devman_plugin_interface_mfld;
1190 }