Index | Thread | Search

From:
"Theo de Raadt" <deraadt@openbsd.org>
Subject:
Re: sys/qcdpc: blank eDP panels during suspend
To:
tech@openbsd.org
Date:
Mon, 05 Oct 2026 08:19:23 -0600

Download raw body.

Thread
ok deraadt

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
>