On 27.10.2026 13:01, Alexandre Marquet via B4 Relay wrote: > From: Alexandre Marquet <[email protected]> > > Current functions exynos_dp_poweron()/exynos_dp_poweroff(), that > supposedly powers on/off the device, actually only enable the encoder > clock. This cause issues where poweron() calls fail silently in > analogix_dp_probe(), leading in some cases to a state were the encoder > is never enabled but the rest of the driver assumes that it is. > > Signed-off-by: Alexandre Marquet <[email protected]>
Tested-by: Marek Szyprowski <[email protected]> Snow, Peach-Pit and Peach-Pi Chromebooks work fine with this change. > --- > drivers/gpu/drm/exynos/exynos_dp.c | 40 > +++++++++++++------------------------- > 1 file changed, 13 insertions(+), 27 deletions(-) > > diff --git a/drivers/gpu/drm/exynos/exynos_dp.c > b/drivers/gpu/drm/exynos/exynos_dp.c > index 82c238829921..16b00aacd55b 100644 > --- a/drivers/gpu/drm/exynos/exynos_dp.c > +++ b/drivers/gpu/drm/exynos/exynos_dp.c > @@ -43,39 +43,27 @@ struct exynos_dp_device { > struct analogix_dp_plat_data plat_data; > }; > > -static int exynos_dp_crtc_clock_enable(struct analogix_dp_plat_data > *plat_data, > - bool enable) > -{ > - struct exynos_dp_device *dp = to_dp(plat_data); > - struct drm_encoder *encoder = &dp->encoder; > - > - if (!encoder->crtc) > - return -EPERM; > - > - exynos_drm_pipe_clk_enable(to_exynos_crtc(encoder->crtc), enable); > - > - return 0; > -} > - > -static int exynos_dp_poweron(struct analogix_dp_plat_data *plat_data) > +static void exynos_dp_mode_set(struct drm_encoder *encoder, > + struct drm_display_mode *mode, > + struct drm_display_mode *adjusted_mode) > { > - return exynos_dp_crtc_clock_enable(plat_data, true); > } > > -static int exynos_dp_poweroff(struct analogix_dp_plat_data *plat_data) > +static void exynos_dp_crtc_clock_enable(struct drm_encoder *encoder, > + bool enable) > { > - return exynos_dp_crtc_clock_enable(plat_data, false); > + if (encoder->crtc) > + exynos_drm_pipe_clk_enable(to_exynos_crtc(encoder->crtc), > enable); > } > > -static void exynos_dp_mode_set(struct drm_encoder *encoder, > - struct drm_display_mode *mode, > - struct drm_display_mode *adjusted_mode) > +static void exynos_dp_enable(struct drm_encoder *encoder) > { > + exynos_dp_crtc_clock_enable(encoder, true); > } > > -static void exynos_dp_nop(struct drm_encoder *encoder) > +static void exynos_dp_disable(struct drm_encoder *encoder) > { > - /* do nothing */ > + exynos_dp_crtc_clock_enable(encoder, false); > } > > static const struct drm_encoder_funcs exynos_dp_encoder_funcs = { > @@ -84,8 +72,8 @@ static const struct drm_encoder_funcs > exynos_dp_encoder_funcs = { > > static const struct drm_encoder_helper_funcs exynos_dp_encoder_helper_funcs > = { > .mode_set = exynos_dp_mode_set, > - .enable = exynos_dp_nop, > - .disable = exynos_dp_nop, > + .enable = exynos_dp_enable, > + .disable = exynos_dp_disable, > }; > > static int exynos_dp_bind(struct device *dev, struct device *master, void > *data) > @@ -171,8 +159,6 @@ static int exynos_dp_probe(struct platform_device *pdev) > > /* The remote port can be either a panel or a bridge */ > dp->plat_data.dev_type = EXYNOS_DP; > - dp->plat_data.power_on = exynos_dp_poweron; > - dp->plat_data.power_off = exynos_dp_poweroff; > dp->plat_data.ops = &exynos_dp_ops; > > dp->adp = analogix_dp_probe(dev, &dp->plat_data); > Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland
