From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=47.88.81.135 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794558209; b=X39xcjNxdgyIc0cpozAMTGx35KZy2hvp/b+/AaX8hJHPFg7XTo7QbEOeBpeujsazz4/m ymFc1tcd3hzVd7A7ml+uM2f+1PxAZNzKnrgrqNAiRbREqDAiNd8PinY3G3niXp+Sd2VmF nOXZsctI2Xq+It1N85AeaTls2WdTjBacaLI5TTc4DesOzub5ZpLOcBblTm9JEyHOP9K06 nUrfZrMh7L/sYprE+GbFn4EnExVujlkyDx1FjNmPFSFFrKxIoSEaxtCu/8ydrwMkNHzoq rd2LAv1/BF80pzDabUtk/0v2Fa4cA3458H/Mum5AHE6fAhGlCpyHKOv2ulC5u7gKGWQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794558209; h=DMARC-Filter:Received:From:To:Cc:Subject:Date:Message-Id:X-Mailer: MIME-Version:Content-Transfer-Encoding:X-HM-Tid:X-HM-MType: X-HM-Spam-Status:DKIM-Signature; bh=JDZJ+NMwIwUGC602lCfaufcSwJjSF6pmuvFIO46mZtw=; b=A+pRs7vAVW+9q5MhX2bzIDokd9tcePYlSlzaMjPp1WOlIUYaXPNuQ8EJlij1ylMJYnyn XYMamTBmkbv57rW9ADNZ1cHWEW0KeB6XK7OWqzRRPQ9cHsojwGIIRSY2zqQcbRlX5J5qR lJ9iq3z1GdKpXT1gJF85aC6bKV2YmPkCWNJ1hwNxeMfWjfdcEtfM60LpSmA1QT8a4sBMl mQ4p2rskCrHyFhH9x34IxAqlVodmwNUgKBbC64rfL8wee6QUsbD/9aTO1U7VhYACgXhP/ ultdTheK2w1V64b+9Ch6fpulW01sIuCIh2xQH+zjcivUPaT9nHwZAbbbzi28G1qPWIw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass header.d=rock-chips.com header.i=@rock-chips.com header.a=rsa-sha256 header.s=default header.b=gGY4e6ni; arc=none smtp.remote-ip=47.88.81.135 Received: from mail-m81135.netease.com (mail-m81135.netease.com [47.88.81.135]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 00D83606A32D; Fri, 13 Nov 2026 08:23:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 00D83606A32D 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.a=rsa-sha256 header.s=default header.b=gGY4e6ni Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 54921bdf3; Fri, 13 Nov 2026 16:23:15 +0800 (GMT+08:00) From: Damon Ding To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jingoo Han , Inki Dae , Seung-Woo Kim , Kyungmin Park , Krzysztof Kozlowski , Peter Griffin , Alim Akhtar , Heiko Stuebner , Sandy Huang , Andy Yan Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-rockchip@lists.infradead.org, Damon Ding Subject: [PATCH v6 00/18] Add HPD support for Rockchip Analogix DP Date: Fri, 13 Nov 2026 16:22:47 +0800 Message-Id: <20261113082305.541652-1-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-HM-Tid: 0aa1d400f7da03a8kunm073aab0481a03 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlCT0xLVh1JQk1JTBgfTENKQ1YVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSE pKQk1VSktLVUpCWQY+ DKIM-Signature: a=rsa-sha256; b=gGY4e6ni2ST1MKOrLcxi84bKOy5/UNfwSP6EkMend17pe9JCIEOQLWVEr1RywI3bN52ALHTBntBReRRHLWVjtgg+kIHeJF9kFWN48xspFq90AbDBh8P+lXGrWIyTEFY35RbmD72J/AIV7xIqlqcEwEcwegM51/Yq0YM0BJ6yLhc=; s=default; c=relaxed/relaxed; d=rock-chips.com; v=1; bh=JDZJ+NMwIwUGC602lCfaufcSwJjSF6pmuvFIO46mZtw=; h=date:mime-version:subject:message-id:from; This series improves the HPD (Hotplug Detect) interrupt handling in the Analogix DP driver to enable reliable native HPD pin detection on Rockchip platforms, and introduces platform-specific HPD detection schemes with fine-grained interrupt control. On Rockchip platforms, the Analogix DP native HPD pin IRQ requires the DP controller to remain powered, clocked and initialized to generate plug/unplug interrupts. The previous driver enabled/disabled IRQ during bridge enable/disable, which left no HPD detection when the display pipeline was inactive. Additionally, the interrupt mute/unmute/clear routines operated on all HPD interrupt bits unconditionally, lacking the granularity needed for per-event control. The series reorganizes IRQ and pm_runtime management into bind/unbind, adds IRQF_ONESHOT to eliminate read-modify-write races on interrupt mask registers between hardirq and threaded handlers, converts the interrupt type detection to a bitmask-based scheme for fine-grained mute/unmute/clear operations, and configures Rockchip platforms to use the HOTPLUG_CHG interrupt with a 2ms HPD deglitch setting for better stability. Furthermore, the next bridge is now resolved into bridge->next_bridge instead of the platform data field, the forced connected-status logic is restricted to panel endpoints based on the bridge chain, and HPD events from downstream bridges (e.g. display-connector with hpd-gpios) are handled through the .hpd_notify callback. The DRM_BRIDGE_OP_HPD capability and the hotplug IRQ are only enabled for the platforms which actually support hotplug detection, and the fixed panels are excluded from the hotplug reporting. Tested on RK3576 with both native HPD pin and GPIO HPD configurations. Native HPD pin mode: &edp { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&edp_txm0_pins>; }; GPIO HPD mode: &edp { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&edp0_hpd>; hpd-gpios = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>; }; &pinctrl { edp { edp0_hpd: edp0-hpd { rockchip,pins = <4 RK_PC1 0 &pcfg_pull_none>; }; }; }; Display-connector mode (DP connector without HPD GPIO): &edp_out_conn { remote-endpoint = <&dp_con_in>; }; dp-con { compatible = "dp-connector"; label = "DP OUT"; type = "full-size"; port { dp_con_in: endpoint { remote-endpoint = <&edp_out_conn>; }; }; }; Display-connector mode (DP connector with HPD GPIO): dp-con { compatible = "dp-connector"; label = "DP OUT"; type = "full-size"; pinctrl-0 = <&edp0_hpd>; pinctrl-names = "default"; hpd-gpios = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>; port { dp_con_in: endpoint { remote-endpoint = <&edp_out_conn>; }; }; }; All four configurations detect cable plug/unplug events correctly. Damon Ding (18): drm/bridge: Select VIDEOMODE_HELPERS for DRM_OF_DISPLAY_MODE_BRIDGE drm/bridge: analogix_dp: Use bridge->next_bridge instead of plat_data field drm/bridge: analogix_dp: Restrict forced connected status to panel endpoints drm/bridge: analogix_dp: Return bitmask from analogix_dp_get_irq_type() drm/bridge: analogix_dp: Check all negative return values for &analogix_dp_device.irq drm/bridge: analogix_dp: Add IRQF_ONESHOT and simplify IRQ handling drm/bridge: analogix_dp: Extend clear_hotplug_interrupts to accept IRQ bitmask drm/bridge: analogix_dp: Extend mute/unmute HPD interrupts to accept irq bitmask drm/bridge: analogix_dp: Simplify analogix_dp_config_interrupt() drm/bridge: analogix_dp: Use platform-specific HPD detection scheme drm/bridge: analogix_dp: Skip native HPD interrupt ops for GPIO HPD drm/rockchip: analogix_dp: Unbind bridge when connector init fails drm/exynos: exynos_dp: Unbind bridge when connector init fails drm/bridge: analogix_dp: Move IRQ enable/disable to bind/unbind drm/bridge: analogix_dp: Manage pm runtime and IRQ for native HPD pin detection drm/bridge: analogix_dp: Declare DRM_BRIDGE_OP_HPD for hotplug reporting drm/bridge: analogix_dp: Handle HPD notification from downstream bridge MAINTAINERS: Add entry for Analogix DP controller bridge MAINTAINERS | 11 + drivers/gpu/drm/bridge/Kconfig | 1 + drivers/gpu/drm/bridge/analogix/Kconfig | 1 + .../drm/bridge/analogix/analogix_dp_core.c | 240 ++++++++++++++---- .../drm/bridge/analogix/analogix_dp_core.h | 15 +- .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 153 +++++++---- drivers/gpu/drm/exynos/Kconfig | 1 - drivers/gpu/drm/exynos/exynos_dp.c | 16 +- .../gpu/drm/rockchip/analogix_dp-rockchip.c | 1 + include/drm/bridge/analogix_dp.h | 1 - 10 files changed, 313 insertions(+), 127 deletions(-) --- Changes in v2: - Split IRQ enable/disable logic, handle native HPD pin and GPIO/force-HPD modes separately to avoid unbalanced enable_irq() calls. (Sashiko) - Add separate patch for IRQF_ONESHOT to resolve interrupt mask issues triggered by interrupt preemption. (Sashiko) - Update commit messages to align with newly added IRQF_ONESHOT related commit. - Move ANALOGIX_DP_HPD_DEGLITCH_L/ANALOGIX_DP_HPD_DEGLITCH_H configs to analogix_dp_reset(). - Add new patch to restrict the forced connected-status shortcut to panel endpoints only, allowing DP connector bridges to rely on HPD detection. (Reported by Heiko Stuebner) - Add new patch to handle HPD notification from downstream bridges (e.g., display-connector with hpd-gpios). Changes in v3: - Reorder the series: convert the IRQ handling to a bitmask and add IRQF_ONESHOT before moving IRQ enable/disable to bind/unbind. - Add new patch to check all negative return values for &analogix_dp_device.irq and propagate the actual error code. (Sashiko) - Rename macro HPD_IRQ to HPD_IRQ_ALL to avoid confusion with the DP specification IRQ_HPD, extract the irq_type-to-register bit mapping into a shared helper, and drop the unused COMMON_INT_4_HPD_IRQ macro. - Simplify commit messages across the series. - Add new patch to use bridge->next_bridge instead of the plat_data field, resolving the next bridge in analogix_dp_aux_done_probing(). (Suggested by Heiko Stuebner) - Report panel endpoints as always connected from analogix_dp_get_plug_in_status() via force_connected_mode, computed from the bridge chain at attach time. - Determine the hpd notify mode from DRM_BRIDGE_OP_HPD on downstream bridges that lack DRM_BRIDGE_OP_DETECT. - Add a MAINTAINERS entry for the Analogix DP controller bridge. Changes in v4: - Add Tested-by tag from Heiko. - Rebase onto latest tree, picking up the two related patch series [0][1]. [0] https://lore.kernel.org/all/20260915-drm-bridge-drm_panel-cleanup-v4-0-30401d9406f3@bootlin.com/ [1] https://lore.kernel.org/all/20260916-drm-bridge-every-panel-v3-0-83afb4f1a707@bootlin.com/ Changes in v5: - Add four new patches: - Select VIDEOMODE_HELPERS for DRM_OF_DISPLAY_MODE_BRIDGE to fix the undefined references for non-Exynos users. - Unbind the bridge when drm_bridge_connector_init() fails on the Rockchip and Exynos platforms. - Declare DRM_BRIDGE_OP_HPD on the Analogix DP bridge and report the hotplug events via drm_bridge_hpd_notify(). - Move the next_bridge resolving patch and the forced connected status restriction to the front of the series. - Use a pure threaded IRQ handler and hold runtime PM references in the IRQ thread and the detect paths. (Sashiko) - Limit the runtime PM holding to the RK3576/RK3588 platforms and exclude the boards with a fixed panel. (Sashiko) - Fix the display timings leak in analogix_dp_aux_done_probing(). (Sashiko) - Change the type of &analogix_dp_device.irq to int to fix the dead dp->irq < 0 check. (Sashiko) - Rebase onto the latest drm-misc-next. Changes in v6: - Skip the runtime PM reference in the IRQ thread for the GPIO HPD mode, since it only reads the GPIO level. (Sashiko) - Enable the hotplug IRQ only for the platforms which support hotplug detection (the GPIO HPD mode, or the native HPD mode on RK3576 and RK3588). (Sashiko) - Exclude the force-connected and force-HPD modes from the hotplug detection support check. (Sashiko) - Declare DRM_BRIDGE_OP_HPD only for the platforms which support hotplug detection, since the drm core stops polling the connector once DRM_BRIDGE_OP_HPD is declared. (Sashiko) - Return the cached connection status instead of connector->status from analogix_dp_bridge_detect(), as connector->status may still be unknown before the first HPD notification or stale after the sysfs state forcing. (Sashiko) - Add Tested-by tags from Heiko and Marek. -- 2.34.1