aboutsummaryrefslogtreecommitdiffstats
path: root/community/mce/0004-Ambient-mode-Adapt-low-power-mode-to-allow-for-actua.patch
blob: 0a85ccbded868e9b148a02539f8408a3339df693 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
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: