From: Kirill A. Korinsky Subject: Re: sys/qcdpc: blank eDP panels during suspend To: OpenBSD tech , "Kirill A. Korinsky" Date: Mon, 05 Oct 2026 15:33:51 +0200 and here the version where I have actually called config_activate_children() before switch off the panel. With all three patches my honor laptop goes to zzz and seems completley stop any fan activity that I treat as it actually sleep. 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 13:24:04 -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,44 @@ 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: + ret = config_activate_children(self, act); + + if (!sc->sc_bl.aux_enable) + return ret; + + if (!sc->sc_bl_suspended) { + if (drm_dp_dpcd_read_byte(&sc->sc_aux, + DP_EDP_DISPLAY_CONTROL_REGISTER, + &sc->sc_bl_control) < 0) + return ret; + sc->sc_bl_suspended = 1; + } + (void) drm_dp_dpcd_write_byte(&sc->sc_aux, + DP_EDP_DISPLAY_CONTROL_REGISTER, + DP_EDP_BLACK_VIDEO_ENABLE); + return ret; + + 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