summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarta Lofstedt <marta.lofstedt@intel.com>2016-12-13 15:50:31 +0200
committerMartin Peres <martin.peres@linux.intel.com>2017-01-23 10:29:29 +0200
commit851e33e5687986e9def164f619b1c8fbc70e6b12 (patch)
tree3439904a71300e126770441d2ac35e83abfb5f73
parent674966d946f7b2e365a3bc63029d7a281ab3d1d4 (diff)
drm: handle dpms for drm backlight
When entering into dpms mode the brightness value will be set to 0. While coming out off dpms mode, the cached value from the brightness property will be used to re-store the original brightness value. Signed-off-by: Marta Lofstedt <marta.lofstedt@intel.com>
-rw-r--r--drivers/gpu/drm/drm_connector.c2
-rw-r--r--drivers/gpu/drm/drm_mode_object.c41
2 files changed, 42 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index f94be9adb32a..9ff394dfb9e9 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -1105,7 +1105,7 @@ int drm_mode_connector_set_obj_prop(struct drm_mode_object *obj,
if (property == connector->dev->mode_config.dpms_property) {
ret = (*connector->funcs->dpms)(connector, (int)value);
} else if (property == config->brightness_property) {
- if (connector->backlight)
+ if (connector->backlight && connector->dpms == DRM_MODE_DPMS_ON)
drm_backlight_set_brightness(connector->backlight,
value);
ret = 0;
diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c
index fedeca5e1cce..5d4fbcf45ea5 100644
--- a/drivers/gpu/drm/drm_mode_object.c
+++ b/drivers/gpu/drm/drm_mode_object.c
@@ -24,6 +24,7 @@
#include <drm/drmP.h>
#include <drm/drm_mode_object.h>
#include <drm/drm_atomic.h>
+#include <drm/drm_backlight.h>
#include "drm_crtc_internal.h"
@@ -241,9 +242,49 @@ int drm_object_property_set_value(struct drm_mode_object *obj,
struct drm_property *property, uint64_t val)
{
int i;
+ struct drm_connector *connector = obj_to_connector(obj);
+ struct drm_property *dpms_property =
+ connector->dev->mode_config.dpms_property;
+ struct drm_property *brightness_property =
+ connector->dev->mode_config.brightness_property;
for (i = 0; i < obj->properties->count; i++) {
+ /* If properties depends on each other
+ * this is where to resolve that issue
+ */
if (obj->properties->properties[i] == property) {
+ if (property == dpms_property) {
+ /* When DPMS goes from ON -> OFF,
+ * set the brightness to the minimum possible
+ * to save power.
+ */
+ if (obj->properties->values[i] !=
+ DRM_MODE_DPMS_OFF &&
+ val == DRM_MODE_DPMS_OFF)
+ drm_backlight_set_brightness(
+ connector->backlight, 0);
+ /* When DPMS OFF -> ON, reset the brightness
+ * to the original level
+ */
+ else if (obj->properties->values[i] ==
+ DRM_MODE_DPMS_OFF &&
+ val != DRM_MODE_DPMS_OFF) {
+ uint64_t value;
+
+ _drm_object_property_get_value(
+ obj, brightness_property,
+ &value, false);
+ drm_backlight_set_brightness(
+ connector->backlight, value);
+ }
+ } else if (property == brightness_property) {
+ /* only allow setting the brightness property
+ * value, when dpms mode is on.
+ */
+ if (connector->dpms == DRM_MODE_DPMS_ON)
+ obj->properties->values[i] = val;
+ return 0;
+ }
obj->properties->values[i] = val;
return 0;
}