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>
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")
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;
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;
}
* 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;
exit_lcd_operation();
free_lock_info_list();
+ /* free display service */
+ display_service_free();
+
_I("Stop power manager");
}
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,
/*
* 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.
#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"
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);
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)) {
}
/* 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);
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)
{
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;
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
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
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;
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;
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;
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;
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;
#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
*/
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);
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 {
{
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);
{
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);
{
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);
{
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;
{
DBusMessageIter iter;
DBusMessage *reply;
- int cmd, brt, autobrt, ret, caps;
+ int brt, autobrt, ret, caps;
caps = display_get_caps(DISPLAY_ACTOR_API);
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)
{
DBusMessageIter iter;
DBusMessage *reply;
- int cmd, brt, autobrt, ret, caps;
+ int brt, autobrt, ret, caps;
caps = display_get_caps(DISPLAY_ACTOR_API);
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;
{
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");
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;
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");
}