]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/dp: Modify drm_edp_probe_state
authorSuraj Kandpal <suraj.kandpal@intel.com>
Fri, 20 Jun 2025 06:34:38 +0000 (12:04 +0530)
committerSuraj Kandpal <suraj.kandpal@intel.com>
Mon, 30 Jun 2025 15:11:44 +0000 (20:41 +0530)
Modify drm_edp_probe_state to read current level from
DP_EDP_PANEL_TARGET_LUMINANCE_VALUE. We divide it by
1000 since the value in this register is in millinits.

--v2
-Add comment on the unit sent back [Arun]

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
Link: https://lore.kernel.org/r/20250620063445.3603086-7-suraj.kandpal@intel.com
drivers/gpu/drm/display/drm_dp_helper.c

index 374db5f85bfa7daeb5c2dfddd7096947d1d121c6..8a4fecf2fb91c05eafb0a45b553ad73f127d6b1f 100644 (file)
@@ -4193,7 +4193,7 @@ drm_edp_backlight_probe_state(struct drm_dp_aux *aux, struct drm_edp_backlight_i
                              u8 *current_mode)
 {
        int ret;
-       u8 buf[2];
+       u8 buf[3];
        u8 mode_reg;
 
        ret = drm_dp_dpcd_read_byte(aux, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, &mode_reg);
@@ -4210,17 +4210,37 @@ drm_edp_backlight_probe_state(struct drm_dp_aux *aux, struct drm_edp_backlight_i
        if (*current_mode == DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD) {
                int size = 1 + bl->lsb_reg_used;
 
-               ret = drm_dp_dpcd_read_data(aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB, buf, size);
-               if (ret < 0) {
-                       drm_dbg_kms(aux->drm_dev, "%s: Failed to read backlight level: %d\n",
-                                   aux->name, ret);
-                       return ret;
+               if (bl->luminance_set) {
+                       ret = drm_dp_dpcd_read_data(aux, DP_EDP_PANEL_TARGET_LUMINANCE_VALUE,
+                                                   buf, sizeof(buf));
+                       if (ret < 0) {
+                               drm_dbg_kms(aux->drm_dev,
+                                           "%s: Failed to read backlight level: %d\n",
+                                           aux->name, ret);
+                               return ret;
                }
 
-               if (bl->lsb_reg_used)
-                       return (buf[0] << 8) | buf[1];
-               else
-                       return buf[0];
+               /*
+                * Incase luminance is set we want to send the value back in nits but since
+                * DP_EDP_PANEL_TARGET_LUMINANCE stores values in millinits we need to divide
+                * by 1000.
+                */
+               return (buf[0] | buf[1] << 8 | buf[2] << 16) / 1000;
+               } else {
+                       ret = drm_dp_dpcd_read_data(aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB,
+                                                   buf, size);
+                       if (ret < 0) {
+                               drm_dbg_kms(aux->drm_dev,
+                                           "%s: Failed to read backlight level: %d\n",
+                                           aux->name, ret);
+                               return ret;
+                       }
+
+                       if (bl->lsb_reg_used)
+                               return (buf[0] << 8) | buf[1];
+                       else
+                               return buf[0];
+               }
        }
 
        /*