From nobody Fri Oct 2 06:58:48 2026 Received: from mail-m49204.qiye.163.com (mail-m49204.qiye.163.com [45.254.49.204]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4020C3BE64B; Tue, 4 Aug 2026 08:22:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.254.49.204 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785831771; cv=none; b=D5qFnqBVBnuRZG8SjK4GCaSDyQL7O1rGlPRB0q0mLtQC7htar4eXBwNshyvHkaHYUWjQdr16CDq/FZYWMdQPHetU2VQLm133Xro86IlW8xJ6xizRibb3SXx2BW6HpxLsyqwbU59LhU2XmMdNoiEE9Fwd6sXJmjYWQIpd01BwHdQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785831771; c=relaxed/simple; bh=/kkyMtkZbTAeJAq1U79w2h/ozKGGe8okIE37ucXmQ8g=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=NEpFSwcoiJeclOmryzZ07h9/wpI3Jl9CGOz1ipvdemlHP6RSlFb2gkkbYMjPpWtuuO1kHSkJkR9TeppoubhGVS4Sw6N0X36yFQhSU2LGN7KAH7qWoHRFrxAua+Pgx8U6JxtNJKn7pbMUUvH9tQtyhjzZ1nPkdpPCkOs3PRU2Upk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=COTTmiAC; arc=none smtp.client-ip=45.254.49.204 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="COTTmiAC" Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 48b4ffecd; Tue, 4 Aug 2026 16:17:24 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Heiko Stuebner , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Damon Ding Subject: [PATCH v2 01/10] drm/bridge: analogix_dp: Manage pm runtime and IRQ for native HPD pin detection Date: Tue, 4 Aug 2026 16:17:08 +0800 Message-Id: <20260804081717.741404-2-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260804081717.741404-1-damon.ding@rock-chips.com> References: <20260804081717.741404-1-damon.ding@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9fcbd9516f03a8kunma7b8cbe762b076 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlCH0pIVh9CHxpLSEoYHR9NGVYVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSU 9PT0hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=COTTmiACHu7mxiymeHQGDhyj3CKtjMupOmAokxY9vQPfojYz1PeK6+IC7JVw6+ku/BzJqKTFN3thAcpABeAL8GYkHhNRatvoQCKzY/OeAoYY4cduEyTDiEacJnUtPyDpncmhvXh/tgKgo87RrFM4kDMbbtSiGn6NvttX+oLktVk=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=uv2XD3C+LzzidqmvYrqHbQN4LFdznI4u/re75CGmFaQ=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" On Rockchip platforms, the Analogix DP native HPD pin IRQ functionality requires the DP controller to be powered, clocked and initialized to generate plug/unplug interrupts correctly. To keep HPD detection active while the display is disabled, move enable_irq()/disable_irq() out of bridge enable/disable handlers and split IRQ management paths: - Native HPD pin mode: enable IRQ in analogix_dp_bind() and disable in analogix_dp_unbind(). Hold runtime PM power to keep controller alive for hotplug interrupts. - GPIO HPD and force-HPD modes: retain original logic, manage IRQ within bridge enable/disable callbacks. Persistent power hold is only necessary for native HPD pin mode. It is not required for force-HPD or GPIO HPD modes. Add helper analogix_dp_require_pm_for_hpd_irq() to identify Rockchip native HPD pin configurations and switch IRQ handling accordingly. Signed-off-by: Damon Ding --- Change in v2: - Split IRQ enable/disable logic, handle native HPD pin and GPIO/force-HPD modes separately to avoid unbalanced enable_irq() calls.(Sashiko) --- .../drm/bridge/analogix/analogix_dp_core.c | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.c index 8d3d4a6e6ca2..18f300b49644 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -40,6 +40,12 @@ =20 static const bool verify_fast_training; =20 +static bool analogix_dp_require_pm_for_hpd_irq(struct analogix_dp_device *= dp) +{ + return analogix_dp_is_rockchip(dp->plat_data->dev_type) && !dp->hpd_gpiod= && + !dp->force_hpd; +} + static void analogix_dp_init_dp(struct analogix_dp_device *dp) { analogix_dp_reset(dp); @@ -1014,7 +1020,8 @@ static int analogix_dp_set_bridge(struct analogix_dp_= device *dp) goto out_dp_init; } =20 - enable_irq(dp->irq); + if (!analogix_dp_require_pm_for_hpd_irq(dp)) + enable_irq(dp->irq); return 0; =20 out_dp_init: @@ -1156,7 +1163,8 @@ static void analogix_dp_bridge_disable(struct drm_bri= dge *bridge) if (dp->dpms_mode !=3D DRM_MODE_DPMS_ON) return; =20 - disable_irq(dp->irq); + if (!analogix_dp_require_pm_for_hpd_irq(dp)) + disable_irq(dp->irq); =20 analogix_dp_set_analog_power_down(dp, POWER_ALL, 1); =20 @@ -1504,6 +1512,14 @@ int analogix_dp_bind(struct analogix_dp_device *dp, = struct drm_device *drm_dev) goto err_unregister_aux; } =20 + if (analogix_dp_require_pm_for_hpd_irq(dp)) { + ret =3D pm_runtime_resume_and_get(dp->dev); + if (ret) + goto err_unregister_aux; + + enable_irq(dp->irq); + } + return 0; =20 err_unregister_aux: @@ -1515,6 +1531,11 @@ EXPORT_SYMBOL_GPL(analogix_dp_bind); =20 void analogix_dp_unbind(struct analogix_dp_device *dp) { + if (analogix_dp_require_pm_for_hpd_irq(dp)) { + disable_irq(dp->irq); + pm_runtime_put_sync(dp->dev); + } + drm_dp_aux_unregister(&dp->aux); } EXPORT_SYMBOL_GPL(analogix_dp_unbind); --=20 2.34.1 From nobody Fri Oct 2 06:58:48 2026 Received: from mail-m49231.qiye.163.com (mail-m49231.qiye.163.com [45.254.49.231]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA4814399D1; Tue, 4 Aug 2026 08:22:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.254.49.231 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785831775; cv=none; b=IK3UQDVmA8iQYqvfRWjHYMim4cxNLU9nUgFD18HqeJBkME0CaklFTd4l6+rCTb/UxH+dSWRm30NqDuwRzyZFS5alsHBFysc3x2I/RFctVyGyx2+AFMuWgwDepFHxGyAwpA33VNn2Z+RrGRLoG3ZqnAVRBFbhUiBqqCSphgQMmCA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785831775; c=relaxed/simple; bh=Mplj6l8Vb66v9F4gcH/xp9crlS0LixG6mqPb8eKnuHo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rxxiqxzpBHgbKUtu+1AMz5kVRLed3m+dUQ6atSvntoGjLiHKm9bmc9YZgTjfYRRuZKgGzWC0BPjnGpbRDoc+mioQZG2G6roV1hSwIGeG/LN6Co7lI3/c7a8iCKDkHwnaBpSE3Fdmg2lN7zoBiewxdglPCbuCli/Sv+j2ckXJmWo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=H5i8vf53; arc=none smtp.client-ip=45.254.49.231 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="H5i8vf53" Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 48b4ffed3; Tue, 4 Aug 2026 16:17:26 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Heiko Stuebner , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Damon Ding Subject: [PATCH v2 02/10] drm/bridge: analogix_dp: Return bitmask from analogix_dp_get_irq_type() Date: Tue, 4 Aug 2026 16:17:09 +0800 Message-Id: <20260804081717.741404-3-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260804081717.741404-1-damon.ding@rock-chips.com> References: <20260804081717.741404-1-damon.ding@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9fcbd9564d03a8kunma7b8cbe762b080 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlCThhLVk5PS0hMTx5KTkxMGFYVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSE pKQk1VSktLVUpCWQY+ DKIM-Signature: a=rsa-sha256; b=H5i8vf53DsHE9nais/Pv+kAcfh/JZX3LR9TRWmXPNM2KVzF9dhdd8/STp9o0bKzm3EtHKAxLDPpHq++mJ/yfUA5Cn06FhOqONNJHADapr3cn2DtJecLn/vg8P2F8AFF8z7tZjVP+99YyjfaI+o8bUxPTA3jXUFPTzFDFcYx/Fq8=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=YGYojIb0fMEZEgKZbtpHU3IN7GPrQMf40SfosYPELAI=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" Analogix DP controllers support two sets of interrupts for hotplug detection: HOTPLUG_CHG, and the pair PLUG / HPD_LOST. The current driver logic relies on PLUG/HPD_LOST and does not consume HOTPLUG_CHG, nor does it check for INT_HPD for IRQ_HPD events. The existing analogix_dp_get_irq_type() returns on the first matched interrupt flag. This causes the hardirq handler to unconditionally mute all HPD interrupts, including HOTPLUG_CHG and INT_HPD, creating a limitation for future extensions. To prepare fine-grained interrupt handling, convert the return type from enum dp_irq_type to a u32 bitmask. Accumulate all pending interrupt flags instead of returning early, and add detection for DP_IRQ_TYPE_IRQ_HPD. Remove DP_IRQ_TYPE_UNKNOWN sentinel; use zero to indicate no pending interrupts, which simplifies code and facilitates future extension for additional interrupt types. This prepares subsequent changes to pass specific irq flags into mute/unmute helpers for selective interrupt control. Signed-off-by: Damon Ding --- .../gpu/drm/bridge/analogix/analogix_dp_core.c | 8 ++++---- .../gpu/drm/bridge/analogix/analogix_dp_core.h | 4 ++-- .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 18 ++++++++++-------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.c index 18f300b49644..7ef8ef812b55 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -704,10 +704,10 @@ static irqreturn_t analogix_dp_hardirq(int irq, void = *arg) { struct analogix_dp_device *dp =3D arg; irqreturn_t ret =3D IRQ_NONE; - enum dp_irq_type irq_type; + u32 irq_type; =20 irq_type =3D analogix_dp_get_irq_type(dp); - if (irq_type !=3D DP_IRQ_TYPE_UNKNOWN) { + if (irq_type) { analogix_dp_mute_hpd_interrupt(dp); ret =3D IRQ_WAKE_THREAD; } @@ -718,7 +718,7 @@ static irqreturn_t analogix_dp_hardirq(int irq, void *a= rg) static irqreturn_t analogix_dp_irq_thread(int irq, void *arg) { struct analogix_dp_device *dp =3D arg; - enum dp_irq_type irq_type; + u32 irq_type; =20 irq_type =3D analogix_dp_get_irq_type(dp); if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN || @@ -728,7 +728,7 @@ static irqreturn_t analogix_dp_irq_thread(int irq, void= *arg) drm_helper_hpd_irq_event(dp->drm_dev); } =20 - if (irq_type !=3D DP_IRQ_TYPE_UNKNOWN) { + if (irq_type) { analogix_dp_clear_hotplug_interrupts(dp); analogix_dp_unmute_hpd_interrupt(dp); } diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.h index c7997677a286..c2eba77f9a81 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h @@ -120,7 +120,7 @@ enum dp_irq_type { DP_IRQ_TYPE_HP_CABLE_IN =3D BIT(0), DP_IRQ_TYPE_HP_CABLE_OUT =3D BIT(1), DP_IRQ_TYPE_HP_CHANGE =3D BIT(2), - DP_IRQ_TYPE_UNKNOWN =3D BIT(3), + DP_IRQ_TYPE_IRQ_HPD =3D BIT(3), }; =20 struct video_info { @@ -193,7 +193,7 @@ void analogix_dp_set_analog_power_down(struct analogix_= dp_device *dp, int analogix_dp_init_analog_func(struct analogix_dp_device *dp); void analogix_dp_init_hpd(struct analogix_dp_device *dp); void analogix_dp_force_hpd(struct analogix_dp_device *dp); -enum dp_irq_type analogix_dp_get_irq_type(struct analogix_dp_device *dp); +u32 analogix_dp_get_irq_type(struct analogix_dp_device *dp); void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp); void analogix_dp_reset_aux(struct analogix_dp_device *dp); void analogix_dp_init_aux(struct analogix_dp_device *dp); diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gp= u/drm/bridge/analogix/analogix_dp_reg.c index ea8401293a23..f4f859cb2936 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c @@ -413,8 +413,9 @@ void analogix_dp_force_hpd(struct analogix_dp_device *d= p) writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3); } =20 -enum dp_irq_type analogix_dp_get_irq_type(struct analogix_dp_device *dp) +u32 analogix_dp_get_irq_type(struct analogix_dp_device *dp) { + u32 irq_type =3D 0; u32 reg; =20 if (dp->hpd_gpiod) { @@ -426,17 +427,18 @@ enum dp_irq_type analogix_dp_get_irq_type(struct anal= ogix_dp_device *dp) } else { /* Parse hotplug interrupt status register */ reg =3D readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4); - if (reg & PLUG) - return DP_IRQ_TYPE_HP_CABLE_IN; - + irq_type |=3D DP_IRQ_TYPE_HP_CABLE_IN; if (reg & HPD_LOST) - return DP_IRQ_TYPE_HP_CABLE_OUT; - + irq_type |=3D DP_IRQ_TYPE_HP_CABLE_OUT; if (reg & HOTPLUG_CHG) - return DP_IRQ_TYPE_HP_CHANGE; + irq_type |=3D DP_IRQ_TYPE_HP_CHANGE; + + reg =3D readl(dp->reg_base + ANALOGIX_DP_INT_STA); + if (reg & INT_HPD) + irq_type |=3D DP_IRQ_TYPE_IRQ_HPD; =20 - return DP_IRQ_TYPE_UNKNOWN; + return irq_type; } } =20 --=20 2.34.1 From nobody Fri Oct 2 06:58:48 2026 Received: from mail-m19731110.qiye.163.com (mail-m19731110.qiye.163.com [220.197.31.110]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 72B753E7BCC; Tue, 4 Aug 2026 09:33:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.31.110 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785836004; cv=none; b=R+aSuPC6cK+xlCrm9WVYCUT2iP8P2wtEKdrDbCku7O7CIJYrVQbCCAxROrUzWHrnRJ7/wrmQZNNwa9eWZdd4laCE0kLWytMo0KCLjFWKXwrvKGfdBwhWzSXffEcqY5YtXQSywiCQLMpaE+V2rr45CZPhzZ37/n03iTSo0vmi3YU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785836004; c=relaxed/simple; bh=cUD/E9kxs8m+LBDGITFdmdcgwtIYbt66jX7jFGSVfUE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Qzpax5zNVR400jKlh5dlTgYpah3z7qR8ZL4LE/GcWdxwv6u5Sf9vDVfiUnwynMHCnccELFJVDyCZvU+EkBy81nk2/OQSWHu4HvSwbEdlvkqusFn8Q+gUp2vkG9Dk49Lj7t2ApYuqxACaziBXHJt04CahtpqvNLHAPsHM7dseYqk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=AJ68viMF; arc=none smtp.client-ip=220.197.31.110 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="AJ68viMF" Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 48b4ffedc; Tue, 4 Aug 2026 16:17:27 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Heiko Stuebner , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Damon Ding Subject: [PATCH v2 03/10] drm/bridge: analogix_dp: Add IRQF_ONESHOT and simplify IRQ handling Date: Tue, 4 Aug 2026 16:17:10 +0800 Message-Id: <20260804081717.741404-4-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260804081717.741404-1-damon.ding@rock-chips.com> References: <20260804081717.741404-1-damon.ding@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9fcbd95bcb03a8kunma7b8cbe762b08a X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVkaGkJIVh9CT0MfQh4dHh8aH1YVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSU 9PT0hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=AJ68viMFBWXHxnjGTpoaeHbV7UH+To0yZHQkuIi2zsNchT/UmmiTJ1GDwIZYD03Jnq+zFQVW3M2aCgFS1hncqlC/JqqXa8vmw5RtkyqizLA8Wv/BS2eJ8u/QN0D++8gil8tiBGoW4oecZs7+bH2LtMcjyRCssLrWQuOsUNY8EE4=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=jE0sGXJbI2reJDuV1UC0Tv41kr0JIA5TRuBvGefwpJk=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" The threaded IRQ is requested without IRQF_ONESHOT, allowing hardirq to preempt the threaded handler. This creates a read-modify-write race on HPD interrupt mask registers between the hardirq mute and thread unmute operations. Add IRQF_ONESHOT to keep the IRQ line masked during thread execution, which eliminates the race and makes the per-event mute/unmute calls in hardirq and thread handlers redundant. Move interrupt status clearing to the beginning of the threaded handler, before drm_helper_hpd_irq_event(), to avoid losing events that arrive during the event handling. Signed-off-by: Damon Ding --- .../gpu/drm/bridge/analogix/analogix_dp_core.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.c index 7ef8ef812b55..4fe248e66515 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -707,10 +707,8 @@ static irqreturn_t analogix_dp_hardirq(int irq, void *= arg) u32 irq_type; =20 irq_type =3D analogix_dp_get_irq_type(dp); - if (irq_type) { - analogix_dp_mute_hpd_interrupt(dp); + if (irq_type) ret =3D IRQ_WAKE_THREAD; - } =20 return ret; } @@ -721,6 +719,9 @@ static irqreturn_t analogix_dp_irq_thread(int irq, void= *arg) u32 irq_type; =20 irq_type =3D analogix_dp_get_irq_type(dp); + if (irq_type) + analogix_dp_clear_hotplug_interrupts(dp); + if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN || irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) { dev_dbg(dp->dev, "Detected cable status changed!\n"); @@ -728,11 +729,6 @@ static irqreturn_t analogix_dp_irq_thread(int irq, voi= d *arg) drm_helper_hpd_irq_event(dp->drm_dev); } =20 - if (irq_type) { - analogix_dp_clear_hotplug_interrupts(dp); - analogix_dp_unmute_hpd_interrupt(dp); - } - return IRQ_HANDLED; } =20 @@ -1403,10 +1399,11 @@ analogix_dp_probe(struct device *dev, struct analog= ix_dp_plat_data *plat_data) * that we can get the current state of the GPIO. */ dp->irq =3D gpiod_to_irq(dp->hpd_gpiod); - irq_flags =3D IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_NO_AUTOE= N; + irq_flags =3D IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_NO_AUTOE= N | + IRQF_ONESHOT; } else { dp->irq =3D platform_get_irq(pdev, 0); - irq_flags =3D IRQF_NO_AUTOEN; + irq_flags =3D IRQF_NO_AUTOEN | IRQF_ONESHOT; } =20 if (dp->irq =3D=3D -ENXIO) { --=20 2.34.1 From nobody Fri Oct 2 06:58:48 2026 Received: from mail-m3274.qiye.163.com (mail-m3274.qiye.163.com [220.197.32.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB2D0380FD0; Tue, 4 Aug 2026 11:46:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.32.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785844018; cv=none; b=aHptBWg3nBU3tXTTnhOT11lxqc3WytHnsvyO+euD7hidpQdtZG7GBOnD0+xlq2TXZIwBVcKO3ew8ydOpfBg1e59kFnMxv4kyttqtl30CIyfzzN7BPzs+pmcpxhwgU3s2W/8E+nSwKJ5YQULZ/Sgdjpr2J00mpe0mQX7Bm82Qs8E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785844018; c=relaxed/simple; bh=XZYrTlOoZOnNMAatj1y9IPAWY6YnFF50+CWh+1CscdQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=u2SgzEztG3LUKaUfLdtyUC/pGnBsIYlQKDcr4MGwO7qNTdMT2RwNlU1LF858Fj9vI4AvJNwILjL+aK4kdb4G7CoRHqt6vIhP//D8ykd95ZyUz9r2N4z43gpPjRS8DPvdjq+iKlDqRzfIOLLKAq8Slu0ye/h3s+YKSHW6fYr3RhQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=QU7AhU64; arc=none smtp.client-ip=220.197.32.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="QU7AhU64" Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 48b4ffee5; Tue, 4 Aug 2026 16:17:28 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Heiko Stuebner , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Damon Ding Subject: [PATCH v2 04/10] drm/bridge: analogix_dp: Extend clear_hotplug_interrupts to accept IRQ bitmask Date: Tue, 4 Aug 2026 16:17:11 +0800 Message-Id: <20260804081717.741404-5-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260804081717.741404-1-damon.ding@rock-chips.com> References: <20260804081717.741404-1-damon.ding@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9fcbd9607703a8kunma7b8cbe762b09a X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlCSEhCVhhPHUtCSBpKThkfSlYVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSU 9PT0hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=QU7AhU643FcCKLOKXHEqJOzu5oal/dDH6dNQ+X1wvu8EnAuxNsO/BdUksmawjrUMcYV6fZKhvA1teQr6rK1wdWpoj0yUHELkS1CjPMy1TKZeU/pTIPIuOI1xzTQVe4JrNCiS4WyA8sGS0aF+UbHkuG4ESRYxToJ4pHjoxHEvxs8=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=wZ3Yx1pvPBwGiqSi0fnx71r627+5/VtLrTsEj4ffKDA=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" Update analogix_dp_clear_hotplug_interrupts() to take an irq_type bitmask argument. Instead of clearing all hotplug interrupt bits unconditionally, only clear the interrupt flags corresponding to the triggered events. Pass the detected IRQ bitmask from the irq thread handler, and use the full HPD_IRQ mask during HPD initialization. This implements fine-grained pending interrupt clearing logic and removes limitations brought by unconditional register writes, supporting improved accuracy for HPD event handling. Signed-off-by: Damon Ding --- Changes in v2: - Add separate patch for IRQF_ONESHOT to resolve interrupt mask issues triggered by interrupt preemption.(Sashiko) --- .../drm/bridge/analogix/analogix_dp_core.c | 2 +- .../drm/bridge/analogix/analogix_dp_core.h | 2 +- .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 28 +++++++++++++------ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.c index 4fe248e66515..603abd940a7c 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -720,7 +720,7 @@ static irqreturn_t analogix_dp_irq_thread(int irq, void= *arg) =20 irq_type =3D analogix_dp_get_irq_type(dp); if (irq_type) - analogix_dp_clear_hotplug_interrupts(dp); + analogix_dp_clear_hotplug_interrupts(dp, irq_type); =20 if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN || irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) { diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.h index c2eba77f9a81..ecb86a6c1fc3 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h @@ -194,7 +194,7 @@ int analogix_dp_init_analog_func(struct analogix_dp_dev= ice *dp); void analogix_dp_init_hpd(struct analogix_dp_device *dp); void analogix_dp_force_hpd(struct analogix_dp_device *dp); u32 analogix_dp_get_irq_type(struct analogix_dp_device *dp); -void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp); +void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp, u= 32 irq_type); void analogix_dp_reset_aux(struct analogix_dp_device *dp); void analogix_dp_init_aux(struct analogix_dp_device *dp); int analogix_dp_get_plug_in_status(struct analogix_dp_device *dp); diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gp= u/drm/bridge/analogix/analogix_dp_reg.c index f4f859cb2936..024f342da461 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c @@ -24,6 +24,11 @@ #define COMMON_INT_MASK_4 (HOTPLUG_CHG | HPD_LOST | PLUG) #define INT_STA_MASK INT_HPD =20 +#define HPD_IRQ (DP_IRQ_TYPE_HP_CABLE_IN | DP_IRQ_TYPE_HP_CABLE_OUT | \ + DP_IRQ_TYPE_HP_CHANGE | DP_IRQ_TYPE_IRQ_HPD) +#define COMMON_INT_4_HPD_IRQ (DP_IRQ_TYPE_HP_CABLE_IN | DP_IRQ_TYPE_HP_CAB= LE_OUT | \ + DP_IRQ_TYPE_HP_CHANGE) + void analogix_dp_enable_video_mute(struct analogix_dp_device *dp, bool ena= ble) { u32 reg; @@ -376,18 +381,25 @@ int analogix_dp_init_analog_func(struct analogix_dp_d= evice *dp) return 0; } =20 -void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp) +void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp, u= 32 irq_type) { - u32 reg; + u32 reg =3D 0; =20 - if (dp->hpd_gpiod) + if (dp->hpd_gpiod || !irq_type) return; =20 - reg =3D HOTPLUG_CHG | HPD_LOST | PLUG; - writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4); + if (irq_type & COMMON_INT_4_HPD_IRQ) { + if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN) + reg |=3D PLUG; + if (irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) + reg |=3D HPD_LOST; + if (irq_type & DP_IRQ_TYPE_HP_CHANGE) + reg |=3D HOTPLUG_CHG; + writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4); + } =20 - reg =3D INT_HPD; - writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA); + if (irq_type & DP_IRQ_TYPE_IRQ_HPD) + writel(INT_HPD, dp->reg_base + ANALOGIX_DP_INT_STA); } =20 void analogix_dp_init_hpd(struct analogix_dp_device *dp) @@ -397,7 +409,7 @@ void analogix_dp_init_hpd(struct analogix_dp_device *dp) if (dp->hpd_gpiod) return; =20 - analogix_dp_clear_hotplug_interrupts(dp); + analogix_dp_clear_hotplug_interrupts(dp, HPD_IRQ); =20 reg =3D readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3); reg &=3D ~(F_HPD | HPD_CTRL); --=20 2.34.1 From nobody Fri Oct 2 06:58:48 2026 Received: from mail-m155110.qiye.163.com (mail-m155110.qiye.163.com [101.71.155.110]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 590E93A453F; Tue, 4 Aug 2026 08:32:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=101.71.155.110 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785832382; cv=none; b=Lfn/orqRRGVB0luPOxRfSb/vRd04i1Ymf5jPYUOfe2N9DutGrEmeEFPsRhKtLCp8dgBlcoLSUeCz9kftFbiw/N02op3rwUY1xsWGV0zlc4ys4rzCVwMyO/eza+wUDhFAiRtM+ne0oSiJSIIfDwZ1DJCcmwO0EMmxvE4tAj8ksrs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785832382; c=relaxed/simple; bh=FwFO7Ky1xzSptGHF4QLQPoCOZkIaW909ROC7T3c0DO0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=P2GrxaD4UAG+VmbWHReAW/FV0oheUfaeQs4f7l2u60UHDu7+MCGDJ0opLm1zRnU0ySXl2Jp0fcc/48aN3jPvU6uE4Go0mo3YfzCFfii2iTsbgKArVFhSw2+DWShZIrwDNlFzFIm7YRXsP4gekNhg5ruJFY6WOr4bkDX6XWD6j6o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=MUekaK+1; arc=none smtp.client-ip=101.71.155.110 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="MUekaK+1" Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 48b4ffeed; Tue, 4 Aug 2026 16:17:29 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Heiko Stuebner , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Damon Ding Subject: [PATCH v2 05/10] drm/bridge: analogix_dp: Extend mute/unmute HPD interrupts to accept irq bitmask Date: Tue, 4 Aug 2026 16:17:12 +0800 Message-Id: <20260804081717.741404-6-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260804081717.741404-1-damon.ding@rock-chips.com> References: <20260804081717.741404-1-damon.ding@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9fcbd9651703a8kunma7b8cbe762b0a5 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVkaQxlKVktCH0MdTRgYGBoaGFYVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSU 9PT0hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=MUekaK+18EXfj0gEqQzJILeHV9JnC1vyY21k7DDS/ahSwctVmuZbMIiEV5sdNqXQiHKJppjWKTey6WTNWN54lC/2mCgmps+pov1DeCwzuDMEwNq4jnkD6WNsSeCq61sfngTnaq53GfTJLg4Kz1MtZfmFg4ZlbwKgV2g3X5r/YVk=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=dCxGMX+jTS1vNiY9tKHG6shVsMrbE7xWUPx/wK0vypY=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" Update the HPD interrupt mute/unmute routines to accept an irq_type bitmask parameter, allowing selective per-bit mask control instead of operating on all HPD interrupt bits unconditionally. With IRQF_ONESHOT handling IRQ line masking during threaded handler execution, these helpers are no longer needed in the runtime IRQ path. They are retained for init-time use by analogix_dp_config_interrupt() to configure platform-specific HPD interrupt masks. Signed-off-by: Damon Ding --- Changes in v2: - Update commit messages to align with newly added IRQF_ONESHOT related commit. --- .../drm/bridge/analogix/analogix_dp_core.h | 4 +- .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 59 ++++++++++++++----- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.h index ecb86a6c1fc3..2066e575ce10 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h @@ -183,8 +183,8 @@ void analogix_dp_init_interrupt(struct analogix_dp_devi= ce *dp); void analogix_dp_reset(struct analogix_dp_device *dp); void analogix_dp_swreset(struct analogix_dp_device *dp); void analogix_dp_config_interrupt(struct analogix_dp_device *dp); -void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp); -void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp); +void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp, u32 irq= _type); +void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp, u32 i= rq_type); int analogix_dp_wait_pll_locked(struct analogix_dp_device *dp); void analogix_dp_set_pll_power_down(struct analogix_dp_device *dp, bool en= able); void analogix_dp_set_analog_power_down(struct analogix_dp_device *dp, diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gp= u/drm/bridge/analogix/analogix_dp_reg.c index 024f342da461..816be79a8da6 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c @@ -197,30 +197,59 @@ void analogix_dp_config_interrupt(struct analogix_dp_= device *dp) writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); } =20 -void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp) +void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp, u32 irq= _type) { - u32 reg; + u32 reg, mask =3D 0; =20 - /* 0: mask, 1: unmask */ - reg =3D readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); - reg &=3D ~COMMON_INT_MASK_4; - writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + if (!irq_type) + return; =20 - reg =3D readl(dp->reg_base + ANALOGIX_DP_INT_STA_MASK); - reg &=3D ~INT_STA_MASK; - writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + if (irq_type & COMMON_INT_4_HPD_IRQ) { + /* 0: mask, 1: unmask */ + reg =3D readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN) + mask |=3D PLUG; + if (irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) + mask |=3D HPD_LOST; + if (irq_type & DP_IRQ_TYPE_HP_CHANGE) + mask |=3D HOTPLUG_CHG; + reg &=3D ~mask; + writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + } + + if (irq_type & DP_IRQ_TYPE_IRQ_HPD) { + /* 0: mask, 1: unmask */ + reg =3D readl(dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + reg &=3D ~INT_HPD; + writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + } } =20 -void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp) +void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp, u32 i= rq_type) { u32 reg; =20 - /* 0: mask, 1: unmask */ - reg =3D COMMON_INT_MASK_4; - writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + if (!irq_type) + return; =20 - reg =3D INT_STA_MASK; - writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + if (irq_type & COMMON_INT_4_HPD_IRQ) { + /* 0: mask, 1: unmask */ + reg =3D readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN) + reg |=3D PLUG; + if (irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) + reg |=3D HPD_LOST; + if (irq_type & DP_IRQ_TYPE_HP_CHANGE) + reg |=3D HOTPLUG_CHG; + writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + } + + if (irq_type & DP_IRQ_TYPE_IRQ_HPD) { + /* 0: mask, 1: unmask */ + reg =3D readl(dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + reg |=3D INT_HPD; + writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + } } =20 int analogix_dp_wait_pll_locked(struct analogix_dp_device *dp) --=20 2.34.1 From nobody Fri Oct 2 06:58:48 2026 Received: from mail-m15588.qiye.163.com (mail-m15588.qiye.163.com [101.71.155.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B6968360ECE; Tue, 4 Aug 2026 11:46:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=101.71.155.88 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785844019; cv=none; b=PnUOkPJiVjsyMvXu7awvEjz2UeEZ8BkbaRLP7bn7OkQzm5yze69VWq6124/+DV9OTbRByiUiJVgDHMcOHCav6Ch09BOGZCEqMGWGUIgNveAtcYh+7aI0mcDtO6F6vYLKIUc7YVb9ybkzTKmqwWiNL3wXkpkP+m4GeKQ4CyLWmi0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785844019; c=relaxed/simple; bh=iQQraIX2R/eSNcCd+92PzjuBC1PDwefamqHSldfYo3k=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=R6gRh8k/0FXKmfDIz3psoT1EWNkm92ghosTavlmCjnkxSvDxEltc37aoqj4DmxmJHeySgVu7JeKOLtgsGnGgIXE6nikJzVkg1cQw3mCXEe9kQ8cUSWr8XqJ53Xdst7V9lGAstrrZHsri7bDqKMlYHsjaFRt14GTWTp4+TCrW6T8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=Ilny2gef; arc=none smtp.client-ip=101.71.155.88 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="Ilny2gef" Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 48b4ffefa; Tue, 4 Aug 2026 16:17:31 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Heiko Stuebner , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Damon Ding Subject: [PATCH v2 06/10] drm/bridge: analogix_dp: Simplify analogix_dp_config_interrupt() Date: Tue, 4 Aug 2026 16:17:13 +0800 Message-Id: <20260804081717.741404-7-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260804081717.741404-1-damon.ding@rock-chips.com> References: <20260804081717.741404-1-damon.ding@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9fcbd969af03a8kunma7b8cbe762b0b7 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVkZHx0aVhgZSxpNHRhOSRhPTlYVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSU 9PT0hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=Ilny2gefQCJVl3LsNpL98tknZMCCkF1HpMnI5+cdtFnRPSjTzQ8Jc16OvD1DyrXO2TnYQSB/xfiFICjIG66lJ6VuDMdiTVGhWB3fzIM+ljsYLAB9d9TIazH/KVauSbJeVNzXI56hGRzOzaGOFUDXLhvcSCKy2stkF8/I0eb+uDU=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=2pOneZc7dpt16hg70UmlDabGGhoDjNds+kJxO+jHrek=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" Remove local COMMON_INT_MASK and INT_STA_MASK macros. These constants are only used once inside this function and bring no reuse benefit. Replace open-coded register writes for COMMON_INT_MASK_1~3 with direct writel(0) calls. Leverage analogix_dp_unmute_hpd_interrupt() using the full HPD_IRQ mask to initialize HPD interrupt state, removing duplicated register handling. Signed-off-by: Damon Ding --- .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 25 +++---------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gp= u/drm/bridge/analogix/analogix_dp_reg.c index 816be79a8da6..42463e18f392 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c @@ -18,12 +18,6 @@ #include "analogix_dp_core.h" #include "analogix_dp_reg.h" =20 -#define COMMON_INT_MASK_1 0 -#define COMMON_INT_MASK_2 0 -#define COMMON_INT_MASK_3 0 -#define COMMON_INT_MASK_4 (HOTPLUG_CHG | HPD_LOST | PLUG) -#define INT_STA_MASK INT_HPD - #define HPD_IRQ (DP_IRQ_TYPE_HP_CABLE_IN | DP_IRQ_TYPE_HP_CABLE_OUT | \ DP_IRQ_TYPE_HP_CHANGE | DP_IRQ_TYPE_IRQ_HPD) #define COMMON_INT_4_HPD_IRQ (DP_IRQ_TYPE_HP_CABLE_IN | DP_IRQ_TYPE_HP_CAB= LE_OUT | \ @@ -178,23 +172,12 @@ void analogix_dp_swreset(struct analogix_dp_device *d= p) =20 void analogix_dp_config_interrupt(struct analogix_dp_device *dp) { - u32 reg; - /* 0: mask, 1: unmask */ - reg =3D COMMON_INT_MASK_1; - writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_1); - - reg =3D COMMON_INT_MASK_2; - writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2); - - reg =3D COMMON_INT_MASK_3; - writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3); - - reg =3D COMMON_INT_MASK_4; - writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + writel(0, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_1); + writel(0, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2); + writel(0, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3); =20 - reg =3D INT_STA_MASK; - writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + analogix_dp_unmute_hpd_interrupt(dp, HPD_IRQ); } =20 void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp, u32 irq= _type) --=20 2.34.1 From nobody Fri Oct 2 06:58:48 2026 Received: from mail-m15578.qiye.163.com (mail-m15578.qiye.163.com [101.71.155.78]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9194841D63F; Tue, 4 Aug 2026 08:22:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=101.71.155.78 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785831776; cv=none; b=Saw1bFnZfEja9Fshmifur9vGVmC1EMWdaKlqYB2lcXX6GcrUq6ehmB8d2erRt25i5CtxZ7NTHSmk6TrG2CsM3j1SjFNcznZfIUEbGC8W3gQAmEbeatTshKcJkSdNAIZxKUHuyzDIT6BybJd7HSgY5R6d0ba7TjrSUcsTsJGHBSk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785831776; c=relaxed/simple; bh=+nriaTfGRGUuZolbvnrRUjWspWpQjWzPm0NAqhIjzyM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=VCgZf6rCmUkOW6yq/dwJcf+A8kCF0DY6sD3dDzUYeiJ2ZdfBoiewQXVbOUDVyCyZ7XKn3AqaiFKGiSUHnWMNlzSz94cfsz5F2TNzoT0csXPjBFlyOO0SVvMqzJGaBrGK8JX2DbcudXJQsbaB/cm/7qiq991hn1xkxVKiJJVbh50= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=QCGabk+Q; arc=none smtp.client-ip=101.71.155.78 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="QCGabk+Q" Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 48b4fff07; Tue, 4 Aug 2026 16:17:32 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Heiko Stuebner , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Damon Ding Subject: [PATCH v2 07/10] drm/bridge: analogix_dp: Use platform-specific HPD detection scheme Date: Tue, 4 Aug 2026 16:17:14 +0800 Message-Id: <20260804081717.741404-8-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260804081717.741404-1-damon.ding@rock-chips.com> References: <20260804081717.741404-1-damon.ding@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9fcbd96e8e03a8kunma7b8cbe762b0ca X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlCQh5LVkgeGUxPT0pOGB5JSFYVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSE pKQk1VSktLVUpCWQY+ DKIM-Signature: a=rsa-sha256; b=QCGabk+QwK5jAbSPr+yb8oB5ATcsAXCcuXxAghMo/OPvYwFSsoiw7Y9nekmGfrHRaxH1Lj+a6W17xjpZZj7jVMwmE6xKRAtk9Sa4JiJcSFhdG5IMeRmekQeI3a4vZcJO05lL56y4QdKn4fDe9V7WHONmlJ2AJ8OSMPlBPWcuWkc=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=VqqntTbLfre8Aozfj6SrJo9fJCRw3SHt2DOPzo6lH78=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" Hotplug detection can be implemented either via HOTPLUG_CHG interrupt, or the combination of PLUG and HPD_LOST interrupts. For Rockchip platforms, configure HPD deglitch to 2ms and rely on HOTPLUG_CHG interrupt for hotplug events, which is verified as the optimal solution through engineering tests. Other platforms continue using PLUG + HPD_LOST pair. Adjust analogix_dp_config_interrupt() to apply platform-specific interrupt masking and deglitch settings. Update threaded irq handler to check corresponding interrupt flags according to platform type. Signed-off-by: Damon Ding --- Changes in v2: - Move ANALOGIX_DP_HPD_DEGLITCH_L/ANALOGIX_DP_HPD_DEGLITCH_H configs to analogix_dp_reset(). --- .../drm/bridge/analogix/analogix_dp_core.c | 9 ++++++-- .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 22 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.c index 603abd940a7c..d207cc864bdc 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -717,13 +717,18 @@ static irqreturn_t analogix_dp_irq_thread(int irq, vo= id *arg) { struct analogix_dp_device *dp =3D arg; u32 irq_type; + bool hpd_detected; =20 irq_type =3D analogix_dp_get_irq_type(dp); if (irq_type) analogix_dp_clear_hotplug_interrupts(dp, irq_type); =20 - if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN || - irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) { + if (!dp->hpd_gpiod && analogix_dp_is_rockchip(dp->plat_data->dev_type)) + hpd_detected =3D irq_type & DP_IRQ_TYPE_HP_CHANGE; + else + hpd_detected =3D (irq_type & DP_IRQ_TYPE_HP_CABLE_IN) || + (irq_type & DP_IRQ_TYPE_HP_CABLE_OUT); + if (hpd_detected) { dev_dbg(dp->dev, "Detected cable status changed!\n"); if (dp->drm_dev) drm_helper_hpd_irq_event(dp->drm_dev); diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gp= u/drm/bridge/analogix/analogix_dp_reg.c index 42463e18f392..fa8e2f104d6c 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c @@ -149,8 +149,13 @@ void analogix_dp_reset(struct analogix_dp_device *dp) writel(0x0, dp->reg_base + ANALOGIX_DP_PKT_SEND_CTL); writel(0x0, dp->reg_base + ANALOGIX_DP_HDCP_CTL); =20 - writel(0x5e, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_L); - writel(0x1a, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_H); + if (analogix_dp_is_rockchip(dp->plat_data->dev_type)) { + writel(0x80, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_L); + writel(0xbb, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_H); + } else { + writel(0x5e, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_L); + writel(0x1a, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_H); + } =20 writel(0x10, dp->reg_base + ANALOGIX_DP_LINK_DEBUG_CTL); =20 @@ -177,7 +182,18 @@ void analogix_dp_config_interrupt(struct analogix_dp_d= evice *dp) writel(0, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2); writel(0, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3); =20 - analogix_dp_unmute_hpd_interrupt(dp, HPD_IRQ); + /* + * Either HOTPLUG_CHG interrupt or PLUG + HPD_LOST interrupt + * pair can be used to implement hotplug detection. + * + * On Rockchip platforms, configuring HPD deglitch to 2ms and + * using HOTPLUG_CHG interrupt for hotplug detection is proven + * as a better solution via engineering verification. + */ + if (analogix_dp_is_rockchip(dp->plat_data->dev_type)) + analogix_dp_unmute_hpd_interrupt(dp, DP_IRQ_TYPE_HP_CHANGE); + else + analogix_dp_unmute_hpd_interrupt(dp, HPD_IRQ); } =20 void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp, u32 irq= _type) --=20 2.34.1 From nobody Fri Oct 2 06:58:48 2026 Received: from mail-m21470.qiye.163.com (mail-m21470.qiye.163.com [117.135.214.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B3093B1006; Tue, 4 Aug 2026 08:33:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=117.135.214.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785832391; cv=none; b=as/7yKXhZoFLlQ9NiTGGoIVrYKzDFzGkjG2m6RecOO4zYUMaMyb+U5EXb1ec3ToVj5kmuleXGgaLBOrEjWJmZTka9crbuw0rpxReWofEbGfhn/un5MCT+rprykp9DzQIIEw08m1g1XY1x49aFy0xzaFfFyxQU2EEDazTH7bJwYA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785832391; c=relaxed/simple; bh=34Spl24dW4XTad86li3s9TJAOOlWdbSIAeFm4If3zBU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=r0GS0ObBQyzu7DGhNOvbj5u+wZ5xtE7cad4BoyEGcCz7OMcM0dNiJQU7wV5cubnhpCUbi4TLesH0/Jy1EvmevvmpbLrEJjRgG5BsrTVmGy6EPyex6UtmSrpjSovY+2LFs6JnZnCh3Br5k6OYRyhRnY/OjrL6/xMS47UHmauC2is= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=ZdcsLqXp; arc=none smtp.client-ip=117.135.214.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="ZdcsLqXp" Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 48b4fff14; Tue, 4 Aug 2026 16:17:33 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Heiko Stuebner , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Damon Ding Subject: [PATCH v2 08/10] drm/bridge: analogix_dp: Skip native HPD interrupt ops for GPIO HPD Date: Tue, 4 Aug 2026 16:17:15 +0800 Message-Id: <20260804081717.741404-9-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260804081717.741404-1-damon.ding@rock-chips.com> References: <20260804081717.741404-1-damon.ding@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9fcbd972f403a8kunma7b8cbe762b0da X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlDQx5LVkhMH0MaS0xLHRlJT1YVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSE pKQk1VSktLVUpCWQY+ DKIM-Signature: a=rsa-sha256; b=ZdcsLqXpStn6Iw0ho7KZ95d2hq3I5UifDk+gNcAsmurzm5b2bxwqxIYwhNljq3Ml8e1SRPLlVL11I93xofyjGx371ZtR8ci5B5GeN0rtMHld493l83PNtYwufIc/zB3a+YZO4j28tsJFQRKmS3JNr/plBMxo6ZscHDLNj5+PEQo=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=/GuR0aZbsHKQkwSeMUqSwIZq3i5kXGEPG6xmtyWBKbM=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" GPIO HPD does not rely on DP controller internal native HPD interrupts. Skip native HPD register manipulations to avoid irrelevant operations. In analogix_dp_config_interrupt(), mute all native HPD interrupts when dp->hpd_gpiod is set. Move the dp->hpd_gpiod guard from inside analogix_dp_clear_hotplug_interrupts() to its caller in the threaded IRQ handler, so that the function operates purely on the given irq_type bitmask without implicit mode-dependent behavior. This makes it reusable for future callers that may need to clear specific interrupt status bits regardless of the HPD detection mode. Signed-off-by: Damon Ding --- Changes in v2: - Adapt to the newly added IRQF_ONESHOT related commit and expand the commit msg. --- .../drm/bridge/analogix/analogix_dp_core.c | 2 +- .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 30 +++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.c index d207cc864bdc..f05db455b430 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -720,7 +720,7 @@ static irqreturn_t analogix_dp_irq_thread(int irq, void= *arg) bool hpd_detected; =20 irq_type =3D analogix_dp_get_irq_type(dp); - if (irq_type) + if (!dp->hpd_gpiod && irq_type) analogix_dp_clear_hotplug_interrupts(dp, irq_type); =20 if (!dp->hpd_gpiod && analogix_dp_is_rockchip(dp->plat_data->dev_type)) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gp= u/drm/bridge/analogix/analogix_dp_reg.c index fa8e2f104d6c..4b210e685747 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c @@ -182,18 +182,22 @@ void analogix_dp_config_interrupt(struct analogix_dp_= device *dp) writel(0, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2); writel(0, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3); =20 - /* - * Either HOTPLUG_CHG interrupt or PLUG + HPD_LOST interrupt - * pair can be used to implement hotplug detection. - * - * On Rockchip platforms, configuring HPD deglitch to 2ms and - * using HOTPLUG_CHG interrupt for hotplug detection is proven - * as a better solution via engineering verification. - */ - if (analogix_dp_is_rockchip(dp->plat_data->dev_type)) - analogix_dp_unmute_hpd_interrupt(dp, DP_IRQ_TYPE_HP_CHANGE); - else - analogix_dp_unmute_hpd_interrupt(dp, HPD_IRQ); + if (dp->hpd_gpiod) { + analogix_dp_mute_hpd_interrupt(dp, HPD_IRQ); + } else { + /* + * Either HOTPLUG_CHG interrupt or PLUG + HPD_LOST interrupt + * pair can be used to implement hotplug detection. + * + * On Rockchip platforms, configuring HPD deglitch to 2ms and + * using HOTPLUG_CHG interrupt for hotplug detection is proven + * as a better solution via engineering verification. + */ + if (analogix_dp_is_rockchip(dp->plat_data->dev_type)) + analogix_dp_unmute_hpd_interrupt(dp, DP_IRQ_TYPE_HP_CHANGE); + else + analogix_dp_unmute_hpd_interrupt(dp, HPD_IRQ); + } } =20 void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp, u32 irq= _type) @@ -413,7 +417,7 @@ void analogix_dp_clear_hotplug_interrupts(struct analog= ix_dp_device *dp, u32 irq { u32 reg =3D 0; =20 - if (dp->hpd_gpiod || !irq_type) + if (!irq_type) return; =20 if (irq_type & COMMON_INT_4_HPD_IRQ) { --=20 2.34.1 From nobody Fri Oct 2 06:58:48 2026 Received: from mail-m49205.qiye.163.com (mail-m49205.qiye.163.com [45.254.49.205]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 09654439F9E; Tue, 4 Aug 2026 08:22:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.254.49.205 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785831783; cv=none; b=HaPLWRrP/77DNLcRqKia3MOx7MlkFSbjSR4poMgFRub8hNjkhsLI8PY1/WqWOItjbuydnXd96DR63Rd4RDkF0cD0XzN1aTbTMmtUGABCr9RTHq+h929g9ApJWb00J3KMQZtwy42FjJ1X2igjZxXD6ce1W6urC8GVEzvEuu5nARE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785831783; c=relaxed/simple; bh=4utsPspCznIst6RwhQpK8VJpuzAjSNRRAyrAu1lTS5s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=LlPdgGGdpN7Li/dJgJ4oYHvTXYK101teEERdj8seeXhp2PFVWkA+FVlAkNXTrgNvBseQlt8vVKnCjs68PeP9Mmz6/7ciT6SjY06NA+TyqTM1Cj1Ru31vUlFu6Fjrw3vIzU0LmOPmdAGJAlt+OStm4ntZQc7qW/sK125Dv+GAgDQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=RoKQnGWY; arc=none smtp.client-ip=45.254.49.205 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="RoKQnGWY" Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 48b4fff21; Tue, 4 Aug 2026 16:17:34 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Heiko Stuebner , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Damon Ding Subject: [PATCH v2 09/10] drm/bridge: analogix_dp: Restrict forced connected status only for panel endpoint Date: Tue, 4 Aug 2026 16:17:16 +0800 Message-Id: <20260804081717.741404-10-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260804081717.741404-1-damon.ding@rock-chips.com> References: <20260804081717.741404-1-damon.ding@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9fcbd9777003a8kunma7b8cbe762b0ed X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlCQh4eVkJIQx5LSEIZSkkaQlYVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSE pKQk1VSktLVUpCWQY+ DKIM-Signature: a=rsa-sha256; b=RoKQnGWYAYRI7Qa3lvdPLalCuoRZUR+wcRtqd5S/f6K2s5PC8vLunb1kwJ2FtSXrOKj+EjsbMUpc4rPNa7/jF6u0e2FWxLzMut6IPJfCzd8Pe77wh/8rQUm0TUcIT8/l6fGkIfjWfxuH1pVFAv3CiSMUrqdCxJRBYxp0qEbz6CU=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=++hasEF6aBrRfCl+8wlVRjHt23leSsAweKpeIh4oR8k=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" Limit the shortcut which unconditionally returns connected status when a next bridge exists. Only apply this logic if the last bridge in the chain is a panel. For all other cases, rely on analogix_dp_detect_hpd() to report accurate hotplug state. Background for the special handling: - If the chain ends with a DP connector bridge, the connector relies on analogix_dp to perform detection. We must avoid hardcoding connected status here. - For intermediate bridges such as PS8625 / PTN3460 without detect support [1], historically the bridge connector defaults to connected via drm_helper_probe_detect() when no per-bridge detect callback exists. Maintain compatibility by keeping the shortcut exclusively for panel endpoints. [1] https://lore.kernel.org/all/4939d55e-b560-4235-8295-adf8e48d9b74@samsun= g.com/ Reported-by: Heiko Stuebner Link: https://lore.kernel.org/all/5209243.oAaWjsssbx@diego/ Signed-off-by: Damon Ding --- .../gpu/drm/bridge/analogix/analogix_dp_core.c | 16 ++++++++++++++-- .../gpu/drm/bridge/analogix/analogix_dp_core.h | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.c index f05db455b430..a5a50b9ab8a7 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -906,8 +906,15 @@ analogix_dp_bridge_detect(struct drm_bridge *bridge, s= truct drm_connector *conne struct analogix_dp_device *dp =3D to_dp(bridge); enum drm_connector_status status =3D connector_status_disconnected; =20 - if (dp->plat_data->next_bridge) - return connector_status_connected; + /* + * Only assume connected when the bridge chain ends with a panel. + * Panel bridges lack a detect callback and historically rely on + * this shortcut. For other next bridge types (e.g., DP connector + * bridges), fall through to analogix_dp_detect_hpd() to report + * accurate hotplug state. + */ + if (dp->plat_data->next_bridge && dp->last_bridge_is_panel) + status =3D connector_status_connected; =20 if (!analogix_dp_detect_hpd(dp)) status =3D connector_status_connected; @@ -920,6 +927,7 @@ static int analogix_dp_bridge_attach(struct drm_bridge = *bridge, enum drm_bridge_attach_flags flags) { struct analogix_dp_device *dp =3D to_dp(bridge); + struct drm_bridge *last_bridge; int ret =3D 0; =20 if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) { @@ -934,6 +942,10 @@ static int analogix_dp_bridge_attach(struct drm_bridge= *bridge, dev_err(dp->dev, "failed to attach following panel or bridge (%d)\n", r= et); return ret; } + + last_bridge =3D drm_bridge_chain_get_last_bridge(dp->encoder); + if (drm_bridge_is_panel(last_bridge)) + dp->last_bridge_is_panel =3D true; } =20 return 0; diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.h index 2066e575ce10..bcb5674801a2 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h @@ -168,6 +168,7 @@ struct analogix_dp_device { bool force_hpd; bool fast_train_enable; bool psr_supported; + bool last_bridge_is_panel; =20 u8 dpcd[DP_RECEIVER_CAP_SIZE]; =20 --=20 2.34.1 From nobody Fri Oct 2 06:58:48 2026 Received: from mail-m3289.qiye.163.com (mail-m3289.qiye.163.com [220.197.32.89]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0CADF33A708; Tue, 4 Aug 2026 08:32:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.32.89 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785832383; cv=none; b=vB4vC5NSXYHKmMG4wcc9H+eYlT6tmreMMj63yzIXwpUlDw2Cib0pusuaIfxljWqqLYqNatBrfjYh7GGMlxLfQU9x0mUXx4PiN0iN9FcdEgAKQnxX/D/hW4XA261D1rMx4CBr4uwCzeRrtexSE74wp2xsvVfsS8CqLIavQjkO6jc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785832383; c=relaxed/simple; bh=slZ4K7V+nMriYNb7XZV2wvUDmS4S/5MyrbBnw5Yq+Fk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tp9VW4eOuMcUjF3vSWsLyAPXgfkV73gQdIAKJRyUcAgJqUNH34qzj/aiZxoHgLlgKp/2zD4J7bnNyp4p2irld6mvpUm+9heGTo3JA3PBqAXUuYQIUXqkMUJsIFo4CJWFPF/c0s61fTXL128ELvFquc5U2y9yG5H+LOLja2+Fing= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=SohnfUmi; arc=none smtp.client-ip=220.197.32.89 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="SohnfUmi" Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 48b4fff2e; Tue, 4 Aug 2026 16:17:35 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Heiko Stuebner , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Damon Ding Subject: [PATCH v2 10/10] drm/bridge: analogix_dp: Handle HPD notification from downstream bridge Date: Tue, 4 Aug 2026 16:17:17 +0800 Message-Id: <20260804081717.741404-11-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260804081717.741404-1-damon.ding@rock-chips.com> References: <20260804081717.741404-1-damon.ding@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9fcbd97bed03a8kunma7b8cbe762b0fd X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlCHRpDVhpKTB1NSBkeGBhCTVYVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSU 9PT0hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=SohnfUmi0MZZEoAoDsZj4vPpj0X0DbQuo4zvxtT26IBgh1dIdNilNr6K5vn773a7/9DDuE9+7RowCZoyy88k4FreVSgDOL4RJO4F7NkhijLqAu4OLzholJq7wh5HuRfyMDm1MCBnf+bXvqoepyUHq8os4msiCivz/uh6DCff1tg=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=ihFySqm5GnqPJHRcWS06V+nd4nWFCQ2/QSaKuoAhvMM=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" When the display pipeline includes a display-connector bridge with hpd-gpios configured, the connector's hotplug status is managed by the display-connector bridge through its GPIO, not by the Analogix DP controller's native HPD. In this configuration, the DP controller's internal HPD polling in analogix_dp_detect_hpd() does not reflect the actual connection state. Implement the .hpd_notify bridge callback to receive connection status updates from downstream bridges. Cache the connection status in a connection_notified flag, and use it to short-circuit analogix_dp_detect_hpd() when a downstream bridge has already confirmed the connection. Signed-off-by: Damon Ding --- .../gpu/drm/bridge/analogix/analogix_dp_core.c | 16 ++++++++++++++++ .../gpu/drm/bridge/analogix/analogix_dp_core.h | 1 + 2 files changed, 17 insertions(+) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.c index a5a50b9ab8a7..f0476a60ece3 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -68,6 +68,13 @@ static int analogix_dp_detect_hpd(struct analogix_dp_dev= ice *dp) { int timeout_loop =3D 0; =20 + /* + * Trust connection status from downstream bridge (e.g., + * display-connector with hpd-gpios). + */ + if (dp->plat_data->next_bridge && dp->connection_notified) + return 0; + while (timeout_loop < DP_TIMEOUT_LOOP_COUNT) { if (analogix_dp_get_plug_in_status(dp) =3D=3D 0) return 0; @@ -1247,6 +1254,14 @@ static void analogix_dp_bridge_atomic_post_disable(s= truct drm_bridge *bridge, DRM_ERROR("Failed to enable psr (%d)\n", ret); } =20 +static void analogix_dp_bridge_notify(struct drm_bridge *bridge, struct dr= m_connector *connector, + enum drm_connector_status status) +{ + struct analogix_dp_device *dp =3D to_dp(bridge); + + dp->connection_notified =3D (status =3D=3D connector_status_connected); +} + static const struct drm_bridge_funcs analogix_dp_bridge_funcs =3D { .atomic_duplicate_state =3D drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, @@ -1259,6 +1274,7 @@ static const struct drm_bridge_funcs analogix_dp_brid= ge_funcs =3D { .attach =3D analogix_dp_bridge_attach, .edid_read =3D analogix_dp_bridge_edid_read, .detect =3D analogix_dp_bridge_detect, + .hpd_notify =3D analogix_dp_bridge_notify, }; =20 static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/g= pu/drm/bridge/analogix/analogix_dp_core.h index bcb5674801a2..cd8a5d52f973 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h @@ -169,6 +169,7 @@ struct analogix_dp_device { bool fast_train_enable; bool psr_supported; bool last_bridge_is_panel; + bool connection_notified; =20 u8 dpcd[DP_RECEIVER_CAP_SIZE]; =20 --=20 2.34.1