[IMPROVE] add support CONFIG_DISPLAY_PANEL_S6E8AA0 46/14046/5
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 20 Dec 2013 13:49:59 +0000 (17:49 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 17 Jan 2014 10:49:07 +0000 (14:49 +0400)
Change-Id: I0fa8b70f57facf1e775aecd68da9cd7c5c2c9447
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
energy/Kbuild
energy/lcd/s6e8aa0_panel.c [new file with mode: 0644]

index 2ea75da..80d23c9 100644 (file)
@@ -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 (file)
index 0000000..1b5abfa
--- /dev/null
@@ -0,0 +1,178 @@
+#include <kprobe/dbi_kprobes.h>
+#include <linux/backlight.h>
+#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;
+}