Commit e7d9f17b authored by Douglas Anderson's avatar Douglas Anderson Committed by Ma Wupeng
Browse files

drm/panel: atna33xc20: Fix unbalanced regulator in the case HPD doesn't assert

stable inclusion
from stable-v6.6.33
commit 859da9472b4f170eb2c58cbf0c43dcfc84c63de3
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAD6H2

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=859da9472b4f170eb2c58cbf0c43dcfc84c63de3

--------------------------------

[ Upstream commit 5e842d55bad7794823a50f24fd645b58f2ef93ab ]

When the atna33xc20 driver was first written the resume code never
returned an error. If there was a problem waiting for HPD it just
printed a warning and moved on. This changed in response to review
feedback [1] on a future patch but I accidentally didn't account for
rolling back the regulator enable in the error cases. Do so now.

[1] https://lore.kernel.org/all/5f3cf3a6-1cc2-63e4-f76b-4ee686764705@linaro.org/



Fixes: 3b5765df ("drm/panel: atna33xc20: Take advantage of wait_hpd_asserted() in struct drm_dp_aux")
Acked-by: default avatarJessica Zhang <quic_jesszhan@quicinc.com>
Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240313-homestarpanel-regulator-v1-1-b8e3a336da12@chromium.org


Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarWang Hai <wanghai38@huawei.com>
parent 26359bcb
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -109,19 +109,17 @@ static int atana33xc20_resume(struct device *dev)
		if (hpd_asserted < 0)
			ret = hpd_asserted;

		if (ret)
		if (ret) {
			dev_warn(dev, "Error waiting for HPD GPIO: %d\n", ret);

		return ret;
			goto error;
		}

	if (p->aux->wait_hpd_asserted) {
	} else if (p->aux->wait_hpd_asserted) {
		ret = p->aux->wait_hpd_asserted(p->aux, HPD_MAX_US);

		if (ret)
		if (ret) {
			dev_warn(dev, "Controller error waiting for HPD: %d\n", ret);

		return ret;
			goto error;
		}
	}

	/*
@@ -133,6 +131,12 @@ static int atana33xc20_resume(struct device *dev)
	 * right times.
	 */
	return 0;

error:
	drm_dp_dpcd_set_powered(p->aux, false);
	regulator_disable(p->supply);

	return ret;
}

static int atana33xc20_disable(struct drm_panel *panel)