From: Kirill A. Korinsky Subject: Re: sys/qcdpc: blank eDP panels during suspend To: tech@openbsd.org Date: Mon, 05 Oct 2026 14:28:24 +0200 Theo, thanks for review. after some additional thinking, I think we don't need that complexity and ends with simple call of black screen: (void) drm_dp_dpcd_write_byte(&sc->sc_aux, DP_EDP_DISPLAY_CONTROL_REGISTER, DP_EDP_BLACK_VIDEO_ENABLE); so, I have ended with this code. It works on my device, but suspend and hibernate logic is complicated, but I think I haven't broke it this time. Index: sys/dev/fdt/qcdpc.c =================================================================== RCS file: /home/cvs/src/sys/dev/fdt/qcdpc.c,v diff -u -p -r1.2 qcdpc.c --- sys/dev/fdt/qcdpc.c 9 Mar 2026 23:57:53 -0000 1.2 +++ sys/dev/fdt/qcdpc.c 5 Oct 2026 12:02:48 -0000 @@ -71,15 +71,19 @@ struct qcdpc_softc { struct drm_edp_backlight_info sc_bl; uint32_t sc_bl_level; + uint8_t sc_bl_control; + int sc_bl_suspended; }; struct qcdpc_softc *qcdpc_bl; int qcdpc_match(struct device *, void *, void *); void qcdpc_attach(struct device *, struct device *, void *); +int qcdpc_activate(struct device *, int); const struct cfattach qcdpc_ca = { - sizeof(struct qcdpc_softc), qcdpc_match, qcdpc_attach + sizeof(struct qcdpc_softc), qcdpc_match, qcdpc_attach, + NULL, qcdpc_activate }; struct cfdriver qcdpc_cd = { @@ -174,6 +178,42 @@ qcdpc_attach(struct device *parent, stru fa.fa_node = node; config_found(self, &fa, qcdpc_print); } +} + +int +qcdpc_activate(struct device *self, int act) +{ + struct qcdpc_softc *sc = (struct qcdpc_softc *)self; + int ret; + + switch (act) { + case DVACT_QUIESCE: + if (!sc->sc_bl.aux_enable) + break; + + if (!sc->sc_bl_suspended) { + ret = drm_dp_dpcd_read_byte(&sc->sc_aux, + DP_EDP_DISPLAY_CONTROL_REGISTER, &sc->sc_bl_control); + if (ret < 0) + break; + sc->sc_bl_suspended = 1; + } + (void) drm_dp_dpcd_write_byte(&sc->sc_aux, + DP_EDP_DISPLAY_CONTROL_REGISTER, + DP_EDP_BLACK_VIDEO_ENABLE); + break; + + case DVACT_WAKEUP: + if (sc->sc_bl_suspended) { + ret = drm_dp_dpcd_write_byte(&sc->sc_aux, + DP_EDP_DISPLAY_CONTROL_REGISTER, sc->sc_bl_control); + if (ret == 0) + sc->sc_bl_suspended = 0; + } + break; + } + + return config_activate_children(self, act); } int -- wbr, Kirill