drm/i915/backlight: fix CPU mode backlight takeover on LPT
The pch_get_backlight(), lpt_get_backlight(), and lpt_set_backlight() functions operate directly on the hardware registers. If inverting the value is needed, using intel_panel_compute_brightness(), it should only be done in the interface between hardware registers and panel->backlight.level. The CPU mode takeover code added in commitmaster5b1ec9ac7a
("drm/i915/backlight: Fix backlight takeover on LPT, v3.") reads the hardware register and converts to panel->backlight.level correctly, however the value written back should remain in the hardware register "domain". This hasn't been an issue, because GM45 machines are the only known users of i915.invert_brightness and the brightness invert quirk, and without one of them no conversion is made. It's likely nobody's ever hit the problem. Fixes:5b1ec9ac7a
("drm/i915/backlight: Fix backlight takeover on LPT, v3.") Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Lyude Paul <lyude@redhat.com> Cc: <stable@vger.kernel.org> # v5.1+ Reviewed-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210108152841.6944-1-jani.nikula@intel.com (cherry picked from commit0d4ced1c5b
) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
parent
057fe3535e
commit
bb83d5fb55
|
@ -1650,16 +1650,13 @@ static int lpt_setup_backlight(struct intel_connector *connector, enum pipe unus
|
||||||
val = pch_get_backlight(connector);
|
val = pch_get_backlight(connector);
|
||||||
else
|
else
|
||||||
val = lpt_get_backlight(connector);
|
val = lpt_get_backlight(connector);
|
||||||
val = intel_panel_compute_brightness(connector, val);
|
|
||||||
panel->backlight.level = clamp(val, panel->backlight.min,
|
|
||||||
panel->backlight.max);
|
|
||||||
|
|
||||||
if (cpu_mode) {
|
if (cpu_mode) {
|
||||||
drm_dbg_kms(&dev_priv->drm,
|
drm_dbg_kms(&dev_priv->drm,
|
||||||
"CPU backlight register was enabled, switching to PCH override\n");
|
"CPU backlight register was enabled, switching to PCH override\n");
|
||||||
|
|
||||||
/* Write converted CPU PWM value to PCH override register */
|
/* Write converted CPU PWM value to PCH override register */
|
||||||
lpt_set_backlight(connector->base.state, panel->backlight.level);
|
lpt_set_backlight(connector->base.state, val);
|
||||||
intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
|
intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
|
||||||
pch_ctl1 | BLM_PCH_OVERRIDE_ENABLE);
|
pch_ctl1 | BLM_PCH_OVERRIDE_ENABLE);
|
||||||
|
|
||||||
|
@ -1667,6 +1664,10 @@ static int lpt_setup_backlight(struct intel_connector *connector, enum pipe unus
|
||||||
cpu_ctl2 & ~BLM_PWM_ENABLE);
|
cpu_ctl2 & ~BLM_PWM_ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val = intel_panel_compute_brightness(connector, val);
|
||||||
|
panel->backlight.level = clamp(val, panel->backlight.min,
|
||||||
|
panel->backlight.max);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue