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