From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 043CD606A31A for ; Tue, 27 Oct 2026 13:33:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=hNZ/zo+U; dkim=pass (1024-bit key, unprotected) header.d=rock-chips.com header.i=@rock-chips.com header.a=rsa-sha256 header.s=default header.b=ULNyu8I7 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Unsubscribe-Post: List-Owner; bh=R3UUN15GL8v/YswBxogNACtODTrYePbav/Acnk/ixz8=; b=hNZ/zo+UkSFy7c VVV1YklPE6Mns8iWUhW7iZ0RZ/p2mbYNvx/BGpRFnPGaSbDJCOh8B0fyQc2X9BpYve/CeYor58B4G VH8H2k6BqosOaUwHE5Cg86N5n+pXYZiFB4JMD8FDNdq7y7GqT1vXxKjUbEm3aiXiJW4nxtYd709pS 7dOaku+atCiox1zFLbHwlhUhRPv0yL9135Z2PfRKXVg+cnqWa3OIDzvXWu1YfldtOW289e7Ks0Z7c RTd2pXuUjcut6bc10LBDt07Q/bMd97ImoPYzDpQfkH+cvK962H0mgz1qT2YFs0nj1u1ZO7dlvwxuK YwM0o/Ay2INyo+3p3/Tg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xLhJ3-00000004szu-0xkm; Tue, 27 Oct 2026 13:33:37 +0000 Received: from mail-m11883.qiye.163.com ([115.236.118.83]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xLhIx-00000004srZ-2p06; Tue, 27 Oct 2026 13:33:33 +0000 Received: from zyb-HP-ProDesk-680-G2-MT.. (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 528777a33; Tue, 27 Oct 2026 21:28: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 , Jingoo Han , Inki Dae , Seung-Woo Kim , Kyungmin Park , Krzysztof Kozlowski , Peter Griffin , Alim Akhtar , Heiko Stuebner , Sandy Huang Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , 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 v5 08/18] drm/bridge: analogix_dp: Extend mute/unmute HPD interrupts to accept irq bitmask Date: Tue, 27 Oct 2026 21:28:00 +0800 Message-Id: <20261027132810.1746118-9-damon.ding@rock-chips.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20261027132810.1746118-1-damon.ding@rock-chips.com> References: <20261027132810.1746118-1-damon.ding@rock-chips.com> X-Archived-By: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-HM-Tid: 0aa17d8c3a3703a8kunm87c266213d5708 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVkaSExNVk8aSR4YGElPSRpNQ1YVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSU 9PT0hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=ULNyu8I7rzQJxiwhX4RJi8KTPNEggI51Ke/26q0mQozzjJAzZTmrEok4AZLsHaMulS/ZwnkVlXPnvlNjemZ5l35Ck4aZNilXcoNk/PdTBTRqYzyGmVkOrXjvuqe3PYSWz4lrbQEIQV6gTJP4JwDLCR2V0ONw68pxrljiBcmIpFM=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=R3UUN15GL8v/YswBxogNACtODTrYePbav/Acnk/ixz8=; h=date:mime-version:subject:message-id:from; X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20261027_063332_046712_E0A0EBF1 X-CRM114-Status: GOOD ( 13.32 ) X-Spam-Score: -2.1 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" X-Spam-Status: No, score=-19.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 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. Also extract the irq_type-to-COMMON_INT_STA_4 bit mapping into a shared helper to avoid duplication in the clear/mute/unmute paths, and drop the now unused COMMON_INT_4_HPD_IRQ macro. Tested-by: Heiko Stuebner Signed-off-by: Damon Ding --- Changes in v2: - Update commit messages to align with newly added IRQF_ONESHOT related commit. Changes in v3: - Extract the irq_type bit mapping into a shared helper and document the mask register polarity once. - Drop the unused COMMON_INT_4_HPD_IRQ macro. Changes in v4: - Add Tested-by tag. --- .../drm/bridge/analogix/analogix_dp_core.h | 4 +- .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 80 ++++++++++++------- 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h index 068be3464521..2ac92b2bac0a 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h @@ -186,8 +186,8 @@ void analogix_dp_init_interrupt(struct analogix_dp_device *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 irq_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 enable); 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/gpu/drm/bridge/analogix/analogix_dp_reg.c index 2c1d4655114b..6ac03a1aa512 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c @@ -26,8 +26,20 @@ #define HPD_IRQ_ALL (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_CABLE_OUT | \ - DP_IRQ_TYPE_HP_CHANGE) + +static u32 analogix_dp_irq_type_to_common_int_sta4(u32 irq_type) +{ + u32 reg = 0; + + if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN) + reg |= PLUG; + if (irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) + reg |= HPD_LOST; + if (irq_type & DP_IRQ_TYPE_HP_CHANGE) + reg |= HOTPLUG_CHG; + + return reg; +} void analogix_dp_enable_video_mute(struct analogix_dp_device *dp, bool enable) { @@ -196,30 +208,50 @@ void analogix_dp_config_interrupt(struct analogix_dp_device *dp) writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); } -void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp) +/* + * Both ANALOGIX_DP_COMMON_INT_MASK_4 and ANALOGIX_DP_INT_STA_MASK use + * 0 to mask and 1 to unmask the corresponding interrupt sources. + */ +void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp, u32 irq_type) { - u32 reg; + u32 reg, mask; - /* 0: mask, 1: unmask */ - reg = readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); - reg &= ~COMMON_INT_MASK_4; - writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + if (!irq_type) + return; - reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA_MASK); - reg &= ~INT_STA_MASK; - writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + mask = analogix_dp_irq_type_to_common_int_sta4(irq_type); + if (mask) { + reg = readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + reg &= ~mask; + writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + } + + if (irq_type & DP_IRQ_TYPE_IRQ_HPD) { + reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + reg &= ~INT_HPD; + writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + } } -void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp) +void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp, u32 irq_type) { - u32 reg; + u32 reg, mask; - /* 0: mask, 1: unmask */ - reg = COMMON_INT_MASK_4; - writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + if (!irq_type) + return; - reg = INT_STA_MASK; - writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + mask = analogix_dp_irq_type_to_common_int_sta4(irq_type); + if (mask) { + reg = readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + reg |= mask; + writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4); + } + + if (irq_type & DP_IRQ_TYPE_IRQ_HPD) { + reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + reg |= INT_HPD; + writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK); + } } int analogix_dp_wait_pll_locked(struct analogix_dp_device *dp) @@ -382,20 +414,14 @@ int analogix_dp_init_analog_func(struct analogix_dp_device *dp) void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp, u32 irq_type) { - u32 reg = 0; + u32 reg; if (dp->hpd_gpiod || !irq_type) return; - if (irq_type & COMMON_INT_4_HPD_IRQ) { - if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN) - reg |= PLUG; - if (irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) - reg |= HPD_LOST; - if (irq_type & DP_IRQ_TYPE_HP_CHANGE) - reg |= HOTPLUG_CHG; + reg = analogix_dp_irq_type_to_common_int_sta4(irq_type); + if (reg) writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4); - } if (irq_type & DP_IRQ_TYPE_IRQ_HPD) writel(INT_HPD, dp->reg_base + ANALOGIX_DP_INT_STA); -- 2.34.1