Convert the Intel display drivers (i915 and xe) to the DRM backlight infrastructure so brightness can be controlled through the connector LUMINANCE property. Link the backlight device to the eDP connector on registration and unlink it on unregistration; the DRM core owns the embedded backlight state and its property.
Signed-off-by: Mario Limonciello <[email protected]> --- drivers/gpu/drm/i915/display/intel_backlight.c | 6 ++++++ drivers/gpu/drm/i915/display/intel_display.c | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c b/drivers/gpu/drm/i915/display/intel_backlight.c index b128896cb1c2d..3ed8c4f7af425 100644 --- a/drivers/gpu/drm/i915/display/intel_backlight.c +++ b/drivers/gpu/drm/i915/display/intel_backlight.c @@ -9,6 +9,7 @@ #include <linux/string_helpers.h> #include <acpi/video.h> +#include <drm/drm_backlight.h> #include <drm/drm_file.h> #include <drm/drm_print.h> #include <drm/intel/pci_config.h> @@ -1004,6 +1005,8 @@ int intel_backlight_device_register(struct intel_connector *connector) "[CONNECTOR:%d:%s] backlight device %s registered\n", connector->base.base.id, connector->base.name, name); + drm_backlight_link(&connector->base, bd); + out: kfree(name); @@ -1015,6 +1018,7 @@ void intel_backlight_device_unregister(struct intel_connector *connector) struct intel_panel *panel = &connector->panel; if (panel->backlight.device) { + drm_backlight_link(&connector->base, NULL); backlight_device_unregister(panel->backlight.device); panel->backlight.device = NULL; } @@ -1703,6 +1707,8 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe) panel->backlight.present = true; + drm_backlight_create_property(&connector->base, panel->backlight.max, false); + drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] backlight initialized, %s, brightness %u/%u\n", connector->base.base.id, connector->base.name, diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 9dfd095f325f7..d53e5f4bdf57d 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -7496,10 +7496,12 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state) struct intel_display *display = to_intel_display(state); struct intel_uncore *uncore = to_intel_uncore(display->drm); struct intel_crtc_state *new_crtc_state, *old_crtc_state; + struct drm_connector_state *new_conn_state; + struct drm_connector *connector; struct intel_crtc *crtc; struct intel_power_domain_mask put_domains[I915_MAX_PIPES] = {}; struct ref_tracker *wakeref = NULL; - int power_async_delay; + int power_async_delay, i; for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state) intel_atomic_dsb_prepare(state, crtc); @@ -7608,6 +7610,9 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state) /* Now enable the clocks, plane, pipe, and connectors that we set up. */ display->modeset.funcs->commit_modeset_enables(state); + for_each_new_connector_in_state(&state->base, connector, new_conn_state, i) + drm_atomic_helper_connector_apply_luminance(new_conn_state); + intel_display_power_dc3co_compute(state); /* FIXME probably need to sequence this properly */ -- 2.43.0
