summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarta Lofstedt <marta.lofstedt@intel.com>2016-11-02 09:41:47 +0200
committerMartin Peres <martin.peres@linux.intel.com>2017-01-23 10:27:23 +0200
commit674966d946f7b2e365a3bc63029d7a281ab3d1d4 (patch)
treef9845842343e4430fea1e17570c451f912beb0a3
parent6a6f1bc16ed7e9c0aefeb3603355b8f3ff6db851 (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.c31
-rw-r--r--include/drm/drm_backlight.h1
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__ */