diff options
Diffstat (limited to 'drivers/gpu/drm/display/drm_dp_helper.c')
| -rw-r--r-- | drivers/gpu/drm/display/drm_dp_helper.c | 44 | 
1 files changed, 30 insertions, 14 deletions
| diff --git a/drivers/gpu/drm/display/drm_dp_helper.c b/drivers/gpu/drm/display/drm_dp_helper.c index 896bba2adb3b..385a1bfdb272 100644 --- a/drivers/gpu/drm/display/drm_dp_helper.c +++ b/drivers/gpu/drm/display/drm_dp_helper.c @@ -693,6 +693,34 @@ void drm_dp_dpcd_set_powered(struct drm_dp_aux *aux, bool powered)  EXPORT_SYMBOL(drm_dp_dpcd_set_powered);  /** + * drm_dp_dpcd_set_probe() - Set whether a probing before DPCD access is done + * @aux: DisplayPort AUX channel + * @enable: Enable the probing if required + */ +void drm_dp_dpcd_set_probe(struct drm_dp_aux *aux, bool enable) +{ +	WRITE_ONCE(aux->dpcd_probe_disabled, !enable); +} +EXPORT_SYMBOL(drm_dp_dpcd_set_probe); + +static bool dpcd_access_needs_probe(struct drm_dp_aux *aux) +{ +	/* +	 * HP ZR24w corrupts the first DPCD access after entering power save +	 * mode. Eg. on a read, the entire buffer will be filled with the same +	 * byte. Do a throw away read to avoid corrupting anything we care +	 * about. Afterwards things will work correctly until the monitor +	 * gets woken up and subsequently re-enters power save mode. +	 * +	 * The user pressing any button on the monitor is enough to wake it +	 * up, so there is no particularly good place to do the workaround. +	 * We just have to do it before any DPCD access and hope that the +	 * monitor doesn't power down exactly after the throw away read. +	 */ +	return !aux->is_remote && !READ_ONCE(aux->dpcd_probe_disabled); +} + +/**   * drm_dp_dpcd_read() - read a series of bytes from the DPCD   * @aux: DisplayPort AUX channel (SST or MST)   * @offset: address of the (first) register to read @@ -713,20 +741,8 @@ ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset,  {  	int ret; -	/* -	 * HP ZR24w corrupts the first DPCD access after entering power save -	 * mode. Eg. on a read, the entire buffer will be filled with the same -	 * byte. Do a throw away read to avoid corrupting anything we care -	 * about. Afterwards things will work correctly until the monitor -	 * gets woken up and subsequently re-enters power save mode. -	 * -	 * The user pressing any button on the monitor is enough to wake it -	 * up, so there is no particularly good place to do the workaround. -	 * We just have to do it before any DPCD access and hope that the -	 * monitor doesn't power down exactly after the throw away read. -	 */ -	if (!aux->is_remote) { -		ret = drm_dp_dpcd_probe(aux, DP_DPCD_REV); +	if (dpcd_access_needs_probe(aux)) { +		ret = drm_dp_dpcd_probe(aux, DP_LANE0_1_STATUS);  		if (ret < 0)  			return ret;  	} | 
