Commit 64659648 authored by Lyude Paul's avatar Lyude Paul

drm/dp: Don't read back backlight mode in drm_edp_backlight_enable()

As it turns out, apparently some machines will actually leave additional
backlight functionality like dynamic backlight control on before the OS
loads. Currently we don't take care to disable unsupported features when
writing back the backlight mode, which can lead to some rather strange
looking behavior when adjusting the backlight.

So, let's fix this by just not reading back the current backlight mode on
initial enable. I don't think there should really be any downsides to this,
and this will ensure we don't leave any unsupported functionality enabled.

This should fix at least one (but not all) of the issues seen with DPCD
backlight support on fi-bdw-samus

v5:
* Just avoid reading back DPCD register - Doug Anderson
Signed-off-by: default avatarLyude Paul <lyude@redhat.com>
Fixes: 867cf9cd ("drm/dp: Extract i915's eDP backlight code into DRM helpers")
Reviewed-by: default avatarDouglas Anderson <dianders@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20211105183342.130810-4-lyude@redhat.com
parent f5dee128
...@@ -3363,27 +3363,13 @@ int drm_edp_backlight_enable(struct drm_dp_aux *aux, const struct drm_edp_backli ...@@ -3363,27 +3363,13 @@ int drm_edp_backlight_enable(struct drm_dp_aux *aux, const struct drm_edp_backli
const u16 level) const u16 level)
{ {
int ret; int ret;
u8 dpcd_buf, new_dpcd_buf; u8 dpcd_buf = DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD;
ret = drm_dp_dpcd_readb(aux, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, &dpcd_buf); if (bl->pwmgen_bit_count) {
if (ret != 1) { ret = drm_dp_dpcd_writeb(aux, DP_EDP_PWMGEN_BIT_COUNT, bl->pwmgen_bit_count);
drm_dbg_kms(aux->drm_dev, if (ret != 1)
"%s: Failed to read backlight mode: %d\n", aux->name, ret); drm_dbg_kms(aux->drm_dev, "%s: Failed to write aux pwmgen bit count: %d\n",
return ret < 0 ? ret : -EIO; aux->name, ret);
}
new_dpcd_buf = dpcd_buf;
if ((dpcd_buf & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) != DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD) {
new_dpcd_buf &= ~DP_EDP_BACKLIGHT_CONTROL_MODE_MASK;
new_dpcd_buf |= DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD;
if (bl->pwmgen_bit_count) {
ret = drm_dp_dpcd_writeb(aux, DP_EDP_PWMGEN_BIT_COUNT, bl->pwmgen_bit_count);
if (ret != 1)
drm_dbg_kms(aux->drm_dev, "%s: Failed to write aux pwmgen bit count: %d\n",
aux->name, ret);
}
} }
if (bl->pwm_freq_pre_divider) { if (bl->pwm_freq_pre_divider) {
...@@ -3393,16 +3379,14 @@ int drm_edp_backlight_enable(struct drm_dp_aux *aux, const struct drm_edp_backli ...@@ -3393,16 +3379,14 @@ int drm_edp_backlight_enable(struct drm_dp_aux *aux, const struct drm_edp_backli
"%s: Failed to write aux backlight frequency: %d\n", "%s: Failed to write aux backlight frequency: %d\n",
aux->name, ret); aux->name, ret);
else else
new_dpcd_buf |= DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE; dpcd_buf |= DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE;
} }
if (new_dpcd_buf != dpcd_buf) { ret = drm_dp_dpcd_writeb(aux, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, dpcd_buf);
ret = drm_dp_dpcd_writeb(aux, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, new_dpcd_buf); if (ret != 1) {
if (ret != 1) { drm_dbg_kms(aux->drm_dev, "%s: Failed to write aux backlight mode: %d\n",
drm_dbg_kms(aux->drm_dev, "%s: Failed to write aux backlight mode: %d\n", aux->name, ret);
aux->name, ret); return ret < 0 ? ret : -EIO;
return ret < 0 ? ret : -EIO;
}
} }
ret = drm_edp_backlight_set_level(aux, bl, level); ret = drm_edp_backlight_set_level(aux, bl, level);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment