diff options
-rw-r--r-- | drivers/gpu/drm/drm_connector.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_mode_object.c | 41 |
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; } |