3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
22 #include <sys/types.h>
28 #include <device-node.h>
31 #include "pm_llinterface.h"
36 #define DISP_INDEX_BIT 4
37 #define COMBINE_DISP_CMD(cmd, prop, index) (cmd = (prop | (index << DISP_INDEX_BIT)))
39 typedef struct _PMSys PMSys;
44 int (*sys_power_state) (PMSys *, int);
45 int (*bl_onoff) (PMSys *, int);
46 int (*bl_brt) (PMSys *, int);
47 int (*sys_get_battery_capacity) (PMSys *p);
48 int (*sys_get_battery_capacity_raw) (PMSys *p);
49 int (*sys_get_battery_charge_full) (PMSys *p);
54 #ifdef ENABLE_X_LCD_ONOFF
55 #include "pm_x_lcd_onoff.c"
56 static bool x_dpms_enable = false;
60 static void _update_curbrt(PMSys *p)
62 int power_saving_stat = -1;
63 int power_saving_display_stat = -1;
64 vconf_get_bool(VCONFKEY_SETAPPL_PWRSV_SYSMODE_STATUS, &power_saving_stat);
65 if (power_saving_stat == 1)
66 vconf_get_bool(VCONFKEY_SETAPPL_PWRSV_CUSTMODE_DISPLAY, &power_saving_display_stat);
67 if (power_saving_display_stat != 1)
68 power_saving_display_stat = 0;
69 plugin_intf->OEM_sys_get_backlight_brightness(DEFAULT_DISPLAY, &(p->def_brt), power_saving_display_stat);
73 static int _bl_onoff(PMSys *p, int onoff)
76 COMBINE_DISP_CMD(cmd, PROP_DISPLAY_ONOFF, DEFAULT_DISPLAY);
77 return device_set_property(DEVICE_TYPE_DISPLAY, cmd, onoff);
80 static int _bl_brt(PMSys *p, int brt)
86 COMBINE_DISP_CMD(cmd, PROP_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY);
87 ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &old_brt);
89 /* Update new brightness to vconf */
90 if (!ret && (brt != old_brt))
91 vconf_set_int(VCONFKEY_PM_CURRENT_BRIGHTNESS, brt);
93 /* Update device brightness */
94 ret = device_set_property(DEVICE_TYPE_DISPLAY, cmd, brt);
96 LOGERR("set brightness %d,%d %d", DEFAULT_DISPLAY, brt, ret);
101 static int _sys_power_state(PMSys *p, int state)
103 if (state < POWER_STATE_SUSPEND || state > POWER_STATE_POST_RESUME)
105 return device_set_property(DEVICE_TYPE_POWER, PROP_POWER_STATE, state);
108 static int _sys_get_battery_capacity(PMSys *p)
113 ret = device_get_property(DEVICE_TYPE_POWER, PROP_POWER_CAPACITY, &value);
123 static int _sys_get_battery_capacity_raw(PMSys *p)
128 ret = device_get_property(DEVICE_TYPE_POWER, PROP_POWER_CAPACITY_RAW, &value);
138 static int _sys_get_battery_charge_full(PMSys *p)
143 ret = device_get_property(DEVICE_TYPE_POWER, PROP_POWER_CHARGE_FULL, &value);
153 static void _init_bldev(PMSys *p, unsigned int flags)
158 p->bl_onoff = _bl_onoff;
159 #ifdef ENABLE_X_LCD_ONOFF
160 if (flags & FLAG_X_DPMS) {
161 p->bl_onoff = pm_x_set_lcd_backlight;
162 x_dpms_enable = true;
167 static void _init_pmsys(PMSys *p)
171 get_env(EN_SYS_DIMBRT, tmp, sizeof(tmp));
173 p->dim_brt = atoi(tmp);
174 p->sys_power_state = _sys_power_state;
175 p->sys_get_battery_capacity = _sys_get_battery_capacity;
176 p->sys_get_battery_capacity_raw = _sys_get_battery_capacity_raw;
177 p->sys_get_battery_charge_full = _sys_get_battery_charge_full;
182 LOGINFO("enter system suspend");
183 if (pmsys && pmsys->sys_power_state)
184 return pmsys->sys_power_state(pmsys, POWER_STATE_SUSPEND);
189 int system_pre_suspend()
191 LOGINFO("enter system pre suspend");
192 if (pmsys && pmsys->sys_power_state)
193 return pmsys->sys_power_state(pmsys, POWER_STATE_PRE_SUSPEND);
198 int system_post_resume()
200 LOGINFO("enter system post resume");
201 if (pmsys && pmsys->sys_power_state)
202 return pmsys->sys_power_state(pmsys, POWER_STATE_POST_RESUME);
207 int battery_capacity()
209 if (pmsys && pmsys->sys_get_battery_capacity)
210 return pmsys->sys_get_battery_capacity(pmsys);
215 int battery_capacity_raw()
217 if (pmsys && pmsys->sys_get_battery_capacity_raw)
218 return pmsys->sys_get_battery_capacity_raw(pmsys);
223 int battery_charge_full()
225 if (pmsys && pmsys->sys_get_battery_charge_full)
226 return pmsys->sys_get_battery_charge_full(pmsys);
235 if (pmsys && pmsys->bl_onoff) {
236 return pmsys->bl_onoff(pmsys, STATUS_ON);
246 if (pmsys && pmsys->bl_onoff) {
247 #ifdef ENABLE_X_LCD_ONOFF
248 if (x_dpms_enable == false)
251 return pmsys->bl_onoff(pmsys, STATUS_OFF);
261 if (pmsys && pmsys->bl_brt) {
262 ret = pmsys->bl_brt(pmsys, pmsys->dim_brt);
267 int backlight_restore()
272 ret = vconf_get_int(VCONFKEY_PM_CUSTOM_BRIGHTNESS_STATUS, &val);
273 if (ret == 0 && val == VCONFKEY_PM_CUSTOM_BRIGHTNESS_ON) {
274 LOGINFO("custom brightness mode! brt no restored");
277 if ((status_flag & PWRSV_FLAG) && !(status_flag & BRTCH_FLAG))
278 ret = backlight_dim();
279 else if (pmsys && pmsys->bl_brt)
280 ret = pmsys->bl_brt(pmsys, pmsys->def_brt);
285 int set_default_brt(int level)
287 if (level < PM_MIN_BRIGHTNESS || level > PM_MAX_BRIGHTNESS)
288 level = PM_DEFAULT_BRIGHTNESS;
289 pmsys->def_brt = level;
294 inline int check_wakeup_src(void)
297 * return wackeup source. user input or device interrupts? (EVENT_DEVICE or EVENT_INPUT)
302 int init_sysfs(unsigned int flags)
306 pmsys = (PMSys *) malloc(sizeof(PMSys));
308 LOGERR("Not enough memory to alloc PM Sys");
312 memset(pmsys, 0x0, sizeof(PMSys));
315 _init_bldev(pmsys, flags);
317 if (pmsys->bl_onoff == NULL && pmsys->sys_power_state == NULL) {
319 ("We have no managable resource to reduce the power consumption");
330 fd = open("/tmp/sem.pixmap_1", O_RDONLY);
332 LOGERR("X server disable");