[FEATURE] energy: add support LCD s6e8aa0
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 19 Nov 2013 09:30:04 +0000 (13:30 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 19 Nov 2013 09:30:04 +0000 (13:30 +0400)
Change-Id: I8f9bfef7b1aa68e84a093e0e00c339be059dc1f2
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
energy/Kbuild
energy/lcd/s6e8aa0.c

index 715930b..2ea75da 100644 (file)
@@ -27,8 +27,8 @@ swap_energy-y := energy_module.o \
 ###############################################################################
 # S6E8AA0:
 ifeq ($(CONFIG_LCD_S6E8AA0), y)
-    #swap_energy-y += lcd/s6e8aa0.o
-    #LCD_FUNC_LIST += s6e8aa0
+    swap_energy-y += lcd/s6e8aa0.o
+    LCD_FUNC_LIST += s6e8aa0
 endif
 
 
index 432b74a..e90a4e8 100644 (file)
@@ -1,12 +1,57 @@
 #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                                  ===
  * ============================================================================
@@ -46,42 +91,14 @@ static struct kretprobe set_power_krp = {
        .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",
@@ -90,39 +107,56 @@ static struct kretprobe set_backlight_krp = {
        .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;
 }