diff options
author | Marta Lofstedt <marta.lofstedt@intel.com> | 2016-11-02 09:41:47 +0200 |
---|---|---|
committer | Martin Peres <martin.peres@linux.intel.com> | 2017-01-23 10:27:23 +0200 |
commit | 674966d946f7b2e365a3bc63029d7a281ab3d1d4 (patch) | |
tree | f9845842343e4430fea1e17570c451f912beb0a3 | |
parent | 6a6f1bc16ed7e9c0aefeb3603355b8f3ff6db851 (diff) |
drm: make use of the get_property callback
By using the get_property callback. The cached brightness value of the
drm properties list will be overridden by an up-to-date brightness value
from the backlight device.
Signed-off-by: Marta Lofstedt <marta.lofstedt@intel.com>
-rw-r--r-- | drivers/gpu/drm/drm_backlight.c | 31 | ||||
-rw-r--r-- | include/drm/drm_backlight.h | 1 |
2 files changed, 32 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_backlight.c b/drivers/gpu/drm/drm_backlight.c index 7ef19f51dcfc..9b93d3d54877 100644 --- a/drivers/gpu/drm/drm_backlight.c +++ b/drivers/gpu/drm/drm_backlight.c @@ -196,10 +196,41 @@ int drm_backlight_alloc(struct drm_connector *connector) drm_object_attach_property(&connector->base, config->brightness_property, U16_MAX); + config->brightness_property->get_property = + drm_backlight_get_property_value; return 0; } EXPORT_SYMBOL(drm_backlight_alloc); +uint64_t drm_backlight_get_property_value(struct drm_mode_object *obj) +{ + uint64_t brightness, set, max; + struct drm_connector *con = + container_of(obj, struct drm_connector, base); + + spin_lock(&drm_backlight_lock); + if (__drm_backlight_is_registered(con->backlight) && + con->backlight->link) { + brightness = + backlight_device_get_brightness(con->backlight->link); + spin_unlock(&drm_backlight_lock); + } else { + spin_unlock(&drm_backlight_lock); + return U16_MAX; + } + + set = brightness; + max = con->backlight->link->props.max_brightness; + + if (set >= max) + set = U16_MAX; + else if (max <= U16_MAX) + set = brightness * ((U16_MAX + max + 1)/(max + 1)); + else + set = div_u64(brightness << 16, max); + return set; +} + void drm_backlight_free(struct drm_connector *connector) { struct drm_backlight *b = connector->backlight; diff --git a/include/drm/drm_backlight.h b/include/drm/drm_backlight.h index 17b038411e64..94a22260f8d5 100644 --- a/include/drm/drm_backlight.h +++ b/include/drm/drm_backlight.h @@ -40,4 +40,5 @@ void drm_backlight_unregister(struct drm_backlight *b); int drm_backlight_get_name(struct drm_backlight *b, char *buf, size_t max); int drm_backlight_set_name(struct drm_backlight *b, const char *name); void drm_backlight_set_brightness(struct drm_backlight *b, uint64_t value); +uint64_t drm_backlight_get_property_value(struct drm_mode_object *obj); #endif /* __DRM_BACKLIGHT_H__ */ |