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