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