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