Index | Thread | Search

From:
Mark Kettenis <mark.kettenis@xs4all.nl>
Subject:
Re: sys/qcdpc: blank eDP panels during suspend
To:
"Theo de Raadt" <deraadt@openbsd.org>
Cc:
tech@openbsd.org
Date:
Mon, 05 Oct 2026 17:05:01 +0200

Download raw body.

Thread
> From: "Theo de Raadt" <deraadt@openbsd.org>
> Date: Mon, 05 Oct 2026 08:19:23 -0600
> 
> ok deraadt

Please don't commit yet.  I have some questions and this needs
testing.

> Kirill A. Korinsky <kirill@korins.ky> wrote:
> 
> > 
> > 
> > and here I belive the correct diff.
> > 
> > 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 14:05:20 -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,46 @@ 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 (ret)
> > +			return ret;
> > +		if (!sc->sc_bl.aux_enable)
> > +			break;
> > +
> > +		if (!sc->sc_bl_suspended) {
> > +			if (drm_dp_dpcd_read_byte(&sc->sc_aux,
> > +			    DP_EDP_DISPLAY_CONTROL_REGISTER,
> > +			    &sc->sc_bl_control) < 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) {
> > +			if (drm_dp_dpcd_write_byte(&sc->sc_aux,
> > +			    DP_EDP_DISPLAY_CONTROL_REGISTER,
> > +			    sc->sc_bl_control) == 0)
> > +				sc->sc_bl_suspended = 0;
> > +		}
> > +		return config_activate_children(self, act);
> > +	default:
> > +		return config_activate_children(self, act);
> > +	}
> > +
> > +	return ret;
> >  }
> >  
> >  int
> > 
> > 
> > -- 
> > wbr, Kirill
> > 
> 
>