#include <kprobe/dbi_kprobes.h>
#include "lcd_base.h"
-static struct lcd_ops_set *ops_s = NULL;
+
+static const char path_backlight[] = "/sys/class/backlight/s6e8aa0-bl/brightness";
+static const char path_backlight_min[] = "/sys/class/backlight/s6e8aa0-bl/min_brightness";
+static const char path_backlight_max[] = "/sys/class/backlight/s6e8aa0-bl/max_brightness";
+
+static const char *all_path[] = {
+ path_backlight,
+ path_backlight_min,
+ path_backlight_max
+};
+
+enum {
+ all_path_cnt = sizeof(all_path) / sizeof(char *)
+};
+
+
+
+static int s6e8aa0_check(struct lcd_ops *ops)
+{
+ int i;
+
+ for (i = 0; i < all_path_cnt; ++i) {
+ int ret = read_val(all_path[i]);
+
+ if (IS_ERR_VALUE(ret))
+ return 0;
+ }
+
+ return 1;
+}
+
+static unsigned long s6e8aa0_get_parameter(struct lcd_ops *ops,
+ enum lcd_parameter_type type)
+{
+ switch (type) {
+ case LPD_MIN_BRIGHTNESS:
+ return read_val(path_backlight_min);
+ case LPD_MAX_BRIGHTNESS:
+ return read_val(path_backlight_max);
+ case LPD_BRIGHTNESS:
+ return read_val(path_backlight);
+ }
+
+ return -EINVAL;
+}
+#if 0 /* is not supported */
/* ============================================================================
* === POWER ===
* ============================================================================
.handler = ret_handler_set_power,
.data_size = sizeof(int)
};
+#endif
-
-
-/* ============================================================================
- * === BACKLIGHT ===
- * ============================================================================
- */
-static int get_backlight(void)
-{
- const char *backlight_path = "/sys/class/backlight/s6e8aa0-bl/brightness";
-
- return read_val(backlight_path);
-}
-
static int entry_handler_set_backlight(struct kretprobe_instance *ri,
- struct pt_regs *regs)
-{
- int *brightness = (int *)ri->data;
- *brightness = (int)regs->ARM_r1;
-
- return 0;
-}
-
+ struct pt_regs *regs);
static int ret_handler_set_backlight(struct kretprobe_instance *ri,
- struct pt_regs *regs)
-{
- int ret = regs_return_value(regs);
- int *brightness = (int *)ri->data;
-
- if (!ret && ops_s && ops_s->set_backlight)
- ops_s->set_backlight(*brightness);
-
- return 0;
-}
+ struct pt_regs *regs);
static struct kretprobe set_backlight_krp = {
.kp.symbol_name = "s6e8aa0_gamma_ctrl",
.data_size = sizeof(int)
};
+int s6e8aa0_set(struct lcd_ops *ops)
+{
+ return dbi_register_kretprobe(&set_backlight_krp);
+}
+int s6e8aa0_unset(struct lcd_ops *ops)
+{
+ dbi_unregister_kretprobe(&set_backlight_krp);
+ return 0;
+}
+static struct lcd_ops s6e8aa0_ops = {
+ .name = "s6e8aa0",
+ .check = s6e8aa0_check,
+ .set = s6e8aa0_set,
+ .unset = s6e8aa0_unset,
+ .get = s6e8aa0_get_parameter
+};
-
-int lcd_mach_init(struct lcd_ops_set *ops_set, struct lcd_ops_get *ops_get)
+struct lcd_ops *LCD_MAKE_FNAME(s6e8aa0)(void)
{
- int ret;
+ return &s6e8aa0_ops;
+}
- ret = dbi_register_kretprobe(&set_power_krp);
- if (ret) {
- goto unregister_power_krp;
- }
- ret = dbi_register_kretprobe(&set_backlight_krp);
- if (ret) {
- return ret;
- }
- ops_s = ops_set;
- ops_get->get_power = get_power;
- ops_get->get_backlight = get_backlight;
- return 0;
-unregister_power_krp:
- dbi_unregister_kretprobe(&set_power_krp);
+/* ============================================================================
+ * === BACKLIGHT ===
+ * ============================================================================
+ */
+static int entry_handler_set_backlight(struct kretprobe_instance *ri,
+ struct pt_regs *regs)
+{
+ int *brightness = (int *)ri->data;
+ *brightness = (int)swap_get_karg(regs, 1);
- return ret;
+ return 0;
}
-void lcd_mach_exit(void)
+static int ret_handler_set_backlight(struct kretprobe_instance *ri,
+ struct pt_regs *regs)
{
- dbi_unregister_kretprobe(&set_backlight_krp);
- dbi_unregister_kretprobe(&set_power_krp);
- ops_s = NULL;
+ int ret = regs_return_value(regs);
+ int *brightness = (int *)ri->data;
+
+ if (!ret && s6e8aa0_ops.notifier)
+ s6e8aa0_ops.notifier(&s6e8aa0_ops, LAT_BRIGHTNESS,
+ (void *)*brightness);
+
+ return 0;
}