Merge v5.16-rc5 into drm-next
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / display / intel_dp_aux_backlight.c
index 3897468..62c112d 100644 (file)
@@ -287,6 +287,12 @@ intel_dp_aux_vesa_set_backlight(const struct drm_connector_state *conn_state, u3
        struct intel_panel *panel = &connector->panel;
        struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
 
+       if (!panel->backlight.edp.vesa.info.aux_set) {
+               const u32 pwm_level = intel_backlight_level_to_pwm(connector, level);
+
+               intel_backlight_set_pwm_level(conn_state, pwm_level);
+       }
+
        drm_edp_backlight_set_level(&intel_dp->aux, &panel->backlight.edp.vesa.info, level);
 }
 
@@ -299,8 +305,13 @@ intel_dp_aux_vesa_enable_backlight(const struct intel_crtc_state *crtc_state,
        struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
 
        if (!panel->backlight.edp.vesa.info.aux_enable) {
-               u32 pwm_level = intel_backlight_invert_pwm_level(connector,
-                                                                panel->backlight.pwm_level_max);
+               u32 pwm_level;
+
+               if (!panel->backlight.edp.vesa.info.aux_set)
+                       pwm_level = intel_backlight_level_to_pwm(connector, level);
+               else
+                       pwm_level = intel_backlight_invert_pwm_level(connector,
+                                                                    panel->backlight.pwm_level_max);
 
                panel->backlight.pwm_funcs->enable(crtc_state, conn_state, pwm_level);
        }
@@ -337,7 +348,7 @@ static int intel_dp_aux_vesa_setup_backlight(struct intel_connector *connector,
        if (ret < 0)
                return ret;
 
-       if (!panel->backlight.edp.vesa.info.aux_enable) {
+       if (!panel->backlight.edp.vesa.info.aux_set || !panel->backlight.edp.vesa.info.aux_enable) {
                ret = panel->backlight.pwm_funcs->setup(connector, pipe);
                if (ret < 0) {
                        drm_err(&i915->drm,
@@ -346,14 +357,27 @@ static int intel_dp_aux_vesa_setup_backlight(struct intel_connector *connector,
                        return ret;
                }
        }
-       panel->backlight.max = panel->backlight.edp.vesa.info.max;
-       panel->backlight.min = 0;
-       if (current_mode == DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD) {
-               panel->backlight.level = current_level;
-               panel->backlight.enabled = panel->backlight.level != 0;
+
+       if (panel->backlight.edp.vesa.info.aux_set) {
+               panel->backlight.max = panel->backlight.edp.vesa.info.max;
+               panel->backlight.min = 0;
+               if (current_mode == DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD) {
+                       panel->backlight.level = current_level;
+                       panel->backlight.enabled = panel->backlight.level != 0;
+               } else {
+                       panel->backlight.level = panel->backlight.max;
+                       panel->backlight.enabled = false;
+               }
        } else {
-               panel->backlight.level = panel->backlight.max;
-               panel->backlight.enabled = false;
+               panel->backlight.max = panel->backlight.pwm_level_max;
+               panel->backlight.min = panel->backlight.pwm_level_min;
+               if (current_mode == DP_EDP_BACKLIGHT_CONTROL_MODE_PWM) {
+                       panel->backlight.level = panel->backlight.pwm_funcs->get(connector, pipe);
+                       panel->backlight.enabled = panel->backlight.pwm_enabled;
+               } else {
+                       panel->backlight.level = panel->backlight.max;
+                       panel->backlight.enabled = false;
+               }
        }
 
        return 0;
@@ -437,11 +461,17 @@ int intel_dp_aux_init_backlight_funcs(struct intel_connector *connector)
        }
 
        /*
-        * A lot of eDP panels in the wild will report supporting both the
-        * Intel proprietary backlight control interface, and the VESA
-        * backlight control interface. Many of these panels are liars though,
-        * and will only work with the Intel interface. So, always probe for
-        * that first.
+        * Since Intel has their own backlight control interface, the majority of machines out there
+        * using DPCD backlight controls with Intel GPUs will be using this interface as opposed to
+        * the VESA interface. However, other GPUs (such as Nvidia's) will always use the VESA
+        * interface. This means that there's quite a number of panels out there that will advertise
+        * support for both interfaces, primarily systems with Intel/Nvidia hybrid GPU setups.
+        *
+        * There's a catch to this though: on many panels that advertise support for both
+        * interfaces, the VESA backlight interface will stop working once we've programmed the
+        * panel with Intel's OUI - which is also required for us to be able to detect Intel's
+        * backlight interface at all. This means that the only sensible way for us to detect both
+        * interfaces is to probe for Intel's first, and VESA's second.
         */
        if (try_intel_interface && intel_dp_aux_supports_hdr_backlight(connector)) {
                drm_dbg_kms(dev, "Using Intel proprietary eDP backlight controls\n");