* [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP
@ 2026-09-28 8:14 Damon Ding
2026-09-28 8:14 ` [PATCH v3 01/14] drm/bridge: analogix_dp: Return bitmask from analogix_dp_get_irq_type() Damon Ding
` (14 more replies)
0 siblings, 15 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
Rebase after the following two patch series:
[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/
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.
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.
======
In the previous version [2], Heiko reported that the Analogix DP
connector state could not be retrieved correctly after probe. With the
current v3 series, analysis shows that the connector hotplug events are
now reported accurately:
1) When the display-connector bridge has hpd-gpios configured, its
.hpd_enable() callback schedules the HPD work, which triggers the
.hpd_notify() callbacks of all bridges in the chain. The following
call stack reports the event during binding and invokes the Analogix
DP .hpd_notify() callback:
rockchip_drm_bind()
-> drm_kms_helper_poll_init()
-> drm_bridge_connector_enable_hpd()
-> schedule_work(&conn->hpd_work)
-> drm_bridge_connector_handle_hpd()
-> drm_kms_helper_connector_hotplug_event()
2) The local test environment had CONFIG_DRM_FBDEV_EMULATION enabled,
where the DRM FBDEV framework called the Analogix DP .detect()
callback to fetch the initial connector state, which masked the
problem:
rockchip_drm_bind()
-> drm_fbdev_client_setup()
-> drm_fb_helper_initial_config()
-> drm_helper_probe_single_connector_modes()
-> analogix_dp_bridge_detect()
3) With CONFIG_DRM_FBDEV_EMULATION disabled, the path in 1) still
triggers and reports the HPD events as expected.
[2] https://lore.kernel.org/all/20260804081717.741404-1-damon.ding@rock-chips.com/
======
Damon Ding (14):
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/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: Use bridge->next_bridge instead of plat_data
field
drm/bridge: analogix_dp: Restrict forced connected status to panel
endpoints
drm/bridge: analogix_dp: Handle HPD notification from downstream
bridge
MAINTAINERS: Add entry for Analogix DP controller bridge
MAINTAINERS | 11 ++
.../drm/bridge/analogix/analogix_dp_core.c | 153 ++++++++++++-----
.../drm/bridge/analogix/analogix_dp_core.h | 13 +-
.../gpu/drm/bridge/analogix/analogix_dp_reg.c | 156 ++++++++++++------
drivers/gpu/drm/exynos/exynos_dp.c | 15 +-
include/drm/bridge/analogix_dp.h | 1 -
6 files changed, 233 insertions(+), 116 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.
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 01/14] drm/bridge: analogix_dp: Return bitmask from analogix_dp_get_irq_type()
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 02/14] drm/bridge: analogix_dp: Check all negative return values for &analogix_dp_device.irq Damon Ding
` (13 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
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.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
.../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/gpu/drm/bridge/analogix/analogix_dp_core.c
index 6df6963740d2..079f2f01f33b 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -701,10 +701,10 @@ static irqreturn_t analogix_dp_hardirq(int irq, void *arg)
{
struct analogix_dp_device *dp = arg;
irqreturn_t ret = IRQ_NONE;
- enum dp_irq_type irq_type;
+ u32 irq_type;
irq_type = analogix_dp_get_irq_type(dp);
- if (irq_type != DP_IRQ_TYPE_UNKNOWN) {
+ if (irq_type) {
analogix_dp_mute_hpd_interrupt(dp);
ret = IRQ_WAKE_THREAD;
}
@@ -715,7 +715,7 @@ static irqreturn_t analogix_dp_hardirq(int irq, void *arg)
static irqreturn_t analogix_dp_irq_thread(int irq, void *arg)
{
struct analogix_dp_device *dp = arg;
- enum dp_irq_type irq_type;
+ u32 irq_type;
irq_type = analogix_dp_get_irq_type(dp);
if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN ||
@@ -725,7 +725,7 @@ static irqreturn_t analogix_dp_irq_thread(int irq, void *arg)
drm_helper_hpd_irq_event(dp->drm_dev);
}
- if (irq_type != 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/gpu/drm/bridge/analogix/analogix_dp_core.h
index 4560597604ad..3f40d95757c5 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 = BIT(0),
DP_IRQ_TYPE_HP_CABLE_OUT = BIT(1),
DP_IRQ_TYPE_HP_CHANGE = BIT(2),
- DP_IRQ_TYPE_UNKNOWN = BIT(3),
+ DP_IRQ_TYPE_IRQ_HPD = BIT(3),
};
struct video_info {
@@ -195,7 +195,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/gpu/drm/bridge/analogix/analogix_dp_reg.c
index c1344a3f013a..49c1961e4326 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
@@ -412,8 +412,9 @@ void analogix_dp_force_hpd(struct analogix_dp_device *dp)
writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
}
-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 = 0;
u32 reg;
if (dp->hpd_gpiod) {
@@ -425,17 +426,18 @@ enum dp_irq_type analogix_dp_get_irq_type(struct analogix_dp_device *dp)
} else {
/* Parse hotplug interrupt status register */
reg = readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
-
if (reg & PLUG)
- return DP_IRQ_TYPE_HP_CABLE_IN;
-
+ irq_type |= DP_IRQ_TYPE_HP_CABLE_IN;
if (reg & HPD_LOST)
- return DP_IRQ_TYPE_HP_CABLE_OUT;
-
+ irq_type |= DP_IRQ_TYPE_HP_CABLE_OUT;
if (reg & HOTPLUG_CHG)
- return DP_IRQ_TYPE_HP_CHANGE;
+ irq_type |= DP_IRQ_TYPE_HP_CHANGE;
+
+ reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
+ if (reg & INT_HPD)
+ irq_type |= DP_IRQ_TYPE_IRQ_HPD;
- return DP_IRQ_TYPE_UNKNOWN;
+ return irq_type;
}
}
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 02/14] drm/bridge: analogix_dp: Check all negative return values for &analogix_dp_device.irq
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
2026-09-28 8:14 ` [PATCH v3 01/14] drm/bridge: analogix_dp: Return bitmask from analogix_dp_get_irq_type() Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 03/14] drm/bridge: analogix_dp: Add IRQF_ONESHOT and simplify IRQ handling Damon Ding
` (12 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding, Sashiko
Currently only -ENXIO is checked for dp->irq from gpiod_to_irq(),
which ignores other possible error codes like -EPROBE_DEFER, -ENOENT.
Check for any negative value instead, and propagate the actual error
code rather than hardcoding -ENODEV.
Reported-by: Sashiko <sashiko-bot@kernel.org>
Link: https://lore.kernel.org/all/20260804083307.84ECA1F000E9@smtp.kernel.org/
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 079f2f01f33b..27c9a764e25f 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1480,9 +1480,9 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
irq_flags = IRQF_NO_AUTOEN;
}
- if (dp->irq == -ENXIO) {
+ if (dp->irq < 0) {
dev_err(&pdev->dev, "failed to get irq\n");
- return ERR_PTR(-ENODEV);
+ return ERR_PTR(dp->irq);
}
ret = devm_request_threaded_irq(&pdev->dev, dp->irq,
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 03/14] drm/bridge: analogix_dp: Add IRQF_ONESHOT and simplify IRQ handling
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
2026-09-28 8:14 ` [PATCH v3 01/14] drm/bridge: analogix_dp: Return bitmask from analogix_dp_get_irq_type() Damon Ding
2026-09-28 8:14 ` [PATCH v3 02/14] drm/bridge: analogix_dp: Check all negative return values for &analogix_dp_device.irq Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 04/14] drm/bridge: analogix_dp: Extend clear_hotplug_interrupts to accept IRQ bitmask Damon Ding
` (11 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
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 <damon.ding@rock-chips.com>
---
Changes in v3:
- Split out a separate commit to improve the return value checking for
&analogix_dp_device.irq.(Sashiko)
---
.../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/gpu/drm/bridge/analogix/analogix_dp_core.c
index 27c9a764e25f..974be5b702dc 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -704,10 +704,8 @@ static irqreturn_t analogix_dp_hardirq(int irq, void *arg)
u32 irq_type;
irq_type = analogix_dp_get_irq_type(dp);
- if (irq_type) {
- analogix_dp_mute_hpd_interrupt(dp);
+ if (irq_type)
ret = IRQ_WAKE_THREAD;
- }
return ret;
}
@@ -718,6 +716,9 @@ static irqreturn_t analogix_dp_irq_thread(int irq, void *arg)
u32 irq_type;
irq_type = 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");
@@ -725,11 +726,6 @@ static irqreturn_t analogix_dp_irq_thread(int irq, void *arg)
drm_helper_hpd_irq_event(dp->drm_dev);
}
- if (irq_type) {
- analogix_dp_clear_hotplug_interrupts(dp);
- analogix_dp_unmute_hpd_interrupt(dp);
- }
-
return IRQ_HANDLED;
}
@@ -1474,10 +1470,11 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
* that we can get the current state of the GPIO.
*/
dp->irq = gpiod_to_irq(dp->hpd_gpiod);
- irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_NO_AUTOEN;
+ irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_NO_AUTOEN |
+ IRQF_ONESHOT;
} else {
dp->irq = platform_get_irq(pdev, 0);
- irq_flags = IRQF_NO_AUTOEN;
+ irq_flags = IRQF_NO_AUTOEN | IRQF_ONESHOT;
}
if (dp->irq < 0) {
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 04/14] drm/bridge: analogix_dp: Extend clear_hotplug_interrupts to accept IRQ bitmask
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (2 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 03/14] drm/bridge: analogix_dp: Add IRQF_ONESHOT and simplify IRQ handling Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 05/14] drm/bridge: analogix_dp: Extend mute/unmute HPD interrupts to accept irq bitmask Damon Ding
` (10 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
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_ALL mask during HPD initialization.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
Changes in v2:
- Add separate patch for IRQF_ONESHOT to resolve interrupt mask issues
triggered by interrupt preemption.(Sashiko)
Changes in v3:
- Rename newly added macro HPD_IRQ to HPD_IRQ_ALL.
---
.../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/gpu/drm/bridge/analogix/analogix_dp_core.c
index 974be5b702dc..f88e3263ba0e 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -717,7 +717,7 @@ static irqreturn_t analogix_dp_irq_thread(int irq, void *arg)
irq_type = analogix_dp_get_irq_type(dp);
if (irq_type)
- analogix_dp_clear_hotplug_interrupts(dp);
+ analogix_dp_clear_hotplug_interrupts(dp, irq_type);
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/gpu/drm/bridge/analogix/analogix_dp_core.h
index 3f40d95757c5..88fa538a5949 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
@@ -196,7 +196,7 @@ 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);
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, u32 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/gpu/drm/bridge/analogix/analogix_dp_reg.c
index 49c1961e4326..2c1d4655114b 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
+#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)
+
void analogix_dp_enable_video_mute(struct analogix_dp_device *dp, bool enable)
{
u32 reg;
@@ -375,18 +380,25 @@ int analogix_dp_init_analog_func(struct analogix_dp_device *dp)
return 0;
}
-void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp)
+void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp, u32 irq_type)
{
- u32 reg;
+ u32 reg = 0;
- if (dp->hpd_gpiod)
+ if (dp->hpd_gpiod || !irq_type)
return;
- reg = 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 |= PLUG;
+ if (irq_type & DP_IRQ_TYPE_HP_CABLE_OUT)
+ reg |= HPD_LOST;
+ if (irq_type & DP_IRQ_TYPE_HP_CHANGE)
+ reg |= HOTPLUG_CHG;
+ writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
+ }
- reg = 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);
}
void analogix_dp_init_hpd(struct analogix_dp_device *dp)
@@ -396,7 +408,7 @@ void analogix_dp_init_hpd(struct analogix_dp_device *dp)
if (dp->hpd_gpiod)
return;
- analogix_dp_clear_hotplug_interrupts(dp);
+ analogix_dp_clear_hotplug_interrupts(dp, HPD_IRQ_ALL);
reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
reg &= ~(F_HPD | HPD_CTRL);
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 05/14] drm/bridge: analogix_dp: Extend mute/unmute HPD interrupts to accept irq bitmask
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (3 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 04/14] drm/bridge: analogix_dp: Extend clear_hotplug_interrupts to accept IRQ bitmask Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 06/14] drm/bridge: analogix_dp: Simplify analogix_dp_config_interrupt() Damon Ding
` (9 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
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.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
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.
---
.../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 88fa538a5949..6a3566b2e8de 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
@@ -185,8 +185,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
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 06/14] drm/bridge: analogix_dp: Simplify analogix_dp_config_interrupt()
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (4 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 05/14] drm/bridge: analogix_dp: Extend mute/unmute HPD interrupts to accept irq bitmask Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 07/14] drm/bridge: analogix_dp: Use platform-specific HPD detection scheme Damon Ding
` (8 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
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_ALL
mask to initialize HPD interrupt state, removing duplicated register
handling.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
Changes in v3:
- Replace macro HPD_IRQ with HPD_IRQ_ALL.
---
.../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/gpu/drm/bridge/analogix/analogix_dp_reg.c
index 6ac03a1aa512..0f1406e4a5d3 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"
-#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_ALL (DP_IRQ_TYPE_HP_CABLE_IN | DP_IRQ_TYPE_HP_CABLE_OUT | \
DP_IRQ_TYPE_HP_CHANGE | DP_IRQ_TYPE_IRQ_HPD)
@@ -189,23 +183,12 @@ void analogix_dp_swreset(struct analogix_dp_device *dp)
void analogix_dp_config_interrupt(struct analogix_dp_device *dp)
{
- u32 reg;
-
/* 0: mask, 1: unmask */
- reg = COMMON_INT_MASK_1;
- writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_1);
-
- reg = COMMON_INT_MASK_2;
- writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2);
-
- reg = COMMON_INT_MASK_3;
- writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3);
-
- reg = 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);
- reg = INT_STA_MASK;
- writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
+ analogix_dp_unmute_hpd_interrupt(dp, HPD_IRQ_ALL);
}
/*
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 07/14] drm/bridge: analogix_dp: Use platform-specific HPD detection scheme
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (5 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 06/14] drm/bridge: analogix_dp: Simplify analogix_dp_config_interrupt() Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 08/14] drm/bridge: analogix_dp: Skip native HPD interrupt ops for GPIO HPD Damon Ding
` (7 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
The Analogix DP controller provides two sets of interrupt sources for
hotplug detection: HOTPLUG_CHG for any HPD level change, and the
PLUG/HPD_LOST pair for connect/disconnect transitions respectively.
On Rockchip platforms, configure the HPD deglitch filter and use
HOTPLUG_CHG interrupt for hotplug detection. Other platforms retain the
original PLUG + HPD_LOST scheme with unchanged deglitch values.
Move the HPD deglitch configuration into analogix_dp_reset() so that
platform-specific values are set alongside the existing register
defaults in a single location. Update the threaded IRQ handler to check
the corresponding interrupt flag based on platform type.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
Changes in v2:
- Move ANALOGIX_DP_HPD_DEGLITCH_L/ANALOGIX_DP_HPD_DEGLITCH_H configs to
analogix_dp_reset().
Changes in v3:
- Modify the commit msg.
- Replace macro HPD_IRQ with HPD_IRQ_ALL.
---
.../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/gpu/drm/bridge/analogix/analogix_dp_core.c
index f88e3263ba0e..287fc16125ef 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -714,13 +714,18 @@ static irqreturn_t analogix_dp_irq_thread(int irq, void *arg)
{
struct analogix_dp_device *dp = arg;
u32 irq_type;
+ bool hpd_detected;
irq_type = analogix_dp_get_irq_type(dp);
if (irq_type)
analogix_dp_clear_hotplug_interrupts(dp, irq_type);
- 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 = irq_type & DP_IRQ_TYPE_HP_CHANGE;
+ else
+ hpd_detected = (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/gpu/drm/bridge/analogix/analogix_dp_reg.c
index 0f1406e4a5d3..025da25463a8 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
@@ -160,8 +160,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);
- 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);
+ }
writel(0x10, dp->reg_base + ANALOGIX_DP_LINK_DEBUG_CTL);
@@ -188,7 +193,18 @@ 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);
- analogix_dp_unmute_hpd_interrupt(dp, HPD_IRQ_ALL);
+ /*
+ * 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_ALL);
}
/*
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 08/14] drm/bridge: analogix_dp: Skip native HPD interrupt ops for GPIO HPD
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (6 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 07/14] drm/bridge: analogix_dp: Use platform-specific HPD detection scheme Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 09/14] drm/bridge: analogix_dp: Move IRQ enable/disable to bind/unbind Damon Ding
` (6 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
GPIO HPD does not rely on DP controller internal native HPD interrupts.
Skip native HPD register manipulations to avoid irrelevant operations.
Move the hpd_gpiod guard to its caller so the helper operates purely on
the given bitmask, and mute all native HPD interrupts for GPIO mode.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
Changes in v2:
- Adapt to the newly added IRQF_ONESHOT related commit and expand the
commit msg.
Changes in v3:
- Reorganize the branch layout for hpd_gpiod check.
- Simplify the commit msg.
---
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 2 +-
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | 7 ++++++-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 287fc16125ef..b92d28546192 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -717,7 +717,7 @@ static irqreturn_t analogix_dp_irq_thread(int irq, void *arg)
bool hpd_detected;
irq_type = analogix_dp_get_irq_type(dp);
- if (irq_type)
+ if (!dp->hpd_gpiod && irq_type)
analogix_dp_clear_hotplug_interrupts(dp, irq_type);
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/gpu/drm/bridge/analogix/analogix_dp_reg.c
index 025da25463a8..af5e5a8ec88d 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
@@ -193,6 +193,11 @@ 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);
+ if (dp->hpd_gpiod) {
+ analogix_dp_mute_hpd_interrupt(dp, HPD_IRQ_ALL);
+ return;
+ }
+
/*
* Either HOTPLUG_CHG interrupt or PLUG + HPD_LOST interrupt
* pair can be used to implement hotplug detection.
@@ -415,7 +420,7 @@ void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp, u32 irq
{
u32 reg;
- if (dp->hpd_gpiod || !irq_type)
+ if (!irq_type)
return;
reg = analogix_dp_irq_type_to_common_int_sta4(irq_type);
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 09/14] drm/bridge: analogix_dp: Move IRQ enable/disable to bind/unbind
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (7 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 08/14] drm/bridge: analogix_dp: Skip native HPD interrupt ops for GPIO HPD Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 10/14] drm/bridge: analogix_dp: Manage pm runtime and IRQ for native HPD pin detection Damon Ding
` (5 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
Move enable_irq()/disable_irq() from bridge enable/disable handlers
into analogix_dp_bind()/analogix_dp_unbind(). This keeps the IRQ
active throughout the device lifecycle rather than only during display
activity, which is a prerequisite for supporting HPD detection while
the display pipeline is inactive.
This is safe because the HPD interrupt sources are now managed
explicitly:
- Native HPD interrupt generation depends on the controller's power
domain and clock. When runtime PM has suspended the device, the
controller cannot produce interrupts, so the hardirq is never
entered on an unpowered device.
- For GPIO HPD mode, the native HPD interrupts are muted in
analogix_dp_config_interrupt(), and the hardirq reads only the GPIO
line via gpiod_get_value(), which is safe while the controller is
suspended.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
Changes in v3:
- Move this patch after mute/unmute related modification and detail the
commit msg.
---
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index b92d28546192..addd319719de 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1018,7 +1018,6 @@ static int analogix_dp_set_bridge(struct analogix_dp_device *dp)
goto out_dp_init;
}
- enable_irq(dp->irq);
return 0;
out_dp_init:
@@ -1160,8 +1159,6 @@ static void analogix_dp_bridge_disable(struct drm_bridge *bridge)
if (dp->dpms_mode != DRM_MODE_DPMS_ON)
return;
- disable_irq(dp->irq);
-
analogix_dp_set_analog_power_down(dp, POWER_ALL, 1);
pm_runtime_put_sync(dp->dev);
@@ -1574,6 +1571,8 @@ int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev)
goto err_unregister_aux;
}
+ enable_irq(dp->irq);
+
return 0;
err_unregister_aux:
@@ -1585,6 +1584,7 @@ EXPORT_SYMBOL_GPL(analogix_dp_bind);
void analogix_dp_unbind(struct analogix_dp_device *dp)
{
+ disable_irq(dp->irq);
drm_dp_aux_unregister(&dp->aux);
}
EXPORT_SYMBOL_GPL(analogix_dp_unbind);
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 10/14] drm/bridge: analogix_dp: Manage pm runtime and IRQ for native HPD pin detection
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (8 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 09/14] drm/bridge: analogix_dp: Move IRQ enable/disable to bind/unbind Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 11/14] drm/bridge: analogix_dp: Use bridge->next_bridge instead of plat_data field Damon Ding
` (4 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
On Rockchip platforms, the Analogix DP native HPD pin IRQ requires the
DP controller to remain powered and clocked to generate plug/unplug
interrupts. Without a runtime PM reference, the controller suspends
when the display pipeline is inactive, disabling HPD detection.
Acquire a runtime PM reference in analogix_dp_bind() and release it in
analogix_dp_unbind() for native HPD pin mode. This keeps the controller
alive throughout the device lifecycle for continuous hotplug detection.
Persistent power is only necessary for native HPD pin mode. It is not
required for force-HPD or GPIO HPD modes, where hotplug detection does
not depend on the DP controller's internal interrupt logic. Add helper
analogix_dp_require_pm_for_hpd_irq() to identify Rockchip native HPD
pin configurations (non-GPIO, non-force-HPD).
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
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)
Changes in v3:
- Modify the commit msg according to the previous commit for moving IRQ
enabling/disabling.
---
.../gpu/drm/bridge/analogix/analogix_dp_core.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index addd319719de..38857508d939 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -39,6 +39,12 @@
static const bool verify_fast_training;
+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);
@@ -1571,6 +1577,12 @@ int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev)
goto err_unregister_aux;
}
+ if (analogix_dp_require_pm_for_hpd_irq(dp)) {
+ ret = pm_runtime_resume_and_get(dp->dev);
+ if (ret)
+ goto err_unregister_aux;
+ }
+
enable_irq(dp->irq);
return 0;
@@ -1585,6 +1597,10 @@ EXPORT_SYMBOL_GPL(analogix_dp_bind);
void analogix_dp_unbind(struct analogix_dp_device *dp)
{
disable_irq(dp->irq);
+
+ if (analogix_dp_require_pm_for_hpd_irq(dp))
+ pm_runtime_put_sync(dp->dev);
+
drm_dp_aux_unregister(&dp->aux);
}
EXPORT_SYMBOL_GPL(analogix_dp_unbind);
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 11/14] drm/bridge: analogix_dp: Use bridge->next_bridge instead of plat_data field
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (9 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 10/14] drm/bridge: analogix_dp: Manage pm runtime and IRQ for native HPD pin detection Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 12/14] drm/bridge: analogix_dp: Restrict forced connected status to panel endpoints Damon Ding
` (3 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
The DRM bridge core provides a standard next_bridge field in struct
drm_bridge for chaining downstream bridges. Use dp->bridge.next_bridge
consistently inside the analogix_dp driver and drop the separate
dp->plat_data->next_bridge field.
The next bridge is now resolved in analogix_dp_aux_done_probing(): for
Exynos platforms with legacy display-timings a display mode bridge is
created and used directly, skipping the endpoint lookup; otherwise the
remote endpoint bridge (panel or bridge) is looked up via
of_drm_get_bridge_by_endpoint().
The reference returned by of_drm_get_bridge_by_endpoint() is transferred
to bridge->next_bridge, and an explicit reference is taken for the
devm-managed display mode bridge; the bridge core automatically puts
bridge->next_bridge at bridge destroy time, pairing with both.
Suggested-by: Heiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/all/5609825.iZASKD2KPV@diego/
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
.../drm/bridge/analogix/analogix_dp_core.c | 44 +++++++++----------
drivers/gpu/drm/exynos/exynos_dp.c | 15 +------
include/drm/bridge/analogix_dp.h | 1 -
3 files changed, 23 insertions(+), 37 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 38857508d939..853b6a6a7fe4 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -21,6 +21,7 @@
#include <linux/platform_device.h>
#include <drm/bridge/analogix_dp.h>
+#include <drm/bridge/of-display-mode-bridge.h>
#include <drm/display/drm_dp_aux_bus.h>
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
@@ -32,6 +33,8 @@
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
+#include <video/of_display_timing.h>
+
#include "analogix_dp_core.h"
#include "analogix_dp_reg.h"
@@ -909,7 +912,7 @@ analogix_dp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *conne
struct analogix_dp_device *dp = to_dp(bridge);
enum drm_connector_status status = connector_status_disconnected;
- if (dp->plat_data->next_bridge)
+ if (dp->bridge.next_bridge)
return connector_status_connected;
if (!analogix_dp_detect_hpd(dp))
@@ -930,8 +933,8 @@ static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
return -EINVAL;
}
- if (dp->plat_data->next_bridge) {
- ret = drm_bridge_attach(dp->encoder, dp->plat_data->next_bridge, bridge,
+ if (dp->bridge.next_bridge) {
+ ret = drm_bridge_attach(dp->encoder, dp->bridge.next_bridge, bridge,
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
if (ret) {
dev_err(dp->dev, "failed to attach following panel or bridge (%d)\n", ret);
@@ -1655,37 +1658,34 @@ struct drm_dp_aux *analogix_dp_get_aux(struct analogix_dp_device *dp)
}
EXPORT_SYMBOL_GPL(analogix_dp_get_aux);
-static void analogix_dp_put_bridge(void *data)
-{
- drm_bridge_put(data);
-}
-
static int analogix_dp_aux_done_probing(struct drm_dp_aux *aux)
{
struct analogix_dp_device *dp = to_dp(aux);
struct analogix_dp_plat_data *plat_data = dp->plat_data;
+ struct drm_bridge *bridge = &dp->bridge, *next_bridge;
int port = plat_data->dev_type == EXYNOS_DP ? 0 : 1;
- int ret;
+
+ if (plat_data->dev_type == EXYNOS_DP && of_get_display_timings(dp->dev->of_node)) {
+ next_bridge = devm_drm_of_display_mode_bridge(dp->dev, dp->dev->of_node,
+ DRM_MODE_CONNECTOR_eDP);
+ if (IS_ERR(next_bridge))
+ return PTR_ERR(next_bridge);
+ bridge->next_bridge = drm_bridge_get(next_bridge);
+
+ return component_add(dp->dev, plat_data->ops);
+ }
/*
* If of_drm_get_bridge_by_endpoint() returns -ENODEV, there may be no
* valid panel or bridge nodes. The driver should go on for the
* driver-free bridge or the DP mode applications.
*/
- plat_data->next_bridge = of_drm_get_bridge_by_endpoint(dp->dev->of_node,
- port, 0);
- if (IS_ERR(plat_data->next_bridge)) {
- if (PTR_ERR(plat_data->next_bridge) == -ENODEV)
- plat_data->next_bridge = NULL;
+ bridge->next_bridge = of_drm_get_bridge_by_endpoint(dp->dev->of_node, port, 0);
+ if (IS_ERR(bridge->next_bridge)) {
+ if (PTR_ERR(bridge->next_bridge) == -ENODEV)
+ bridge->next_bridge = NULL;
else
- return PTR_ERR(plat_data->next_bridge);
- }
-
- if (plat_data->next_bridge) {
- ret = devm_add_action_or_reset(dp->dev, analogix_dp_put_bridge,
- plat_data->next_bridge);
- if (ret)
- return ret;
+ return PTR_ERR(bridge->next_bridge);
}
return component_add(dp->dev, plat_data->ops);
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index 82c238829921..b1e130278ecc 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -14,12 +14,10 @@
#include <linux/of_graph.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
-#include <video/of_display_timing.h>
#include <video/of_videomode.h>
#include <video/videomode.h>
#include <drm/bridge/analogix_dp.h>
-#include <drm/bridge/of-display-mode-bridge.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
#include <drm/drm_bridge_connector.h>
@@ -161,14 +159,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
*/
platform_set_drvdata(pdev, dp);
- if (of_get_display_timings(dev->of_node)) {
- dp->plat_data.next_bridge = devm_drm_of_display_mode_bridge(dp->dev,
- dp->dev->of_node,
- DRM_MODE_CONNECTOR_eDP);
- if (IS_ERR(dp->plat_data.next_bridge))
- return PTR_ERR(dp->plat_data.next_bridge);
- }
-
/* The remote port can be either a panel or a bridge */
dp->plat_data.dev_type = EXYNOS_DP;
dp->plat_data.power_on = exynos_dp_poweron;
@@ -179,10 +169,7 @@ static int exynos_dp_probe(struct platform_device *pdev)
if (IS_ERR(dp->adp))
return PTR_ERR(dp->adp);
- if (dp->plat_data.next_bridge)
- return component_add(&pdev->dev, &exynos_dp_ops);
- else
- return analogix_dp_finish_probe(dp->adp);
+ return analogix_dp_finish_probe(dp->adp);
}
static void exynos_dp_remove(struct platform_device *pdev)
diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
index 6033137b651e..f152ca8c3218 100644
--- a/include/drm/bridge/analogix_dp.h
+++ b/include/drm/bridge/analogix_dp.h
@@ -35,7 +35,6 @@ static inline bool analogix_dp_is_rockchip(enum analogix_dp_devtype type)
struct analogix_dp_plat_data {
enum analogix_dp_devtype dev_type;
- struct drm_bridge *next_bridge;
struct drm_encoder *encoder;
struct drm_connector *connector;
const struct component_ops *ops;
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 12/14] drm/bridge: analogix_dp: Restrict forced connected status to panel endpoints
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (10 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 11/14] drm/bridge: analogix_dp: Use bridge->next_bridge instead of plat_data field Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 13/14] drm/bridge: analogix_dp: Handle HPD notification from downstream bridge Damon Ding
` (2 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
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 and the bridges attached after Analogix DP bridge lack
DRM_BRIDGE_OP_DETECT, which called 'force_connected_mode'. 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.
[1] https://lore.kernel.org/all/4939d55e-b560-4235-8295-adf8e48d9b74@samsung.com/
Reported-by: Heiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/all/5209243.oAaWjsssbx@diego/
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
Changes in v3:
- Add missing drm_bridge_put() after drm_bridge_chain_get_last_bridge()
to fix a reference count leak.(Sashiko)
- Report panel endpoints as always connected from
analogix_dp_get_plug_in_status() via newly added
&analogix_dp_device.force_connected_mode.
---
.../drm/bridge/analogix/analogix_dp_core.c | 30 +++++++++++++++++--
.../drm/bridge/analogix/analogix_dp_core.h | 1 +
.../gpu/drm/bridge/analogix/analogix_dp_reg.c | 3 ++
3 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 853b6a6a7fe4..df898f314254 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -912,15 +912,30 @@ analogix_dp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *conne
struct analogix_dp_device *dp = to_dp(bridge);
enum drm_connector_status status = connector_status_disconnected;
- if (dp->bridge.next_bridge)
- return connector_status_connected;
-
if (!analogix_dp_detect_hpd(dp))
status = connector_status_connected;
return status;
}
+static bool analogix_dp_bridge_force_connected(struct analogix_dp_device *dp)
+{
+ struct drm_bridge *last_bridge;
+ bool force_connected = false;
+
+ drm_for_each_bridge_in_chain_from(dp->bridge.next_bridge, bridge) {
+ if (bridge->ops & DRM_BRIDGE_OP_DETECT)
+ return false;
+ }
+
+ last_bridge = drm_bridge_chain_get_last_bridge(dp->encoder);
+ if (last_bridge)
+ force_connected = drm_bridge_is_panel(last_bridge);
+ drm_bridge_put(last_bridge);
+
+ return force_connected;
+}
+
static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
struct drm_encoder *encoder,
enum drm_bridge_attach_flags flags)
@@ -940,6 +955,15 @@ static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
dev_err(dp->dev, "failed to attach following panel or bridge (%d)\n", ret);
return ret;
}
+
+ /*
+ * 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 back to analogix_dp_detect_hpd() to report
+ * accurate hotplug state.
+ */
+ dp->force_connected_mode = analogix_dp_bridge_force_connected(dp);
}
return 0;
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
index 6a3566b2e8de..5f5698c73d88 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
@@ -170,6 +170,7 @@ struct analogix_dp_device {
bool force_hpd;
bool fast_train_enable;
bool psr_supported;
+ bool force_connected_mode;
u8 dpcd[DP_RECEIVER_CAP_SIZE];
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
index af5e5a8ec88d..abbcdba1a438 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
@@ -533,6 +533,9 @@ int analogix_dp_get_plug_in_status(struct analogix_dp_device *dp)
{
u32 reg;
+ if (dp->force_connected_mode)
+ return 0;
+
if (dp->hpd_gpiod) {
if (gpiod_get_value(dp->hpd_gpiod))
return 0;
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 13/14] drm/bridge: analogix_dp: Handle HPD notification from downstream bridge
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (11 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 12/14] drm/bridge: analogix_dp: Restrict forced connected status to panel endpoints Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 8:14 ` [PATCH v3 14/14] MAINTAINERS: Add entry for Analogix DP controller bridge Damon Ding
2026-09-28 12:02 ` [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Heiko Stübner
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
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.
At attach time, detect whether a downstream bridge provides HPD events
(DRM_BRIDGE_OP_HPD) while none of them provides detection
(DRM_BRIDGE_OP_DETECT). When found, switch to hpd notify mode: cache
the connection status reported through the .hpd_notify callback, mute
the controller's native HPD interrupts and skip their initialization,
and trust the cached status instead of polling the typically
unconnected native HPD pin.
Suggested-by: Heiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/all/5609825.iZASKD2KPV@diego/
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
Changes in v3:
- Introduce hpd_notify_mode flag to skip native HPD operations when
HPD comes from a downstream bridge.
---
.../drm/bridge/analogix/analogix_dp_core.c | 27 ++++++++++++++++++-
.../drm/bridge/analogix/analogix_dp_core.h | 2 ++
.../gpu/drm/bridge/analogix/analogix_dp_reg.c | 7 +++--
3 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index df898f314254..90245d55d1d2 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -45,7 +45,7 @@ static const bool verify_fast_training;
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;
+ !dp->force_hpd && !dp->hpd_notify_mode;
}
static void analogix_dp_init_dp(struct analogix_dp_device *dp)
@@ -936,6 +936,21 @@ static bool analogix_dp_bridge_force_connected(struct analogix_dp_device *dp)
return force_connected;
}
+static bool analogix_dp_has_downstream_hpd(struct analogix_dp_device *dp)
+{
+ bool hpd_bridge = false;
+
+ drm_for_each_bridge_in_chain_from(dp->bridge.next_bridge, bridge) {
+ if (bridge->ops & DRM_BRIDGE_OP_DETECT)
+ return false;
+
+ if (bridge->ops & DRM_BRIDGE_OP_HPD)
+ hpd_bridge = true;
+ }
+
+ return hpd_bridge;
+}
+
static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
struct drm_encoder *encoder,
enum drm_bridge_attach_flags flags)
@@ -964,6 +979,7 @@ static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
* accurate hotplug state.
*/
dp->force_connected_mode = analogix_dp_bridge_force_connected(dp);
+ dp->hpd_notify_mode = analogix_dp_has_downstream_hpd(dp);
}
return 0;
@@ -1260,6 +1276,14 @@ static void analogix_dp_bridge_atomic_post_disable(struct drm_bridge *bridge,
DRM_ERROR("Failed to enable psr (%d)\n", ret);
}
+static void analogix_dp_bridge_notify(struct drm_bridge *bridge, struct drm_connector *connector,
+ enum drm_connector_status status)
+{
+ struct analogix_dp_device *dp = to_dp(bridge);
+
+ dp->connection_notified = (status == connector_status_connected);
+}
+
static const struct drm_bridge_funcs analogix_dp_bridge_funcs = {
.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
@@ -1272,6 +1296,7 @@ static const struct drm_bridge_funcs analogix_dp_bridge_funcs = {
.attach = analogix_dp_bridge_attach,
.edid_read = analogix_dp_bridge_edid_read,
.detect = analogix_dp_bridge_detect,
+ .hpd_notify = analogix_dp_bridge_notify,
};
static int analogix_dp_dt_parse_lanes_map(struct analogix_dp_device *dp)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
index 5f5698c73d88..9f25fb6545ad 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
@@ -171,6 +171,8 @@ struct analogix_dp_device {
bool fast_train_enable;
bool psr_supported;
bool force_connected_mode;
+ bool hpd_notify_mode;
+ bool connection_notified;
u8 dpcd[DP_RECEIVER_CAP_SIZE];
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
index abbcdba1a438..4c5e18d40dad 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
@@ -193,7 +193,7 @@ 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);
- if (dp->hpd_gpiod) {
+ if (dp->hpd_gpiod || dp->hpd_notify_mode) {
analogix_dp_mute_hpd_interrupt(dp, HPD_IRQ_ALL);
return;
}
@@ -435,7 +435,7 @@ void analogix_dp_init_hpd(struct analogix_dp_device *dp)
{
u32 reg;
- if (dp->hpd_gpiod)
+ if (dp->hpd_gpiod || dp->hpd_notify_mode)
return;
analogix_dp_clear_hotplug_interrupts(dp, HPD_IRQ_ALL);
@@ -539,6 +539,9 @@ int analogix_dp_get_plug_in_status(struct analogix_dp_device *dp)
if (dp->hpd_gpiod) {
if (gpiod_get_value(dp->hpd_gpiod))
return 0;
+ } else if (dp->hpd_notify_mode) {
+ if (dp->connection_notified)
+ return 0;
} else {
reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
if (reg & HPD_STATUS)
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 14/14] MAINTAINERS: Add entry for Analogix DP controller bridge
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (12 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 13/14] drm/bridge: analogix_dp: Handle HPD notification from downstream bridge Damon Ding
@ 2026-09-28 8:14 ` Damon Ding
2026-09-28 12:02 ` [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Heiko Stübner
14 siblings, 0 replies; 16+ messages in thread
From: Damon Ding @ 2026-09-28 8:14 UTC (permalink / raw)
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
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
Add a MAINTAINERS entry for the Analogix DP controller bridge, covering
the core bridge driver, its register helpers, the public header and the
DT binding, so that get_maintainer.pl routes related patches correctly.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
---
MAINTAINERS | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 4d108339f44e..d03185e57abc 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8037,6 +8037,17 @@ S: Supported
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
F: drivers/gpu/drm/sun4i/sun8i*
+DRM DRIVER FOR ANALOGIX DISPLAYPORT BRIDGE
+M: Damon Ding <damon.ding@rock-chips.com>
+L: dri-devel@lists.freedesktop.org
+S: Maintained
+T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
+F: Documentation/devicetree/bindings/display/bridge/analogix,dp.yaml
+F: drivers/gpu/drm/bridge/analogix/Kconfig
+F: drivers/gpu/drm/bridge/analogix/Makefile
+F: drivers/gpu/drm/bridge/analogix/analogix_dp_*
+F: include/drm/bridge/analogix_dp.h
+
DRM DRIVER FOR APPLE TOUCH BARS
M: Aun-Ali Zaidi <admin@kodeit.net>
M: Aditya Garg <aditya.garg@linux.dev>
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
` (13 preceding siblings ...)
2026-09-28 8:14 ` [PATCH v3 14/14] MAINTAINERS: Add entry for Analogix DP controller bridge Damon Ding
@ 2026-09-28 12:02 ` Heiko Stübner
14 siblings, 0 replies; 16+ messages in thread
From: Heiko Stübner @ 2026-09-28 12:02 UTC (permalink / raw)
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, Damon Ding
Cc: Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Luca Ceresoli,
Dmitry Baryshkov, linux-kernel, dri-devel, linux-arm-kernel,
linux-samsung-soc, linux-rockchip, Damon Ding
Hi Damon,
Am Montag, 28. September 2026, 10:14:04 Mitteleuropäische Sommerzeit schrieb Damon Ding:
> Rebase after the following two patch series:
> [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/
>
> 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 my eDP panel with gpio-hotplug via the dp-connector as before, I get
a successful display output even on boot.
- plugged in on boot - display works / reported as connected
- plugged out - correctly reported as disconnected
- plugged in again - display works / reported as connected
- unplugged on boot - correctly reported as disconnected
- plugged in - display works / reported as connected
Multiple plugin/plugout operations afterwards also worked nicely.
So
Tested-by: Heiko Stuebner <heiko@sntech.de>
Will do reviewing of patches now ;-)
Thanks for working on that
Heiko
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-09-28 13:58 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-28 8:14 [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Damon Ding
2026-09-28 8:14 ` [PATCH v3 01/14] drm/bridge: analogix_dp: Return bitmask from analogix_dp_get_irq_type() Damon Ding
2026-09-28 8:14 ` [PATCH v3 02/14] drm/bridge: analogix_dp: Check all negative return values for &analogix_dp_device.irq Damon Ding
2026-09-28 8:14 ` [PATCH v3 03/14] drm/bridge: analogix_dp: Add IRQF_ONESHOT and simplify IRQ handling Damon Ding
2026-09-28 8:14 ` [PATCH v3 04/14] drm/bridge: analogix_dp: Extend clear_hotplug_interrupts to accept IRQ bitmask Damon Ding
2026-09-28 8:14 ` [PATCH v3 05/14] drm/bridge: analogix_dp: Extend mute/unmute HPD interrupts to accept irq bitmask Damon Ding
2026-09-28 8:14 ` [PATCH v3 06/14] drm/bridge: analogix_dp: Simplify analogix_dp_config_interrupt() Damon Ding
2026-09-28 8:14 ` [PATCH v3 07/14] drm/bridge: analogix_dp: Use platform-specific HPD detection scheme Damon Ding
2026-09-28 8:14 ` [PATCH v3 08/14] drm/bridge: analogix_dp: Skip native HPD interrupt ops for GPIO HPD Damon Ding
2026-09-28 8:14 ` [PATCH v3 09/14] drm/bridge: analogix_dp: Move IRQ enable/disable to bind/unbind Damon Ding
2026-09-28 8:14 ` [PATCH v3 10/14] drm/bridge: analogix_dp: Manage pm runtime and IRQ for native HPD pin detection Damon Ding
2026-09-28 8:14 ` [PATCH v3 11/14] drm/bridge: analogix_dp: Use bridge->next_bridge instead of plat_data field Damon Ding
2026-09-28 8:14 ` [PATCH v3 12/14] drm/bridge: analogix_dp: Restrict forced connected status to panel endpoints Damon Ding
2026-09-28 8:14 ` [PATCH v3 13/14] drm/bridge: analogix_dp: Handle HPD notification from downstream bridge Damon Ding
2026-09-28 8:14 ` [PATCH v3 14/14] MAINTAINERS: Add entry for Analogix DP controller bridge Damon Ding
2026-09-28 12:02 ` [PATCH v3 00/14] Add HPD support for Rockchip Analogix DP Heiko Stübner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®