ARM: tizen_tm1_defconfig: Enable missing features related with CGROUPS
[profile/mobile/platform/kernel/linux-3.10-sc7730.git] / kernel / swap / energy / lcd / s6e8aa0.c
1 #include <kprobe/swap_kprobes.h>
2 #include "lcd_base.h"
3
4
5 static const char path_backlight[] =
6         "/sys/class/backlight/s6e8aa0-bl/brightness";
7 static const char path_backlight_min[] =
8         "/sys/class/backlight/s6e8aa0-bl/min_brightness";
9 static const char path_backlight_max[] =
10         "/sys/class/backlight/s6e8aa0-bl/max_brightness";
11 static const char path_power[] =
12         "/sys/class/lcd/s6e8aa0/lcd_power";
13
14 static const char * const all_path[] = {
15         path_backlight,
16         path_backlight_min,
17         path_backlight_max,
18         path_power
19 };
20
21 enum {
22         all_path_cnt = sizeof(all_path) / sizeof(char *)
23 };
24
25
26
27 static int s6e8aa0_check(struct lcd_ops *ops)
28 {
29         int i;
30
31         for (i = 0; i < all_path_cnt; ++i) {
32                 int ret = read_val(all_path[i]);
33
34                 if (IS_ERR_VALUE(ret))
35                         return 0;
36         }
37
38         return 1;
39 }
40
41 static unsigned long s6e8aa0_get_parameter(struct lcd_ops *ops,
42                                            enum lcd_parameter_type type)
43 {
44         switch (type) {
45         case LPD_MIN_BRIGHTNESS:
46                 return read_val(path_backlight_min);
47         case LPD_MAX_BRIGHTNESS:
48                 return read_val(path_backlight_max);
49         case LPD_BRIGHTNESS:
50                 return read_val(path_backlight);
51         case LPD_POWER:
52                 return read_val(path_power);
53         default:
54                 return -EINVAL;
55         }
56 }
57
58
59
60 static int entry_handler_set_power(struct kretprobe_instance *ri,
61                                    struct pt_regs *regs);
62 static int ret_handler_set_power(struct kretprobe_instance *ri,
63                                  struct pt_regs *regs);
64
65 static struct kretprobe set_power_krp = {
66         .kp.symbol_name = "s6e8aa0_set_power",
67         .entry_handler = entry_handler_set_power,
68         .handler = ret_handler_set_power,
69         .data_size = sizeof(int)
70 };
71
72
73 static int entry_handler_set_backlight(struct kretprobe_instance *ri,
74                                        struct pt_regs *regs);
75 static int ret_handler_set_backlight(struct kretprobe_instance *ri,
76                                      struct pt_regs *regs);
77
78 static struct kretprobe set_backlight_krp = {
79         .kp.symbol_name = "s6e8aa0_gamma_ctrl",
80         .entry_handler = entry_handler_set_backlight,
81         .handler = ret_handler_set_backlight,
82         .data_size = sizeof(int)
83 };
84
85 int s6e8aa0_set(struct lcd_ops *ops)
86 {
87         int ret;
88
89         ret = swap_register_kretprobe(&set_power_krp);
90         if (ret)
91                 return ret;
92
93         ret = swap_register_kretprobe(&set_backlight_krp);
94         if (ret)
95                 swap_unregister_kretprobe(&set_power_krp);
96
97         return ret;
98 }
99
100 int s6e8aa0_unset(struct lcd_ops *ops)
101 {
102         swap_unregister_kretprobe(&set_backlight_krp);
103         swap_unregister_kretprobe(&set_power_krp);
104
105         return 0;
106 }
107
108 static struct lcd_ops s6e8aa0_ops = {
109         .name = "s6e8aa0",
110         .check = s6e8aa0_check,
111         .set = s6e8aa0_set,
112         .unset = s6e8aa0_unset,
113         .get = s6e8aa0_get_parameter
114 };
115
116 struct lcd_ops *LCD_MAKE_FNAME(s6e8aa0)(void)
117 {
118         return &s6e8aa0_ops;
119 }
120
121
122
123
124
125 /* ============================================================================
126  * ===                               POWER                                  ===
127  * ============================================================================
128  */
129 static int entry_handler_set_power(struct kretprobe_instance *ri,
130                                    struct pt_regs *regs)
131 {
132         int *power = (int *)ri->data;
133
134         *power = (int)swap_get_karg(regs, 1);
135
136         return 0;
137 }
138
139 static int ret_handler_set_power(struct kretprobe_instance *ri,
140                                  struct pt_regs *regs)
141 {
142         int ret = regs_return_value(regs);
143         int *power = (int *)ri->data;
144
145         if (!ret && s6e8aa0_ops.notifier)
146                 s6e8aa0_ops.notifier(&s6e8aa0_ops, LAT_POWER, (void *)*power);
147
148         return 0;
149 }
150
151
152
153
154
155 /* ============================================================================
156  * ===                              BACKLIGHT                               ===
157  * ============================================================================
158  */
159 static int entry_handler_set_backlight(struct kretprobe_instance *ri,
160                                        struct pt_regs *regs)
161 {
162         int *brightness = (int *)ri->data;
163         *brightness = (int)swap_get_karg(regs, 1);
164
165         return 0;
166 }
167
168 static int ret_handler_set_backlight(struct kretprobe_instance *ri,
169                                      struct pt_regs *regs)
170 {
171         int ret = regs_return_value(regs);
172         int *brightness = (int *)ri->data;
173
174         if (!ret && s6e8aa0_ops.notifier)
175                 s6e8aa0_ops.notifier(&s6e8aa0_ops, LAT_BRIGHTNESS,
176                                      (void *)*brightness);
177
178         return 0;
179 }