aboutsummaryrefslogtreecommitdiffstats
path: root/community/mce/0004-Ambient-mode-Adapt-low-power-mode-to-allow-for-actua.patch
diff options
context:
space:
mode:
Diffstat (limited to 'community/mce/0004-Ambient-mode-Adapt-low-power-mode-to-allow-for-actua.patch')
-rw-r--r--community/mce/0004-Ambient-mode-Adapt-low-power-mode-to-allow-for-actua.patch631
1 files changed, 631 insertions, 0 deletions
diff --git a/community/mce/0004-Ambient-mode-Adapt-low-power-mode-to-allow-for-actua.patch b/community/mce/0004-Ambient-mode-Adapt-low-power-mode-to-allow-for-actua.patch
new file mode 100644
index 00000000000..0a85ccbded8
--- /dev/null
+++ b/community/mce/0004-Ambient-mode-Adapt-low-power-mode-to-allow-for-actua.patch
@@ -0,0 +1,631 @@
+From d1ddfc4611ebbd9ac7beebb1add42d66e68b7094 Mon Sep 17 00:00:00 2001
+From: MagneFire <IDaNLContact@gmail.com>
+Date: Sun, 7 Mar 2021 22:49:48 +0100
+Subject: [PATCH] Ambient mode: Adapt low-power-mode to allow for actual
+ ambient mode. Refactor the low power mode to actually work in low power
+ mode(deep sleep). There are some challenges when it comes to transitions
+ (i.e. screen on -> screen lpm). There are multiple parts responsible for
+ setting the next screen state.
+
+Depending on what state the screen is the following may happen:
+- Default, screen on (currently watchface is shown) -> screen lpm.
+- In the `long timeout`(from asteroid-launcher) state, the screen may first go from screen on -> screen dim -> screen lpm
+- When the screen is off and a notification arrives the screen isn't actually in the on state, so there is a change needed in tklock.c to fix that.
+
+Another part that is very important is the ambient light sensor module.
+There is also the filter-brightness-als module. This module is responsible for changing the range of the brightness depending on the currently set brightness and the ambient light sensor value.
+So if the brightness is set to 0% the brightness profile use is 0, for 100% the profile 20 is used. These profiles are defined in `als-defaults.ini`.
+For LPM/ambient mode a special profiles set is used (LPM).
+In LPM mode we want to limit the maximum brightness.
+So a default profile is used that limits the maximum brightness to 28%. If the als reports a lower value then a lower screen brightness is also possible.
+An important side note is that, the als mode is enabled even if no such sensor exist. For those devices, the als value of 400 is used.
+This value also signifies the maximum brightness in LPM mode.
+Because the minimum brightness can vary between devices it is suggested to create alternative profiles for such devices.
+
+---
+ inifiles/als-defaults.ini | 13 +-
+ inifiles/mce.ini | 2 +-
+ mce-dbus.h | 4 +
+ mce-fbdev.c | 19 ++-
+ mce-fbdev.h | 1 +
+ mce.conf | 6 +
+ modules/display.c | 210 ++++++++++++++++++++++++++++++--
+ modules/display.h | 6 +-
+ modules/filter-brightness-als.c | 13 +-
+ powerkey.h | 2 +-
+ tklock.c | 2 +-
+ 11 files changed, 253 insertions(+), 25 deletions(-)
+
+diff --git a/inifiles/als-defaults.ini b/inifiles/als-defaults.ini
+index 4a77fc3..c5339c0 100644
+--- a/inifiles/als-defaults.ini
++++ b/inifiles/als-defaults.ini
+@@ -1,10 +1,11 @@
+ # Configuration file for MCE - Automatic display/led/keypad brightness control
+ #
+-# Configuration for tuning lisplay backlight, keypad backlight and indication led
++# Configuration for tuning display backlight, keypad backlight and indication led
+ # brightness base on data from Ambient Light Sensor
+ #
+ # Limits are Ambient light sensor values [lux]
+ # Levels are brightness percentages
++# Profiles are input brightness percentages converted to profile range (40% -> Profile 8)
+ #
+ # Minimum, ..., Maximum correspond with brightness setting 1 ... 5
+
+@@ -85,5 +86,11 @@ LevelsProfile0=30;33;36;39;42;45;48;51;54;57;64;68;72;76;80;84;88;92;96;100
+
+ [BrightnessLPM]
+
+-LimitsProfile0=1;4;27;99;700;778;864;960;1066;1184;1315;1460;1622;1801;2000
+-LevelsProfile0=1;2;3;4;5;15;24;34;43;53;62;72;81;91;100
++# Use Limits and Levels profiles to select the desired brightness for a given ALS and current brightness.
++# When the device doesn't have an ambient light sensor the default value for 400 will be used.
++# The value 400 is over 350, so the value for 100000(=> 28%) will be used.
++# Profiles can be added to have different LPM brightness levels at different input brightness levels.
++# This sets the maximum brightness to 28% in ambient mode.
++# Why 28%? Because this is the brightness level when input brightness is set to 0 and als is not available.
++LimitsProfile0=1;2;4;6;11;19;34;61;109;195;350;100000
++LevelsProfile0=1;3;5;7;9;11;13;15;17;19;20;28
+\ No newline at end of file
+diff --git a/inifiles/mce.ini b/inifiles/mce.ini
+index 756b224..c208342 100644
+--- a/inifiles/mce.ini
++++ b/inifiles/mce.ini
+@@ -16,7 +16,8 @@
+ # to avoid unnecessary brightness fluctuations on mce startup
+ #
+ # Note: the name should not include the "lib"-prefix
+-Modules=radiostates;filter-brightness-als;display;keypad;led;battery-udev;inactivity;alarm;callstate;audiorouting;proximity;powersavemode;cpu-keepalive;doubletap;packagekit;sensor-gestures;bluetooth;memnotify;mempressure;usbmode;buttonbacklight;fingerprint;charging;
++Modules=radiostates;display;filter-brightness-als;keypad;led;battery-udev;inactivity;alarm;callstate;audiorouting;proximity;powersavemode;cpu-keepalive;doubletap;packagekit;sensor-gestures;bluetooth;memnotify;mempressure;usbmode;buttonbacklight;fingerprint;charging;
++
+
+ [KeyPad]
+
+diff --git a/mce-dbus.h b/mce-dbus.h
+index e43da0b..828ffb5 100644
+--- a/mce-dbus.h
++++ b/mce-dbus.h
+@@ -101,6 +101,10 @@
+ /* Enabling/disabling display updates via compositor service */
+ # define COMPOSITOR_SET_UPDATES_ENABLED "setUpdatesEnabled"
+
++#define COMPOSITOR_SET_AMBIENT_UPDATES_ENABLED "setAmbientUpdatesEnabled"
++#define COMPOSITOR_SET_AMBIENT_MODE_ENABLED "setAmbientEnabled"
++#define MCE_DISPLAY_LPM_SET_SUPPORTED "set_lpm_supported"
++
+ /** Query owner of topmost ui window */
+ # define COMPOSITOR_GET_TOPMOST_WINDOW_PID "privateTopmostWindowProcessId"
+
+diff --git a/mce-fbdev.c b/mce-fbdev.c
+index 7db8762..6212a91 100644
+--- a/mce-fbdev.c
++++ b/mce-fbdev.c
+@@ -58,6 +58,8 @@ static bool fbdev_use_hybris = false;
+ /** Flag for: Opening frame buffer device is allowed */
+ static bool mce_fbdev_allow_open = false;
+
++static bool mce_fbdev_power_vsync_suspend = false;
++
+ /* ========================================================================= *
+ * FBDEV_FILE_DESCRIPTOR
+ * ========================================================================= */
+@@ -239,6 +241,12 @@ void mce_fbdev_linger_after_exit(int delay_ms)
+ * FRAMEBUFFER_POWER
+ * ========================================================================= */
+
++void mce_fbdev_set_suspend_mode(bool vsync_suspend)
++{
++ mce_log(LL_DEBUG, "fbdev suspend_mode %s", vsync_suspend ? "on" : "off");
++ mce_fbdev_power_vsync_suspend = vsync_suspend;
++}
++
+ /** Set the frame buffer power state
+ *
+ * MCE uses this function for display power control only if autosuspend
+@@ -252,10 +260,17 @@ void mce_fbdev_linger_after_exit(int delay_ms)
+ */
+ void mce_fbdev_set_power(bool power_on)
+ {
+- mce_log(LL_DEBUG, "fbdev power %s", power_on ? "up" : "down");
++ mce_log(LL_DEBUG, "fbdev power %s", power_on ? "up" : (mce_fbdev_power_vsync_suspend ? "ambient" : "down"));
+
+ if( mce_fbdev_handle != -1 ) {
+- int value = power_on ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
++ int value;
++ if (power_on) {
++ value = FB_BLANK_UNBLANK;
++ } else if (mce_fbdev_power_vsync_suspend) {
++ value = FB_BLANK_VSYNC_SUSPEND;
++ } else {
++ value = FB_BLANK_POWERDOWN;
++ }
+
+ if( ioctl(mce_fbdev_handle, FBIOBLANK, value) == -1 )
+ mce_log(LL_ERR, "%s: ioctl(FBIOBLANK,%d): %m", FB_DEVICE, value);
+diff --git a/mce-fbdev.h b/mce-fbdev.h
+index 03f09f5..18a1a08 100644
+--- a/mce-fbdev.h
++++ b/mce-fbdev.h
+@@ -36,6 +36,7 @@ void mce_fbdev_close (void);
+ void mce_fbdev_reopen (void);
+ bool mce_fbdev_is_open (void);
+
++void mce_fbdev_set_suspend_mode (bool vsync_suspend);
+ void mce_fbdev_set_power (bool power_on);
+
+ void mce_fbdev_linger_after_exit (int delay_ms);
+diff --git a/mce.conf b/mce.conf
+index 11d764e..9b46094 100644
+--- a/mce.conf
++++ b/mce.conf
+@@ -110,6 +110,12 @@
+ <allow send_destination="com.nokia.mce"
+ send_interface="com.nokia.mce.request"
+ send_member="req_display_state_lpm"/>
++ <allow send_destination="com.nokia.mce"
++ send_interface="com.nokia.mce.request"
++ send_member="set_lpm_supported"/>
++ <allow send_destination="com.nokia.mce"
++ send_interface="com.nokia.mce.request"
++ send_member="get_lpm_available"/>
+
+ <allow send_destination="com.nokia.mce"
+ send_interface="com.nokia.mce.request"
+diff --git a/modules/display.c b/modules/display.c
+index f33ec64..42ca0e5 100644
+--- a/modules/display.c
++++ b/modules/display.c
+@@ -412,6 +412,7 @@ static bool mdy_shutdown_in_progress(void);
+ * DATAPIPE_TRACKING
+ * ------------------------------------------------------------------------- */
+
++static void mdy_datapipe_ambient_light_level_cb(gconstpointer data);;
+ static void mdy_datapipe_packagekit_locked_cb(gconstpointer data);;
+ static void mdy_datapipe_system_state_cb(gconstpointer data);
+ static void mdy_datapipe_submode_cb(gconstpointer data);
+@@ -709,6 +710,9 @@ static void compositor_stm_send_pid_query (compositor_stm_t *
+ static void compositor_stm_forget_pid_query (compositor_stm_t *self);
+ static void compositor_stm_pid_query_cb (DBusPendingCall *pc, void *aptr);
+
++static void compositor_stm_send_lpm_request (compositor_stm_t *self);
++static void compositor_stm_lpm_request_cb (DBusPendingCall *pc, void *aptr);
++
+ static void compositor_stm_send_ctrl_request (compositor_stm_t *self);
+ static void compositor_stm_forget_ctrl_request(compositor_stm_t *self);
+ static void compositor_stm_ctrl_request_cb (DBusPendingCall *pc, void *aptr);
+@@ -933,6 +937,7 @@ static gboolean mdy_dbus_handle_blanking_pause_cancel_req(DBusMessage
+ static gboolean mdy_dbus_handle_display_stats_get_req(DBusMessage *const req);
+
+ static gboolean mdy_dbus_handle_desktop_started_sig(DBusMessage *const msg);
++static gboolean mdy_dbus_timed_wakeup_sig(DBusMessage *const msg);
+
+ static void mdy_dbus_init(void);
+ static void mdy_dbus_quit(void);
+@@ -1396,6 +1401,29 @@ xlat(int src_lo, int src_hi, int dst_lo, int dst_hi, int val)
+ * DATAPIPE_TRACKING
+ * ========================================================================= */
+
++/** Ambient light level; assume sensor not available.
++ * This is used to avoid changing the backlight when the als is disabled.
++ */
++static int ambient_light_level = -1;
++/**
++ * Handle ambient light level updates.
++ *
++ * @param data The ambient light level in a pointer
++ */
++static void mdy_datapipe_ambient_light_level_cb(gconstpointer data)
++{
++ bool prev = ambient_light_level;
++ ambient_light_level = GPOINTER_TO_INT(data);
++
++ if( ambient_light_level == prev )
++ goto EXIT;
++
++ /* Log by default as it might help analyzing lpm problems */
++ mce_log(LL_DEBUG, "ambient_light_level = %d", ambient_light_level);
++EXIT:
++ return;
++}
++
+ /** Cached exceptional ui state */
+ static uiexception_type_t uiexception_type = UIEXCEPTION_TYPE_NONE;
+
+@@ -1827,7 +1855,9 @@ static void mdy_datapipe_lpm_brightness_cb(gconstpointer data)
+
+ mce_log(LL_DEBUG, "input: %d -> %d", prev, curr);
+
+- if( curr == prev )
++ // Sometimes it happens that the brightness changes while the als is disabled(ambient_light_level = -1), this cause the
++ // filter to return 100%, resulting in max brightness ambient mode.
++ if( (curr == prev) || (ambient_light_level < 0))
+ goto EXIT;
+
+ mdy_brightness_set_lpm_level(curr);
+@@ -2242,6 +2272,10 @@ static datapipe_handler_t mdy_datapipe_handlers[] =
+ .datapipe = &audio_route_pipe,
+ .output_cb = mdy_datapipe_audio_route_cb,
+ },
++ {
++ .datapipe = &light_sensor_filtered_pipe,
++ .output_cb = mdy_datapipe_ambient_light_level_cb,
++ },
+ {
+ .datapipe = &packagekit_locked_pipe,
+ .output_cb = mdy_datapipe_packagekit_locked_cb,
+@@ -3527,12 +3561,11 @@ static void mdy_brightness_set_lpm_level(gint level)
+ * display state we are in or transitioning to */
+ switch( display_state_next ) {
+ case MCE_DISPLAY_LPM_ON:
++ case MCE_DISPLAY_OFF:
++ case MCE_DISPLAY_LPM_OFF:
+ mdy_brightness_set_fade_target_als(mdy_brightness_level_display_lpm);
+ break;
+-
+ default:
+- case MCE_DISPLAY_OFF:
+- case MCE_DISPLAY_LPM_OFF:
+ case MCE_DISPLAY_DIM:
+ case MCE_DISPLAY_ON:
+ case MCE_DISPLAY_UNDEF:
+@@ -4159,8 +4192,7 @@ static gboolean mdy_blanking_off_cb(gpointer data)
+ case MCE_DISPLAY_DIM:
+ if( lipstick_service_state != SERVICE_STATE_RUNNING )
+ break;
+- if( mdy_blanking_from_lockscreen() )
+- next_state = MCE_DISPLAY_LPM_ON;
++ next_state = MCE_DISPLAY_LPM_ON;
+ break;
+ default:
+ break;
+@@ -6164,6 +6196,12 @@ struct compositor_stm_t
+ */
+ DBusPendingCall *csi_ctrl_request_pc;
+
++ /** Currently pending compositor D-Bus method call
++ *
++ * Managed by compositor_stm_send_ctrl_request() & co
++ */
++ DBusPendingCall *csi_lpm_request_pc;
++
+ /** Timer id for killing unresponsive compositor process
+ *
+ * Managed by compositor_stm_schedule_killer() & co
+@@ -6213,6 +6251,7 @@ compositor_stm_ctor(compositor_stm_t *self)
+
+ /* No pending compositor dbus method call */
+ self->csi_ctrl_request_pc = 0;
++ self->csi_lpm_request_pc = 0;
+
+ /* Retry timer is inactive */
+ self->csi_retry_timer_id = 0;
+@@ -6411,6 +6450,70 @@ EXIT:
+ return;
+ }
+
++static void
++compositor_stm_send_lpm_request(compositor_stm_t *self)
++{
++ mce_log(LL_DEBUG, "compositor_stm_send_lpm_request");
++ dbus_bool_t dta = mdy_use_low_power_mode;
++
++ bool ack = dbus_send_ex2(COMPOSITOR_SERVICE,
++ COMPOSITOR_PATH,
++ COMPOSITOR_IFACE,
++ COMPOSITOR_SET_AMBIENT_MODE_ENABLED,
++ compositor_stm_lpm_request_cb,
++ COMPOSITOR_STM_DBUS_CALL_TIMEOUT,
++ self, 0,
++ &self->csi_lpm_request_pc,
++ DBUS_TYPE_BOOLEAN, &dta,
++ DBUS_TYPE_INVALID);
++
++ if( !ack )
++ mce_log(LL_NOTICE, "Failed to send low power mode enable request");
++}
++
++/** Handle reply to pending compositor state request
++ */
++static void
++compositor_stm_lpm_request_cb(DBusPendingCall *pc, void *aptr)
++{
++ compositor_stm_t *self = aptr;
++ DBusMessage *rsp = 0;
++ DBusError err = DBUS_ERROR_INIT;
++ bool ack = false;
++ mce_log(LL_DEBUG, "compositor_stm_lpm_request_cb");
++
++ if( self->csi_lpm_request_pc != pc )
++ goto EXIT;
++
++ dbus_pending_call_unref(self->csi_lpm_request_pc),
++ self->csi_lpm_request_pc = 0;
++
++ if( !(rsp = dbus_pending_call_steal_reply(pc)) )
++ goto EXIT;
++
++ if( dbus_set_error_from_message(&err, rsp) ) {
++ mce_log(LL_WARN, "%s: %s", err.name, err.message);
++ goto EXIT;
++ }
++
++ ack = true;
++
++EXIT:
++ if( ack ) {
++ mce_log(LL_DEBUG, "Compositor ack LPM request support: %d, enable: %d",
++ mdy_low_power_mode_supported, mdy_use_low_power_mode);
++ mce_fbdev_set_suspend_mode(mdy_use_low_power_mode && mdy_low_power_mode_supported);
++ } else {
++ mce_log(LL_DEBUG, "LPM request wasn't acknowledged, is the compositor available?");
++ }
++
++ if( rsp ) dbus_message_unref(rsp);
++
++ dbus_error_free(&err);
++
++ return;
++}
++
+ /* ------------------------------------------------------------------------- *
+ * managing org.nemomobile.compositor.setUpdatesEnabled() method calls
+ * ------------------------------------------------------------------------- */
+@@ -7662,7 +7765,8 @@ static void mdy_display_state_changed(void)
+ case MCE_DISPLAY_OFF:
+ case MCE_DISPLAY_LPM_OFF:
+ /* Blanking or already blanked -> set zero brightness */
+- mdy_brightness_force_level(0);
++ if (!mdy_use_low_power_mode || !mdy_low_power_mode_supported)
++ mdy_brightness_force_level(0);
+ break;
+
+ case MCE_DISPLAY_LPM_ON:
+@@ -7753,8 +7857,8 @@ static void mdy_display_state_leave(display_state_t prev_state,
+ bool have_power = mdy_stm_display_state_needs_power(prev_state);
+ bool need_power = mdy_stm_display_state_needs_power(next_state);
+
+- /* Deny ALS brightness when heading to powered off state */
+- if( !need_power ) {
++ /* Deny ALS brightness when heading to powered off state, but allow in ambient mode */
++ if( !need_power && !(mdy_use_low_power_mode && mdy_low_power_mode_supported)) {
+ mce_log(LL_DEBUG, "deny als fade");
+ mdy_brightness_als_fade_allowed = false;
+ }
+@@ -7786,7 +7890,8 @@ static void mdy_display_state_leave(display_state_t prev_state,
+ case MCE_DISPLAY_OFF:
+ case MCE_DISPLAY_LPM_OFF:
+ mdy_brightness_level_display_resume = 0;
+- mdy_brightness_set_fade_target_blank();
++ if (!mdy_use_low_power_mode || !mdy_low_power_mode_supported)
++ mdy_brightness_set_fade_target_blank();
+ break;
+
+ case MCE_DISPLAY_UNDEF:
+@@ -9786,6 +9891,39 @@ static gboolean mdy_dbus_handle_display_off_req(DBusMessage *const msg)
+ return TRUE;
+ }
+
++static gboolean mdy_dbus_handle_lpm_enabled_req(DBusMessage *const msg)
++{
++ gboolean status = FALSE;
++ dbus_bool_t low_power_mode_supported = false;
++ DBusError error = DBUS_ERROR_INIT;
++
++ mce_log(LL_DEVEL, "Received lpm support from %s",
++ mce_dbus_get_message_sender_ident(msg));
++
++ /* Extract result */
++ if (dbus_message_get_args(msg, &error,
++ DBUS_TYPE_BOOLEAN, &low_power_mode_supported,
++ DBUS_TYPE_INVALID) == FALSE) {
++ mce_log(LL_ERR, "Failed to get argument from %s.%s; %s",
++ "org.freedesktop.DBus", "NameOwnerChanged",
++ error.message);
++ goto EXIT;
++ }
++ status = TRUE;
++
++EXIT:
++ mce_log(LL_DEVEL, "The compositor %s support for ambient mode.",
++ low_power_mode_supported ? "has" : "hasn't");
++
++ // We have a variable that we should use to set lpm mode availability based on ack.
++ mdy_low_power_mode_supported = low_power_mode_supported;
++
++ // Enable/disable lpm mode based on support from the compositor.
++ compositor_stm_send_lpm_request(mdy_compositor_ipc);
++
++ return status;
++}
++
+ /** D-Bus callback for the display lpm method call
+ *
+ * @param msg The D-Bus message
+@@ -10254,6 +10392,40 @@ static gboolean mdy_dbus_handle_desktop_started_sig(DBusMessage *const msg)
+ return status;
+ }
+
++/**
++ * D-Bus callback for timed wakeup event, used to update ambient display.
++ *
++ * @param msg The D-Bus message
++ * @return TRUE on success, FALSE on failure
++ */
++static gboolean mdy_dbus_timed_wakeup_sig(DBusMessage *const msg)
++{
++ gboolean status = FALSE;
++ dbus_bool_t dta = TRUE;
++ (void)msg;
++
++ mce_log(LL_DEBUG, "Received timed wakeup event, updating ambient display");
++ if (mdy_use_low_power_mode && mdy_low_power_mode_supported) {
++ bool ack = dbus_send_ex2(COMPOSITOR_SERVICE,
++ COMPOSITOR_PATH,
++ COMPOSITOR_IFACE,
++ COMPOSITOR_SET_AMBIENT_UPDATES_ENABLED,
++ NULL,
++ COMPOSITOR_STM_DBUS_CALL_TIMEOUT,
++ NULL, 0,
++ NULL,
++ DBUS_TYPE_BOOLEAN, &dta,
++ DBUS_TYPE_INVALID);
++
++ if( !ack )
++ mce_log(LL_CRIT, "Failed to send ambient mode update request");
++ }
++
++ status = TRUE;
++
++ return status;
++}
++
+ /** Array of dbus message handlers */
+ static mce_dbus_handler_t mdy_dbus_handlers[] =
+ {
+@@ -10301,6 +10473,12 @@ static mce_dbus_handler_t mdy_dbus_handlers[] =
+ .type = DBUS_MESSAGE_TYPE_SIGNAL,
+ .callback = mdy_dbus_handle_desktop_started_sig,
+ },
++ {
++ .interface = "com.nokia.time",
++ .name = "wakeup_event",
++ .type = DBUS_MESSAGE_TYPE_SIGNAL,
++ .callback = mdy_dbus_timed_wakeup_sig,
++ },
+ {
+ .interface = COMPOSITOR_IFACE,
+ .name = COMPOSITOR_TOPMOST_WINDOW_PID_CHANGED,
+@@ -10348,6 +10526,14 @@ static mce_dbus_handler_t mdy_dbus_handlers[] =
+ .args =
+ " <arg direction=\"out\" name=\"cabc_mode\" type=\"s\"/>\n"
+ },
++ {
++ .interface = MCE_REQUEST_IF,
++ .name = MCE_DISPLAY_LPM_SET_SUPPORTED,
++ .type = DBUS_MESSAGE_TYPE_METHOD_CALL,
++ .callback = mdy_dbus_handle_lpm_enabled_req,
++ .args =
++ " <arg direction=\"out\" name=\"enabled\" type=\"b\"/>\n"
++ },
+ {
+ .interface = MCE_REQUEST_IF,
+ .name = MCE_DISPLAY_ON_REQ,
+@@ -10829,6 +11015,7 @@ static void mdy_setting_cb(GConfClient *const gcc, const guint id,
+ }
+ else if (id == mdy_use_low_power_mode_setting_id) {
+ mdy_use_low_power_mode = gconf_value_get_bool(gcv);
++ compositor_stm_send_lpm_request(mdy_compositor_ipc);
+
+ if (((display_state_curr == MCE_DISPLAY_LPM_OFF) ||
+ (display_state_curr == MCE_DISPLAY_LPM_ON)) &&
+@@ -11223,7 +11410,8 @@ static void mdy_setting_init(void)
+ MCE_DEFAULT_USE_LOW_POWER_MODE,
+ mdy_setting_cb,
+ &mdy_use_low_power_mode_setting_id);
+-
++
++ compositor_stm_send_lpm_request(mdy_compositor_ipc);
+ /* Blanking inhibit modes */
+ mce_setting_track_int(MCE_SETTING_BLANKING_INHIBIT_MODE,
+ &mdy_blanking_inhibit_mode,
+diff --git a/modules/display.h b/modules/display.h
+index 8075401..8bd4513 100644
+--- a/modules/display.h
++++ b/modules/display.h
+@@ -385,7 +385,7 @@
+
+ /** Display blanking delay from lpm-on state [s] */
+ # define MCE_SETTING_DISPLAY_BLANK_FROM_LPM_ON_TIMEOUT MCE_SETTING_DISPLAY_PATH "/display_blank_from_lpm_on_timeout"
+-# define MCE_DEFAULT_DISPLAY_BLANK_FROM_LPM_ON_TIMEOUT 5
++# define MCE_DEFAULT_DISPLAY_BLANK_FROM_LPM_ON_TIMEOUT 1
+
+ /** Display blanking delay from lpm-off state [s]
+ *
+@@ -394,7 +394,7 @@
+ * will cause transition back to lpm-on state.
+ */
+ # define MCE_SETTING_DISPLAY_BLANK_FROM_LPM_OFF_TIMEOUT MCE_SETTING_DISPLAY_PATH "/display_blank_from_lpm_off_timeout"
+-# define MCE_DEFAULT_DISPLAY_BLANK_FROM_LPM_OFF_TIMEOUT 5
++# define MCE_DEFAULT_DISPLAY_BLANK_FROM_LPM_OFF_TIMEOUT 1
+
+ /** Whether display blanking is forbidden
+ *
+@@ -512,7 +512,7 @@ typedef enum {
+ * to blank the screen after a while.
+ */
+ # define MCE_SETTING_USE_LOW_POWER_MODE MCE_SETTING_DISPLAY_PATH "/use_low_power_mode"
+-# define MCE_DEFAULT_USE_LOW_POWER_MODE false
++# define MCE_DEFAULT_USE_LOW_POWER_MODE true
+
+ /* ------------------------------------------------------------------------- *
+ * Power Management related settings
+diff --git a/modules/filter-brightness-als.c b/modules/filter-brightness-als.c
+index 26ff3e2..54eed91 100644
+--- a/modules/filter-brightness-als.c
++++ b/modules/filter-brightness-als.c
+@@ -810,11 +810,11 @@ fba_inputflt_sampling_output(int lux)
+
+ fba_inputflt_output_lux = lux;
+
+- fba_datapipe_execute_brightness_change();
+-
+ /* Feed filtered sensor data to datapipe */
+ datapipe_exec_full(&light_sensor_filtered_pipe,
+ GINT_TO_POINTER(fba_inputflt_output_lux));
++
++ fba_datapipe_execute_brightness_change();
+ EXIT:
+ return;
+ }
+@@ -1288,9 +1288,12 @@ fba_datapipe_lpm_brightness_filter(gpointer data)
+ if( lut_lpm.profiles < 1 )
+ goto EXIT;
+
++ int max_prof = lut_lpm.profiles - 1;
++
++ int prof = mce_xlat_int(1,100, 0,max_prof, value);
+ /* Note: Input value is ignored and output is
+ * determined only by the als config */
+- value = fba_als_filter_run(&lut_lpm, 0, fba_inputflt_output_lux);
++ value = fba_als_filter_run(&lut_lpm, prof, fba_inputflt_output_lux);
+
+ EXIT:
+ return GINT_TO_POINTER(value);
+@@ -1746,6 +1749,10 @@ fba_status_rethink(void)
+ mce_log(LL_DEBUG, "enabled=%d; autobright=%d; filter_lid=%d -> enable=%d",
+ fba_setting_als_enabled, fba_setting_als_autobrightness, fba_setting_filter_lid_with_als, enable_new);
+
++ /* When the display module is loaded the function datapipe binding is inited, this causes a a brightness update without filtering.
++ * fba_status_rethink is called when the module is loaded. Also execute the brightness filter pipe. Fixing als not filtering on boot. */
++ fba_datapipe_execute_brightness_change();
++
+ enable_old = enable_new;
+
+ if( enable_new ) {
+diff --git a/powerkey.h b/powerkey.h
+index 6d90108..4c342a0 100644
+--- a/powerkey.h
++++ b/powerkey.h
+@@ -63,7 +63,7 @@ typedef enum
+
+ /** How power key "blank" action should behave */
+ # define MCE_SETTING_POWERKEY_BLANKING_MODE MCE_SETTING_POWERKEY_PATH "/blanking_mode"
+-# define MCE_DEFAULT_POWERKEY_BLANKING_MODE 0 // = PWRKEY_BLANK_TO_OFF
++# define MCE_DEFAULT_POWERKEY_BLANKING_MODE 1 // = PWRKEY_BLANK_TO_LPM
+
+ /** How many consequent power key presses trigger proximity override
+ *
+diff --git a/tklock.c b/tklock.c
+index 867deaa..1188cb6 100644
+--- a/tklock.c
++++ b/tklock.c
+@@ -4100,7 +4100,7 @@ static void tklock_uiexception_finish(void)
+ default:
+ /* If the display was not clearly ON when exception started,
+ * turn it OFF after exceptions are over. */
+- mce_datapipe_request_display_state(MCE_DISPLAY_OFF);
++ mce_datapipe_request_display_state(MCE_DISPLAY_LPM_ON);
+ break;
+
+ case MCE_DISPLAY_ON: