1 #include <kprobe/dbi_kprobes.h>
2 #include <linux/backlight.h>
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";
10 static const char *all_path[] = {
17 all_path_cnt = sizeof(all_path) / sizeof(char *)
22 static int s6e8aa0_check(struct lcd_ops *ops)
26 for (i = 0; i < all_path_cnt; ++i) {
27 int ret = read_val(all_path[i]);
29 if (IS_ERR_VALUE(ret))
36 static unsigned long s6e8aa0_get_parameter(struct lcd_ops *ops,
37 enum lcd_parameter_type type)
40 case LPD_MIN_BRIGHTNESS:
42 case LPD_MAX_BRIGHTNESS:
43 return read_val(path_backlight_max);
45 return read_val(path_backlight);
47 return read_val(path_power);
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);
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)
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);
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)
80 int s6e8aa0_set(struct lcd_ops *ops)
84 ret = dbi_register_kretprobe(&set_power_krp);
88 ret = dbi_register_kretprobe(&set_backlight_krp);
90 dbi_unregister_kretprobe(&set_power_krp);
95 int s6e8aa0_unset(struct lcd_ops *ops)
97 dbi_unregister_kretprobe(&set_backlight_krp);
98 dbi_unregister_kretprobe(&set_power_krp);
103 static struct lcd_ops s6e8aa0_ops = {
104 .name = "s6e8aa0_panel",
105 .check = s6e8aa0_check,
107 .unset = s6e8aa0_unset,
108 .get = s6e8aa0_get_parameter
111 struct lcd_ops *LCD_MAKE_FNAME(s6e8aa0_panel)(void)
120 /* ============================================================================
122 * ============================================================================
124 static int entry_handler_set_power(struct kretprobe_instance *ri,
125 struct pt_regs *regs)
127 int *power = (int *)ri->data;
129 *power = (int)swap_get_karg(regs, 1);
134 static int ret_handler_set_power(struct kretprobe_instance *ri,
135 struct pt_regs *regs)
137 int ret = regs_return_value(regs);
138 int *power = (int *)ri->data;
140 if (!ret && s6e8aa0_ops.notifier)
141 s6e8aa0_ops.notifier(&s6e8aa0_ops, LAT_POWER,
151 /* ============================================================================
153 * ============================================================================
155 static int entry_handler_set_backlight(struct kretprobe_instance *ri,
156 struct pt_regs *regs)
158 int *brightness = (int *)ri->data;
159 struct backlight_device *bd;
161 bd = (struct backlight_device *)swap_get_karg(regs, 0);
162 *brightness = bd->props.brightness;
167 static int ret_handler_set_backlight(struct kretprobe_instance *ri,
168 struct pt_regs *regs)
170 int ret = regs_return_value(regs);
171 int *brightness = (int *)ri->data;
173 if (!ret && s6e8aa0_ops.notifier)
174 s6e8aa0_ops.notifier(&s6e8aa0_ops, LAT_BRIGHTNESS,
175 (void *)*brightness);