Hi,

On Mon, Oct 26, 2026 at 6:14 PM Haipeng Lin via B4 Relay
<[email protected]> wrote:
>
> From: Haipeng Lin <[email protected]>
>
> pwm-backlight can preserve the enabled state left by firmware to
> support a seamless display handoff. However, panel-edp does not support
> such a handoff. When probing a generic eDP panel, it powers the panel
> on to read its EDID. If display pipeline binding takes longer than the
> runtime-PM autosuspend delay, the panel is then powered off while the
> backlight remains enabled.
>
> On the Surface Pro 11 LCD (LGD0779), leaving BL_EN high across this
> power cycle appears to leave the backlight controller in an incorrect
> state: brightness is pinned near maximum with a greatly reduced
> dimming range. Subsequent brightness changes update the PWM duty, but
> do not restore it to normal. Cycling the backlight off and on at
> unchanged brightness restores the full range.
>
> The first drm_panel_enable() does not recover from this because
> pwm-backlight still considers itself enabled and leaves BL_EN high.
>
> Disable the backlight at probe, after acquiring it and before enabling
> runtime PM. This clears the firmware's enabled state so the DRM panel
> core turns the backlight on after panel power and video are ready at
> the first modeset.
>
> This also turns off the firmware display at probe on systems where it
> previously remained lit until the first modeset.
>
> Verified on the Surface Pro 11 LCD by delaying display pipeline bind
> past the autosuspend timeout. BL_EN now drops at probe, before panel
> runtime autosuspend, and brightness control works at the first modeset.
>
> Fixes: 5540cf8f3e8d ("drm/panel-edp: Implement generic "edp-panel"s probed by 
> EDID")
> Link: https://github.com/dwhinham/archiso-aarch64-sp11/issues/41
> Suggested-by: Douglas Anderson <[email protected]>
> Assisted-by: LLM
> Signed-off-by: Haipeng Lin <[email protected]>
> ---
> Can reproduce on an installed system on Surface Pro 11 LCD (X1P-64-100,
> LGD0779 LCD) by booting with modprobe.blacklist=phy_qcom_qmp_combo then
> loading that module manually after ~20s. This delays DPU component bind
> past the panel's runtime autosuspend timeout.
>
> A/B tested against the same v7.2 tree:
>
> - Unpatched: panel VDD off 3.5s..20.5s while BL_EN stays high.
> After the first modeset brightness is pinned near max brightness with
> a "collapsed" dimming range. sysfs brightness writes still reprogram
> the PMIC LPG. One bl_power off/on cycle at unchanged brightness
> restores the full range.
>
> - Patched v2: patch provides the same full brightness range on boot
> (stalled or not) as the v1 patch. BL_EN drops at panel-edp probe,
> ~1s before VDD cut, rises ~0.5s after panel power at the first modeset.
>
> Tracing and functional testing on the SP11 shows unchanged sequencing
> for fast boots (without artificial delay), DPMS off/on, and system
> suspend/resume.
>
> Panels with shared/always-on supplies and no panel enable GPIO
> may continue displaying the firmware framebuffer during the
> runtime suspend before first modeset. With this change panel-edp
> disables the backlight obtained through the backlight phandle at probe.
> The DRM panel core enables the backlight again at the first modeset.
> I have not tested this configuration.
>
> Testing on other panel-edp systems particularly with pwm-backlight,
> would be appreciated.
> ---
> Changes in v2:
> - Disables the backlight once at probe instead of
>   in panel_edp_suspend() following Doug Anderson's suggestion.
> - Only disable the backlight obtained through the backlight phandle.
>   The driver's AUX backlight setup is untouched.
> - Link to v1: 
> https://lore.kernel.org/r/[email protected]
> ---
>  drivers/gpu/drm/panel/panel-edp.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)
>
> diff --git a/drivers/gpu/drm/panel/panel-edp.c 
> b/drivers/gpu/drm/panel/panel-edp.c
> index 94bc54c3833a..d019f4165674 100644
> --- a/drivers/gpu/drm/panel/panel-edp.c
> +++ b/drivers/gpu/drm/panel/panel-edp.c
> @@ -21,6 +21,7 @@
>   * DEALINGS IN THE SOFTWARE.
>   */
>
> +#include <linux/backlight.h>
>  #include <linux/debugfs.h>
>  #include <linux/delay.h>
>  #include <linux/gpio/consumer.h>
> @@ -918,6 +919,16 @@ static int panel_edp_probe(struct device *dev, const 
> struct panel_desc *desc,
>         if (err)
>                 return err;
>
> +       /*
> +        * Backlight drivers may preserve the state left by firmware,
> +        * but panel-edp does not support seamless handoff.
> +        * Runtime PM may power off the panel before the first modeset,
> +        * leaving the backlight on.
> +        * Disable it here so the DRM panel core enables it in the correct
> +        * order at the first modeset.
> +        */
> +       backlight_disable(panel->base.backlight);

While still feeling a little ugly, I can't think of anything better to
do in this case. Thus I'd say:

Reviewed-by: Douglas Anderson <[email protected]>

I'd prefer to get a second opinion from someone else in the DRM
community to make sure I'm not missing something, though. Neil,
Maxime, or Linus W maybe?

Reply via email to