deviced: Apply display HAL structure 28/36428/2
authorJiyoung Yun <jy910.yun@samsung.com>
Fri, 6 Mar 2015 09:04:05 +0000 (18:04 +0900)
committerJiyoung Yun <jy910.yun@samsung.com>
Tue, 10 Mar 2015 02:02:25 +0000 (11:02 +0900)
Deviced will control display power using display HAL.
It also supports to control display brightness.

Change-Id: Ie15c0abe434610dfe60bbda7949ba6e5f71d174f
Signed-off-by: Jiyoung Yun <jy910.yun@samsung.com>
CMakeLists.txt
src/display/auto-brightness.c
src/display/core.c
src/display/device-interface.c
src/display/device-interface.h
src/display/display-dbus.c

index 304e348..d613d2f 100755 (executable)
@@ -159,9 +159,6 @@ ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
 ADD_DEFINITIONS("-DFACTORYFS=\"$ENV{FACTORYFS}\"")
 ADD_DEFINITIONS("-DLIBPATH=\"${LIB_INSTALL_DIR}\"")
 ADD_DEFINITIONS("-DENABLE_KEY_FILTER")
-IF(X11_SUPPORT)
-ADD_DEFINITIONS("-DENABLE_X_LCD_ONOFF")
-ENDIF(X11_SUPPORT)
 ADD_DEFINITIONS("-DENABLE_DEVICED_DLOG")
 ADD_DEFINITIONS("-DENABLE_LIBDEVICED_DLOG")
 ADD_DEFINITIONS("-DENABLE_PM_LOG")
index 63b245e..6611d06 100644 (file)
@@ -118,11 +118,10 @@ static bool update_working_position(void)
 
 static int get_siop_brightness(int value)
 {
-       int cmd, ret, brt;
+       int brt;
 
-       cmd = DISP_CMD(PROP_DISPLAY_MAX_BRIGHTNESS, DEFAULT_DISPLAY);
-       ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &brt);
-       if (ret >= 0 && value > brt)
+       brt = DEFAULT_DISPLAY_MAX_BRIGHTNESS;
+       if (value > brt)
                return brt;
 
        return value;
@@ -131,10 +130,10 @@ static int get_siop_brightness(int value)
 static void alc_set_brightness(int setting, int value, int lux)
 {
        static int old;
-       int position, cmd, tmp_value = 0;
+       int position, tmp_value = 0, ret;
 
-       cmd = DISP_CMD(PROP_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY);
-       if (device_get_property(DEVICE_TYPE_DISPLAY, cmd, &tmp_value) < 0) {
+       ret = backlight_ops.get_brightness(&tmp_value);
+       if (ret < 0) {
                _E("Fail to get display brightness!");
                return;
        }
index 19557d2..c7cdd94 100644 (file)
@@ -2319,6 +2319,16 @@ static int display_load_config(struct parse_result *result, void *user_data)
  * Power manager Main
  *
  */
+static int display_probe(void *data)
+{
+       /**
+        * load display service
+        * if there is no display shared library,
+        * deviced does not provide any method and function of display.
+        */
+       return display_service_load();
+}
+
 static void display_init(void *data)
 {
        int ret, i;
@@ -2448,6 +2458,9 @@ static void display_exit(void *data)
        exit_lcd_operation();
        free_lock_info_list();
 
+       /* free display service */
+       display_service_free();
+
        _I("Stop power manager");
 }
 
@@ -2504,6 +2517,7 @@ static int display_status(void)
 static const struct device_ops display_device_ops = {
        .priority = DEVICE_PRIORITY_HIGH,
        .name     = "display",
+       .probe    = display_probe,
        .init     = display_init,
        .exit     = display_exit,
        .start    = display_start,
index 7c9575d..17bd707 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * deviced
  *
- * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2012 - 2015 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the License);
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,9 @@
 #include <unistd.h>
 #include <limits.h>
 #include <math.h>
+#include <assert.h>
+#include <errno.h>
+#include <hw/display.h>
 
 #include "core/log.h"
 #include "core/devices.h"
@@ -79,20 +82,30 @@ static bool custom_status = false;
 static int custom_brightness = 0;
 static int force_brightness = 0;
 
+static struct display_device *display_dev;
+
 static int _bl_onoff(PMSys *p, int on)
 {
-       int cmd;
+       if (!display_dev || !display_dev->set_state) {
+               _E("there is no display device");
+               return -ENOENT;
+       }
 
-       cmd = DISP_CMD(PROP_DISPLAY_ONOFF, DEFAULT_DISPLAY);
-       return device_set_property(DEVICE_TYPE_DISPLAY, cmd, on);
+       return display_dev->set_state(on);
 }
 
 static int _bl_brt(PMSys *p, int brightness, int delay)
 {
        int ret = -1;
-       int cmd;
        int prev;
 
+       if (!display_dev ||
+           !display_dev->get_brightness ||
+           !display_dev->set_brightness) {
+               _E("there is no display device");
+               return -ENOENT;
+       }
+
        if (delay > 0)
                usleep(delay);
 
@@ -102,8 +115,7 @@ static int _bl_brt(PMSys *p, int brightness, int delay)
                brightness = force_brightness;
        }
 
-       cmd = DISP_CMD(PROP_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY);
-       ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &prev);
+       ret = display_dev->get_brightness(&prev);
 
        /* Update new brightness to vconf */
        if (!ret && (brightness != prev)) {
@@ -111,7 +123,7 @@ static int _bl_brt(PMSys *p, int brightness, int delay)
        }
 
        /* Update device brightness */
-       ret = device_set_property(DEVICE_TYPE_DISPLAY, cmd, brightness);
+       ret = display_dev->set_brightness(brightness);
 
        _I("set brightness %d, %d", brightness, ret);
 
@@ -148,17 +160,19 @@ static int _sys_get_power_lock_support(PMSys *p)
 
 static int _sys_get_lcd_power(PMSys *p)
 {
-       int value = -1;
-       int ret = -1;
-       int cmd;
+       enum display_state state;
+       int ret;
 
-       cmd = DISP_CMD(PROP_DISPLAY_ONOFF, DEFAULT_DISPLAY);
-       ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &value);
+       if (!display_dev || !display_dev->get_state) {
+               _E("there is no display device");
+               return -ENOENT;
+       }
 
-       if (ret < 0 || value < 0)
-               return -1;
+       ret = display_dev->get_state(&state);
+       if (ret < 0)
+               return ret;
 
-       return value;
+       return state;
 }
 
 static void _init_bldev(PMSys *p, unsigned int flags)
@@ -291,15 +305,23 @@ void change_brightness(int start, int end, int step)
 {
        int diff, val;
        int ret = -1;
-       int cmd;
        int prev;
 
+       if (!display_dev ||
+           !display_dev->get_brightness) {
+               _E("there is no display device");
+               return;
+       }
+
        if ((pm_status_flag & PWRSV_FLAG) &&
            !(pm_status_flag & BRTCH_FLAG))
                return;
 
-       cmd = DISP_CMD(PROP_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY);
-       ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &prev);
+       ret = display_dev->get_brightness(&prev);
+       if (ret < 0) {
+               _E("fail to get brightness : %d", ret);
+               return;
+       }
 
        if (prev == end)
                return;
