1 #include <kprobe/swap_kprobes.h>
2 #include <linux/backlight.h>
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";
13 static const char * const all_path[] = {
20 all_path_cnt = sizeof(all_path) / sizeof(char *)
25 static int s6e8aa0_check(struct lcd_ops *ops)
29 for (i = 0; i < all_path_cnt; ++i) {
30 int ret = read_val(all_path[i]);
32 if (IS_ERR_VALUE(ret))
39 static unsigned long s6e8aa0_get_parameter(struct lcd_ops *ops,
40 enum lcd_parameter_type type)
43 case LPD_MIN_BRIGHTNESS:
45 case LPD_MAX_BRIGHTNESS:
46 return read_val(path_backlight_max);
48 return read_val(path_backlight);
50 return read_val(path_power);
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);
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)
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);
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)
83 int s6e8aa0_set(struct lcd_ops *ops)
87 ret = swap_register_kretprobe(&set_power_krp);
91 ret = swap_register_kretprobe(&set_backlight_krp);
93 swap_unregister_kretprobe(&set_power_krp);
98 int s6e8aa0_unset(struct lcd_ops *ops)
100 swap_unregister_kretprobe(&set_backlight_krp);
101 swap_unregister_kretprobe(&set_power_krp);
106 static struct lcd_ops s6e8aa0_ops = {
107 .name = "s6e8aa0_panel",
108 .check = s6e8aa0_check,
110 .unset = s6e8aa0_unset,
111 .get = s6e8aa0_get_parameter
114 struct lcd_ops *LCD_MAKE_FNAME(s6e8aa0_panel)(void)
123 /* ============================================================================
125 * ============================================================================
127 static int entry_handler_set_power(struct kretprobe_instance *ri,
128 struct pt_regs *regs)
130 int *power = (int *)ri->data;
132 *power = (int)swap_get_karg(regs, 1);
137 static int ret_handler_set_power(struct kretprobe_instance *ri,
138 struct pt_regs *regs)
140 int ret = regs_return_value(regs);
141 int *power = (int *)ri->data;
143 if (!ret && s6e8aa0_ops.notifier)
144 s6e8aa0_ops.notifier(&s6e8aa0_ops, LAT_POWER,
154 /* ============================================================================
156 * ============================================================================
158 static int entry_handler_set_backlight(struct kretprobe_instance *ri,
159 struct pt_regs *regs)
161 int *brightness = (int *)ri->data;
162 struct backlight_device *bd;
164 bd = (struct backlight_device *)swap_get_karg(regs, 0);
165 *brightness = bd->props.brightness;
170 static int ret_handler_set_backlight(struct kretprobe_instance *ri,
171 struct pt_regs *regs)
173 int ret = regs_return_value(regs);
174 int *brightness = (int *)ri->data;
176 if (!ret && s6e8aa0_ops.notifier)
177 s6e8aa0_ops.notifier(&s6e8aa0_ops, LAT_BRIGHTNESS,
178 (void *)*brightness);