From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=103.129.254.89 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793107721; b=WkzELNQIaM8O7FefpiyK01yrAnGS9kDidrShVW74hZKxltJOQ0YT1ECTHtchUTjr7G2R tnlwLA8iaY+917Jmylafeq6oSHMplNLwTmd7EHmSS32MaQwVj2a+aopMXKeZVz3zCtklD hlmxjXnmm/4ylTJ4pnDTkPMspC//tIRew1iS1jLKu3USZIfK/Ww/wTFpqF/GksRFS+YFX uKqMu4VQ3Xhgv2jo9gPj3ibo9guTE/6PCj65tZxXkvmDebUIsCVVmZqiOxvZQ3UWKwiFU 25uIpa9DJZQ3t/XCfydE13Iras7XvP6hsqfrhUpR8tqtT+p7PZGzOENfA0dFA20ivcg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793107721; h=DMARC-Filter:Received:From:To:Cc:Subject:Date:Message-Id:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding: X-HM-Tid:X-HM-MType:X-HM-Spam-Status:DKIM-Signature; bh=R3UUN15GL8v/YswBxogNACtODTrYePbav/Acnk/ixz8=; b=Grp+GcXw0csYqzRfSpGq9J05+72A0HEVC4Bb6IbCZLY3bQD6xCRyR+EL7gJCHPz6QEE+ Pb9az/IKbMu49M983NiHvfCa7epidkPPSCto7Hx4uoxD/ZSNG6cJC2fT0xJIyNUpfM/B0 E6YZpZMe0pFJzW0TRGVN/RpoAkKUTnSAqiAkDgsaVKyQJrV+0J+3J0Nkx/KJLJ2WfL/Uv Uj0b/XX2qPHfZ6Sf/GV/EUaihaKIp/8j9ua8VmeoNhy5DF/KDkPDCgYbjedSyFy4wIyPn BjfYolH7j+Sj5Z1Mx5lGKa7Ku4aC8BCEDmnSVfj+lFxxEQBMr53XWMtma2ljHri62kg== 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=ULNyu8I7; arc=none smtp.remote-ip=103.129.254.89 Received: from mail-m25489.xmail.ntesmail.com (mail-m25489.xmail.ntesmail.com [103.129.254.89]) (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 D776860A2602; Tue, 27 Oct 2026 13:28:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org D776860A2602 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, unprotected) header.d=rock-chips.com header.i=@rock-chips.com header.a=rsa-sha256 header.s=default header.b=ULNyu8I7 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-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: 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; 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