From e44e51adcdb067ef85bc200813b50a6755529e94 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Fri, 20 Dec 2013 17:49:59 +0400 Subject: [PATCH] [IMPROVE] add support CONFIG_DISPLAY_PANEL_S6E8AA0 Change-Id: I0fa8b70f57facf1e775aecd68da9cd7c5c2c9447 Signed-off-by: Vyacheslav Cherkashin --- energy/Kbuild | 7 ++ energy/lcd/s6e8aa0_panel.c | 178 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 energy/lcd/s6e8aa0_panel.c diff --git a/energy/Kbuild b/energy/Kbuild index 2ea75da..80d23c9 100644 --- a/energy/Kbuild +++ b/energy/Kbuild @@ -32,6 +32,13 @@ ifeq ($(CONFIG_LCD_S6E8AA0), y) endif +# PANEL_S6E8AA0: +ifeq ($(CONFIG_DISPLAY_PANEL_S6E8AA0), y) + swap_energy-y += lcd/s6e8aa0_panel.o + LCD_FUNC_LIST += s6e8aa0_panel +endif + + # MARU: ifeq ($(CONFIG_MARU_BACKLIGHT), y) swap_energy-y += lcd/maru.o diff --git a/energy/lcd/s6e8aa0_panel.c b/energy/lcd/s6e8aa0_panel.c new file mode 100644 index 0000000..1b5abfa --- /dev/null +++ b/energy/lcd/s6e8aa0_panel.c @@ -0,0 +1,178 @@ +#include +#include +#include "lcd_base.h" + + +static const char path_backlight[] = "/sys/class/backlight/s6e8aa0-bl/brightness"; +static const char path_backlight_max[] = "/sys/class/backlight/s6e8aa0-bl/max_brightness"; +static const char path_power[] = "/sys/class/lcd/s6e8aa0/lcd_power"; + +static const char *all_path[] = { + path_backlight, + path_backlight_max, + path_power +}; + +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 0; + case LPD_MAX_BRIGHTNESS: + return read_val(path_backlight_max); + case LPD_BRIGHTNESS: + return read_val(path_backlight); + case LPD_POWER: + return read_val(path_power); + } + + return -EINVAL; +} + + + +static int entry_handler_set_power(struct kretprobe_instance *ri, + struct pt_regs *regs); +static int ret_handler_set_power(struct kretprobe_instance *ri, + struct pt_regs *regs); + +static struct kretprobe set_power_krp = { + .kp.symbol_name = "s6e8aa0_set_power", + .entry_handler = entry_handler_set_power, + .handler = ret_handler_set_power, + .data_size = sizeof(int) +}; + + +static int entry_handler_set_backlight(struct kretprobe_instance *ri, + struct pt_regs *regs); +static int ret_handler_set_backlight(struct kretprobe_instance *ri, + struct pt_regs *regs); + +static struct kretprobe set_backlight_krp = { + .kp.symbol_name = "s6e8aa0_update_status", + .entry_handler = entry_handler_set_backlight, + .handler = ret_handler_set_backlight, + .data_size = sizeof(int) +}; + +int s6e8aa0_set(struct lcd_ops *ops) +{ + int ret; + + ret = dbi_register_kretprobe(&set_power_krp); + if (ret) + return ret; + + ret = dbi_register_kretprobe(&set_backlight_krp); + if (ret) + dbi_unregister_kretprobe(&set_power_krp); + + return ret; +} + +int s6e8aa0_unset(struct lcd_ops *ops) +{ + dbi_unregister_kretprobe(&set_backlight_krp); + dbi_unregister_kretprobe(&set_power_krp); + + return 0; +} + +static struct lcd_ops s6e8aa0_ops = { + .name = "s6e8aa0_panel", + .check = s6e8aa0_check, + .set = s6e8aa0_set, + .unset = s6e8aa0_unset, + .get = s6e8aa0_get_parameter +}; + +struct lcd_ops *LCD_MAKE_FNAME(s6e8aa0_panel)(void) +{ + return &s6e8aa0_ops; +} + + + + + +/* ============================================================================ + * === POWER === + * ============================================================================ + */ +static int entry_handler_set_power(struct kretprobe_instance *ri, + struct pt_regs *regs) +{ + int *power = (int *)ri->data; + + *power = (int)swap_get_karg(regs, 1); + + return 0; +} + +static int ret_handler_set_power(struct kretprobe_instance *ri, + struct pt_regs *regs) +{ + int ret = regs_return_value(regs); + int *power = (int *)ri->data; + + if (!ret && s6e8aa0_ops.notifier) + s6e8aa0_ops.notifier(&s6e8aa0_ops, LAT_POWER, + (void *)*power); + + return 0; +} + + + + + +/* ============================================================================ + * === BACKLIGHT === + * ============================================================================ + */ +static int entry_handler_set_backlight(struct kretprobe_instance *ri, + struct pt_regs *regs) +{ + int *brightness = (int *)ri->data; + struct backlight_device *bd; + + bd = (struct backlight_device *)swap_get_karg(regs, 0); + *brightness = bd->props.brightness; + + return 0; +} + +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 && s6e8aa0_ops.notifier) + s6e8aa0_ops.notifier(&s6e8aa0_ops, LAT_BRIGHTNESS, + (void *)*brightness); + + return 0; +} -- 2.7.4