Download raw body.
sys/qcdpc: blank eDP panels during suspend
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
sys/qcdpc: blank eDP panels during suspend