@@ -336,8 +358,8 @@ static int backlight_on(enum device_flags flags)
                return -1;
 
        for (i = 0; i < PM_LCD_RETRY_CNT; i++) {
-               ret = pmsys->bl_onoff(pmsys, STATUS_ON);
-               if (get_lcd_power() == PM_LCD_POWER_ON) {
+               ret = pmsys->bl_onoff(pmsys, DISPLAY_ON);
+               if (get_lcd_power() == DISPLAY_ON) {
 #ifdef ENABLE_PM_LOG
                        pm_history_save(PM_LOG_LCD_ON, pm_cur_state);
 #endif
@@ -381,8 +403,8 @@ static int backlight_off(enum device_flags flags)
                if (x_dpms_enable == false)
 #endif
                        usleep(30000);
-               ret = pmsys->bl_onoff(pmsys, STATUS_OFF);
-               if (get_lcd_power() == PM_LCD_POWER_OFF) {
+               ret = pmsys->bl_onoff(pmsys, DISPLAY_OFF);
+               if (get_lcd_power() == DISPLAY_OFF) {
 #ifdef ENABLE_PM_LOG
                        pm_history_save(PM_LOG_LCD_OFF, pm_cur_state);
 #endif
@@ -430,10 +452,15 @@ static bool get_custom_status(void)
 
 static int save_custom_brightness(void)
 {
-       int cmd, ret, brightness;
+       int ret, brightness;
+
+       if (!display_dev ||
+           !display_dev->get_brightness) {
+               _E("there is no display device");
+               return -ENOENT;
+       }
 
-       cmd = DISP_CMD(PROP_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY);
-       ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &brightness);
+       ret = display_dev->get_brightness(&brightness);
 
        custom_brightness = brightness;
 
@@ -490,9 +517,9 @@ static int backlight_standby(int force)
        if (!pmsys || !pmsys->bl_onoff)
                return -1;
 
-       if ((get_lcd_power() == PM_LCD_POWER_ON) || force) {
+       if ((get_lcd_power() == DISPLAY_ON) || force) {
                _I("LCD standby");
-               ret = pmsys->bl_onoff(pmsys, STATUS_STANDBY);
+               ret = pmsys->bl_onoff(pmsys, DISPLAY_STANDBY);
        }
 
        return ret;
@@ -518,6 +545,26 @@ static int check_wakeup_src(void)
        return EVENT_DEVICE;
 }
 
+static int set_brightness(int val)
+{
+       if (!display_dev || !display_dev->set_brightness) {
+               _E("there is no display device");
+               return -ENOENT;
+       }
+
+       return display_dev->set_brightness(val);
+}
+
+static int get_brightness(int *val)
+{
+       if (!display_dev || !display_dev->get_brightness) {
+               _E("there is no display device");
+               return -ENOENT;
+       }
+
+       return display_dev->get_brightness(val);
+}
+
 void _init_ops(void)
 {
        backlight_ops.off = backlight_off;
@@ -532,6 +579,8 @@ void _init_ops(void)
        backlight_ops.save_custom_brightness = save_custom_brightness;
        backlight_ops.custom_update = custom_backlight_update;
        backlight_ops.set_force_brightness = set_force_brightness;
+       backlight_ops.set_brightness = set_brightness;
+       backlight_ops.get_brightness = get_brightness;
 
        power_ops.suspend = system_suspend;
        power_ops.pre_suspend = system_pre_suspend;
@@ -542,6 +591,49 @@ void _init_ops(void)
        power_ops.check_wakeup_src = check_wakeup_src;
 }
 
+int display_service_load(void)
+{
+       struct hw_info *info;
+       int r;
+
+       r = hw_get_info(DISPLAY_HARDWARE_DEVICE_ID,
+                       (const struct hw_info **)&info);
+       if (r < 0) {
+               _E("fail to load display shared library : %d", r);
+               return -ENOENT;
+       }
+
+       if (!info->open) {
+               _E("fail to open display device : open(NULL)");
+               return -EPERM;
+       }
+
+       r = info->open(info, NULL, (struct hw_common **)&display_dev);
+       if (r < 0) {
+               _E("fail to get display device structure : %d", r);
+               return -EPERM;
+       }
+
+       _D("display device structure load success");
+       return 0;
+}
+
+int display_service_free(void)
+{
+       struct hw_info *info;
+
+       if (!display_dev)
+               return -ENOENT;
+
+       info = display_dev->common.info;
+
+       assert(info);
+
+       info->close((struct hw_common *)display_dev);
+
+       return 0;
+}
+
 int init_sysfs(unsigned int flags)
 {
        int ret;
index 59191c3..01f44ef 100644 (file)
 #define PM_DEFAULT_BRIGHTNESS  60
 
 #define PM_LCD_POWER_ON                0
-#define PM_LCD_POWER_OFF       4
+#define PM_LCD_POWER_OFF       3
 
 #define PM_LCD_RETRY_CNT       3
-#define STATUS_STANDBY         (STATUS_ON + 1)
 
 #define DISP_INDEX_SHIFT       16
 #define DISP_CMD(prop, index)  ((index << DISP_INDEX_SHIFT) | prop)
 
+#define DEFAULT_DISPLAY_COUNT           1
+#define DEFAULT_DISPLAY_MAX_BRIGHTNESS  100
+
 /*
  * Event type enumeration
  */
@@ -54,8 +56,10 @@ enum {
        EVENT_END,
 };
 
-extern int init_sysfs(unsigned int);
-extern int exit_sysfs(void);
+int init_sysfs(unsigned int);
+int exit_sysfs(void);
+int display_service_load(void);
+int display_service_free(void);
 
 struct _backlight_ops {
        int (*off)(enum device_flags);
@@ -70,6 +74,8 @@ struct _backlight_ops {
        int (*save_custom_brightness)(void);
        int (*custom_update)(void);
        int (*set_force_brightness)(int level);
+       int (*set_brightness)(int val);
+       int (*get_brightness)(int *val);
 };
 
 struct _power_ops {
index 2068e67..fedddda 100644 (file)
@@ -330,12 +330,9 @@ static DBusMessage *edbus_getdisplaycount(E_DBus_Object *obj, DBusMessage *msg)
 {
        DBusMessageIter iter;
        DBusMessage *reply;
-       int cmd, cnt, ret;
+       int ret;
 
-       cmd = DISP_CMD(PROP_DISPLAY_DISPLAY_COUNT, DEFAULT_DISPLAY);
-       ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &cnt);
-       if (ret >= 0)
-               ret = cnt;
+       ret = DEFAULT_DISPLAY_COUNT;
 
        reply = dbus_message_new_method_return(msg);
        dbus_message_iter_init_append(reply, &iter);
@@ -347,12 +344,9 @@ static DBusMessage *edbus_getmaxbrightness(E_DBus_Object *obj, DBusMessage *msg)
 {
        DBusMessageIter iter;
        DBusMessage *reply;
-       int cmd, brt, ret;
+       int ret;
 
-       cmd = DISP_CMD(PROP_DISPLAY_MAX_BRIGHTNESS, DEFAULT_DISPLAY);
-       ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &brt);
-       if (ret >= 0)
-               ret = brt;
+       ret = DEFAULT_DISPLAY_MAX_BRIGHTNESS;
 
        reply = dbus_message_new_method_return(msg);
        dbus_message_iter_init_append(reply, &iter);
@@ -364,13 +358,9 @@ static DBusMessage *edbus_setmaxbrightness(E_DBus_Object *obj, DBusMessage *msg)
 {
        DBusMessageIter iter;
        DBusMessage *reply;
-       int cmd, brt, ret;
-
-       dbus_message_iter_init(msg, &iter);
-       dbus_message_iter_get_basic(&iter, &brt);
+       int ret;
 
-       cmd = DISP_CMD(PROP_DISPLAY_MAX_BRIGHTNESS, DEFAULT_DISPLAY);
-       ret = device_set_property(DEVICE_TYPE_DISPLAY, cmd, brt);
+       ret = -ENOTSUP;
 
        reply = dbus_message_new_method_return(msg);
        dbus_message_iter_init_append(reply, &iter);
@@ -382,10 +372,9 @@ static DBusMessage *edbus_getbrightness(E_DBus_Object *obj, DBusMessage *msg)
 {
        DBusMessageIter iter;
        DBusMessage *reply;
-       int cmd, brt, ret;
+       int brt, ret;
 
-       cmd = DISP_CMD(PROP_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY);
-       ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &brt);
+       ret = backlight_ops.get_brightness(&brt);
        if (ret >= 0)
                ret = brt;
 
@@ -401,7 +390,7 @@ static DBusMessage *edbus_setbrightness(E_DBus_Object *obj, DBusMessage *msg)
 {
        DBusMessageIter iter;
        DBusMessage *reply;
-       int cmd, brt, autobrt, ret, caps;
+       int brt, autobrt, ret, caps;
 
        caps = display_get_caps(DISPLAY_ACTOR_API);
 
@@ -431,8 +420,7 @@ static DBusMessage *edbus_setbrightness(E_DBus_Object *obj, DBusMessage *msg)
                goto error;
        }
 
-       cmd = DISP_CMD(PROP_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY);
-       ret = device_set_property(DEVICE_TYPE_DISPLAY, cmd, brt);
+       ret = backlight_ops.set_brightness(brt);
        if (ret < 0)
                goto error;
        if (vconf_set_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, brt) != 0)
@@ -454,7 +442,7 @@ static DBusMessage *edbus_holdbrightness(E_DBus_Object *obj, DBusMessage *msg)
 {
        DBusMessageIter iter;
        DBusMessage *reply;
-       int cmd, brt, autobrt, ret, caps;
+       int brt, autobrt, ret, caps;
 
        caps = display_get_caps(DISPLAY_ACTOR_API);
 
@@ -480,8 +468,7 @@ static DBusMessage *edbus_holdbrightness(E_DBus_Object *obj, DBusMessage *msg)
 
        vconf_set_int(VCONFKEY_PM_CUSTOM_BRIGHTNESS_STATUS, VCONFKEY_PM_CUSTOM_BRIGHTNESS_ON);
 
-       cmd = DISP_CMD(PROP_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY);
-       ret = device_set_property(DEVICE_TYPE_DISPLAY, cmd, brt);
+       ret = backlight_ops.set_brightness(brt);
        if (ret < 0)
                goto error;
 
@@ -507,7 +494,7 @@ static DBusMessage *edbus_releasebrightness(E_DBus_Object *obj, DBusMessage *msg
 {
        DBusMessageIter iter;
        DBusMessage *reply;
-       int cmd, bat, charger, changed, setting, brt, autobrt, ret = 0;
+       int bat, charger, changed, setting, brt, autobrt, ret = 0;
 
        if (vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &bat) != 0) {
                _E("Failed to get VCONFKEY_SYSMAN_BATTERY_STATUS_LOW value");
@@ -541,8 +528,7 @@ static DBusMessage *edbus_releasebrightness(E_DBus_Object *obj, DBusMessage *msg
 
        vconf_set_int(VCONFKEY_PM_CUSTOM_BRIGHTNESS_STATUS, VCONFKEY_PM_CUSTOM_BRIGHTNESS_OFF);
 
-       cmd = DISP_CMD(PROP_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY);
-       ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &brt);
+       ret = backlight_ops.get_brightness(&brt);
        if (ret < 0)
                brt = ret;
 
@@ -551,14 +537,14 @@ static DBusMessage *edbus_releasebrightness(E_DBus_Object *obj, DBusMessage *msg
            charger == VCONFKEY_SYSMAN_CHARGER_DISCONNECTED && !changed) {
                _D("batt warning low : brightness is not changed!");
                if (brt != 0) {
-                       device_set_property(DEVICE_TYPE_DISPLAY, PROP_DISPLAY_BRIGHTNESS, 0);
+                       backlight_ops.set_brightness(0);
                }
                goto error;
        }
 
        if (autobrt == SETTING_BRIGHTNESS_AUTOMATIC_OFF) {
                if (brt != setting) {
-                       device_set_property(DEVICE_TYPE_DISPLAY, PROP_DISPLAY_BRIGHTNESS, setting);
+                       backlight_ops.set_brightness(setting);
                        if (vconf_set_int(VCONFKEY_PM_CURRENT_BRIGHTNESS, setting) != 0) {
                                _E("Failed to set VCONFKEY_PM_CURRENT_BRIGHTNESS value");
                        }