* [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers
@ 2026-05-18 19:47 Jonas Karlman
2026-05-18 19:47 ` [PATCH 01/13] drm/meson: dw-hdmi: Report connector status based on HPD bit Jonas Karlman
` (12 more replies)
0 siblings, 13 replies; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner
Cc: Jerome Brunet, Martin Blumenstingl, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
This series include misc cleanup of the meson-dw-hdmi driver, changes to
use the bridge CEC notifier op and to use the dw-hdmi delayed work for
HPD event handling.
Patch 1 ensure connector status is based on HPD bit
Patch 2 protect from a possible NULL pointer dereference during bind()
Patch 4 reduce number of hotplug uevents and hpd_notify() calls
Patch 6 changes to use bridge connector CEC notifier
Patch 3,5,7-10 cleanup code for consistency
Patch 11-12 changes to use dw-hdmi HPD delayed work at HPD event
Patch 13 changes to use suspend_late/resume_early/resume_noirq pm ops
This series depends on improvements made in the series "drm: bridge:
dw_hdmi: Misc enable/disable, CEC and EDID cleanup" [1].
[1] https://patchwork.freedesktop.org/series/134727/
This series is part of a multi series effort to:
- drm: bridge: dw_hdmi: Misc enable/disable, CEC and EDID cleanup [v7]
- drm/meson: hdmi: Misc cleanup and use CEC notifier helpers [v1]
- drm/bridge: dw-hdmi: Improve input/output bus format handling
- drm/bridge: dw-hdmi: Convert to a HDMI bridge and use of bridge connector
- drm/bridge: dw-hdmi: Add and use tmds_char_rate_valid() plat data ops
- phy: rockchip: inno-hdmi: Change TMDS rate handling to configure() ops [v4]
- drm/rockchip: dw_hdmi: Misc cleanup and propagate bus format [v2]
- drm/rockchip: dw_hdmi: Enable YCbCr and Deep Color modes
Link to snapshot: https://github.com/Kwiboo/linux-rockchip/commits/next-20260518-rk-hdmi-v5/
Jonas Karlman (13):
drm/meson: dw-hdmi: Report connector status based on HPD bit
drm/meson: dw-hdmi: Protect from possible NULL pointer dereference
drm/meson: dw-hdmi: Call dw_hdmi_remove() consistently
drm/meson: dw-hdmi: Drop call to drm_bridge_hpd_notify()
drm/meson: encoder_hdmi: Use CEC phys addr from display_info
drm/meson: encoder_hdmi: Use bridge connector CEC notifier
drm/meson: encoder_hdmi: Report ycbcr_420_allowed from encoder
drm/meson: dw-hdmi: Use local dev variable consistently in bind()
drm/meson: dw-hdmi: Use devm_clk_get_enabled() helper
drm/meson: dw-hdmi: Use dev_err_probe() to report errors
drm/bridge: dw-hdmi: Export dw_hdmi_schedule_hpd_work() helper
drm/meson: dw-hdmi: Use dw_hdmi_schedule_hpd_work() helper
drm/meson: dw-hdmi: Use suspend_late/resume_early/resume_noirq pm ops
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 11 +-
drivers/gpu/drm/meson/Kconfig | 1 +
drivers/gpu/drm/meson/meson_dw_hdmi.c | 169 +++++++++------------
drivers/gpu/drm/meson/meson_dw_hdmi.h | 3 +
drivers/gpu/drm/meson/meson_encoder_hdmi.c | 107 +++----------
include/drm/bridge/dw_hdmi.h | 2 +
6 files changed, 106 insertions(+), 187 deletions(-)
--
2.54.0
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 01/13] drm/meson: dw-hdmi: Report connector status based on HPD bit
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-19 7:23 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 02/13] drm/meson: dw-hdmi: Protect from possible NULL pointer dereference Jonas Karlman
` (11 subsequent siblings)
12 siblings, 1 reply; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
G12A added support for RX-SENSE, status for both HPD and RX-SENSE is
reported in the TOP_STAT0 register.
Limit read_hpd() phy ops to only report connected status based on the
HPD status bit in TOP_STAT0, to help ensure that EDID can be read from
the sink in the connector detect() func.
Fixes: 3b7c1237a72a ("drm/meson: Add G12A support for the DW-HDMI Glue")
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/meson/meson_dw_hdmi.c | 6 ++++--
drivers/gpu/drm/meson/meson_dw_hdmi.h | 3 +++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 2a8756da569b..993f6d5d4b29 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -457,9 +457,11 @@ static enum drm_connector_status dw_hdmi_read_hpd(struct dw_hdmi *hdmi,
void *data)
{
struct meson_dw_hdmi *dw_hdmi = (struct meson_dw_hdmi *)data;
+ unsigned int stat;
- return !!dw_hdmi->data->top_read(dw_hdmi, HDMITX_TOP_STAT0) ?
- connector_status_connected : connector_status_disconnected;
+ stat = dw_hdmi->data->top_read(dw_hdmi, HDMITX_TOP_STAT0);
+ return stat & HDMITX_TOP_STAT0_HPD ? connector_status_connected :
+ connector_status_disconnected;
}
static void dw_hdmi_setup_hpd(struct dw_hdmi *hdmi,
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.h b/drivers/gpu/drm/meson/meson_dw_hdmi.h
index 08e1c14e4ea0..cb4616daf667 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.h
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.h
@@ -157,4 +157,7 @@
*/
#define HDMITX_TOP_STAT0 (0x00E)
+#define HDMITX_TOP_STAT0_HPD BIT(0)
+#define HDMITX_TOP_STAT0_RXSENSE BIT(1)
+
#endif /* __MESON_DW_HDMI_H */
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 02/13] drm/meson: dw-hdmi: Protect from possible NULL pointer dereference
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
2026-05-18 19:47 ` [PATCH 01/13] drm/meson: dw-hdmi: Report connector status based on HPD bit Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-19 7:23 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 03/13] drm/meson: dw-hdmi: Call dw_hdmi_remove() consistently Jonas Karlman
` (10 subsequent siblings)
12 siblings, 1 reply; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl, Sam Ravnborg
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
The IRQ handler can be called at any time after the call to
devm_request_threaded_irq() completes, even before dw_hdmi->bridge has
been assigned later in meson_dw_hdmi_bind().
Protect from a possible NULL pointer dereference in IRQ handler by only
calling drm_helper_hpd_irq_event() when bridge has been assigned.
Fixes: e67f6037ae1b ("drm/meson: split out encoder from meson_dw_hdmi")
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
I only observed this NULL pointer dereference one time, without being
able to reliably re-create a similar timing scenario. I still think this
is an issue that possible could happen and likely should be fixed.
Note that patches later in this series will fully replace this change.
---
drivers/gpu/drm/meson/meson_dw_hdmi.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 993f6d5d4b29..eafe7daf6ff1 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -520,7 +520,8 @@ static irqreturn_t dw_hdmi_top_thread_irq(int irq, void *dev_id)
u32 stat = dw_hdmi->irq_stat;
/* HPD Events */
- if (stat & (HDMITX_TOP_INTR_HPD_RISE | HDMITX_TOP_INTR_HPD_FALL)) {
+ if (stat & (HDMITX_TOP_INTR_HPD_RISE | HDMITX_TOP_INTR_HPD_FALL) &&
+ dw_hdmi->bridge) {
bool hpd_connected = false;
if (stat & HDMITX_TOP_INTR_HPD_RISE)
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 03/13] drm/meson: dw-hdmi: Call dw_hdmi_remove() consistently
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
2026-05-18 19:47 ` [PATCH 01/13] drm/meson: dw-hdmi: Report connector status based on HPD bit Jonas Karlman
2026-05-18 19:47 ` [PATCH 02/13] drm/meson: dw-hdmi: Protect from possible NULL pointer dereference Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-19 7:24 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 04/13] drm/meson: dw-hdmi: Drop call to drm_bridge_hpd_notify() Jonas Karlman
` (9 subsequent siblings)
12 siblings, 1 reply; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
dw-hdmi export two similar pair of functions to probe()/remove() and
bind()/unbind(), update to use dw_hdmi_remove() for consistency.
dw_hdmi_probe() will drm_bridge_add() the dw-hdmi bridge, so it is
expected that of_drm_find_and_get_bridge() always return the dw-hdmi
bridge. Regardless, validate that the dw-hdmi can be found for
consistent error handling.
Also always ensure the IRQ handler and bridge is released before
dw_hdmi_remove() is called.
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/meson/meson_dw_hdmi.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index eafe7daf6ff1..9aafdc768f2b 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -775,10 +775,17 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
platform_set_drvdata(pdev, meson_dw_hdmi);
meson_dw_hdmi->hdmi = dw_hdmi_probe(pdev, &meson_dw_hdmi->dw_plat_data);
- if (IS_ERR(meson_dw_hdmi->hdmi))
+ if (IS_ERR(meson_dw_hdmi->hdmi)) {
+ devm_free_irq(dev, irq, meson_dw_hdmi);
return PTR_ERR(meson_dw_hdmi->hdmi);
+ }
meson_dw_hdmi->bridge = of_drm_find_and_get_bridge(pdev->dev.of_node);
+ if (!meson_dw_hdmi->bridge) {
+ devm_free_irq(dev, irq, meson_dw_hdmi);
+ dw_hdmi_remove(meson_dw_hdmi->hdmi);
+ return -ENODEV;
+ }
DRM_DEBUG_DRIVER("HDMI controller initialized\n");
@@ -793,8 +800,8 @@ static void meson_dw_hdmi_unbind(struct device *dev, struct device *master,
int irq = platform_get_irq(pdev, 0);
devm_free_irq(dev, irq, meson_dw_hdmi);
- dw_hdmi_unbind(meson_dw_hdmi->hdmi);
drm_bridge_put(meson_dw_hdmi->bridge);
+ dw_hdmi_remove(meson_dw_hdmi->hdmi);
}
static const struct component_ops meson_dw_hdmi_ops = {
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 04/13] drm/meson: dw-hdmi: Drop call to drm_bridge_hpd_notify()
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
` (2 preceding siblings ...)
2026-05-18 19:47 ` [PATCH 03/13] drm/meson: dw-hdmi: Call dw_hdmi_remove() consistently Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-19 7:25 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 05/13] drm/meson: encoder_hdmi: Use CEC phys addr from display_info Jonas Karlman
` (8 subsequent siblings)
12 siblings, 1 reply; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
Calls to both drm_helper_hpd_irq_event() and drm_bridge_hpd_notify() in
the IRQ handler causes multiple hotplug uevents and modesets during an
HPD interrupt.
Change to only call drm_helper_hpd_irq_event() in IRQ handler to ensure
only one hotplug uevent is triggered when the connection status or EDID
has changed.
The bridge connectors detect() func help ensure that any hpd_notify()
func is called for all bridges in the chain.
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/meson/meson_dw_hdmi.c | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 9aafdc768f2b..30099bf71aad 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -521,17 +521,8 @@ static irqreturn_t dw_hdmi_top_thread_irq(int irq, void *dev_id)
/* HPD Events */
if (stat & (HDMITX_TOP_INTR_HPD_RISE | HDMITX_TOP_INTR_HPD_FALL) &&
- dw_hdmi->bridge) {
- bool hpd_connected = false;
-
- if (stat & HDMITX_TOP_INTR_HPD_RISE)
- hpd_connected = true;
-
+ dw_hdmi->bridge)
drm_helper_hpd_irq_event(dw_hdmi->bridge->dev);
- drm_bridge_hpd_notify(dw_hdmi->bridge,
- hpd_connected ? connector_status_connected
- : connector_status_disconnected);
- }
return IRQ_HANDLED;
}
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 05/13] drm/meson: encoder_hdmi: Use CEC phys addr from display_info
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
` (3 preceding siblings ...)
2026-05-18 19:47 ` [PATCH 04/13] drm/meson: dw-hdmi: Drop call to drm_bridge_hpd_notify() Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-19 6:36 ` Hans Verkuil
2026-05-19 7:27 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 06/13] drm/meson: encoder_hdmi: Use bridge connector CEC notifier Jonas Karlman
` (7 subsequent siblings)
12 siblings, 2 replies; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
The dw-hdmi bridge detect() func now updates EDID for the connector.
Something that ensures that display_info.source_physical_address has an
updated CEC phys addr when the hpd_notify() func is called.
Change to use display_info source_physical_address directly instead of
re-reading EDID to set the CEC phys addr at HPD interrupt.
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/meson/meson_encoder_hdmi.c | 26 ++++------------------
1 file changed, 4 insertions(+), 22 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
index 55c0601df3c6..1b9a1d9ed3d3 100644
--- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
@@ -330,28 +330,10 @@ static void meson_encoder_hdmi_hpd_notify(struct drm_bridge *bridge,
if (!encoder_hdmi->cec_notifier)
return;
- if (status == connector_status_connected) {
- const struct drm_edid *drm_edid;
- const struct edid *edid;
-
- drm_edid = drm_bridge_edid_read(encoder_hdmi->bridge.next_bridge,
- encoder_hdmi->connector);
- if (!drm_edid)
- return;
-
- /*
- * FIXME: The CEC physical address should be set using
- * cec_notifier_set_phys_addr(encoder_hdmi->cec_notifier,
- * connector->display_info.source_physical_address) from a path
- * that has read the EDID and called
- * drm_edid_connector_update().
- */
- edid = drm_edid_raw(drm_edid);
-
- cec_notifier_set_phys_addr_from_edid(encoder_hdmi->cec_notifier, edid);
-
- drm_edid_free(drm_edid);
- } else
+ if (status == connector_status_connected)
+ cec_notifier_set_phys_addr(encoder_hdmi->cec_notifier,
+ connector->display_info.source_physical_address);
+ else
cec_notifier_phys_addr_invalidate(encoder_hdmi->cec_notifier);
}
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 06/13] drm/meson: encoder_hdmi: Use bridge connector CEC notifier
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
` (4 preceding siblings ...)
2026-05-18 19:47 ` [PATCH 05/13] drm/meson: encoder_hdmi: Use CEC phys addr from display_info Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-19 6:38 ` Hans Verkuil
2026-05-19 7:30 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 07/13] drm/meson: encoder_hdmi: Report ycbcr_420_allowed from encoder Jonas Karlman
` (6 subsequent siblings)
12 siblings, 2 replies; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
The dw-hdmi bridge detect() func now updates EDID and CEC phys addr for
the connector and any registered generic CEC notifier.
Replace the open-coded CEC notifier handling with use of the bridge CEC
notifier op.
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/meson/Kconfig | 1 +
drivers/gpu/drm/meson/meson_encoder_hdmi.c | 85 +++++-----------------
2 files changed, 19 insertions(+), 67 deletions(-)
diff --git a/drivers/gpu/drm/meson/Kconfig b/drivers/gpu/drm/meson/Kconfig
index 417f79829cf8..0dc5ca21e4fc 100644
--- a/drivers/gpu/drm/meson/Kconfig
+++ b/drivers/gpu/drm/meson/Kconfig
@@ -13,6 +13,7 @@ config DRM_MESON
select REGMAP_MMIO
select MESON_CANVAS
select CEC_CORE if CEC_NOTIFIER
+ select DRM_DISPLAY_HDMI_CEC_NOTIFIER_HELPER if CEC_NOTIFIER
config DRM_MESON_DW_HDMI
tristate "HDMI Synopsys Controller support for Amlogic Meson Display"
diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
index 1b9a1d9ed3d3..45104ef35344 100644
--- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
@@ -16,8 +16,6 @@
#include <linux/regulator/consumer.h>
#include <linux/reset.h>
-#include <media/cec-notifier.h>
-
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
#include <drm/drm_bridge_connector.h>
@@ -41,7 +39,6 @@ struct meson_encoder_hdmi {
struct drm_connector *connector;
struct meson_drm *priv;
unsigned long output_bus_fmt;
- struct cec_notifier *cec_notifier;
};
#define bridge_to_meson_encoder_hdmi(x) \
@@ -57,14 +54,6 @@ static int meson_encoder_hdmi_attach(struct drm_bridge *bridge,
&encoder_hdmi->bridge, flags);
}
-static void meson_encoder_hdmi_detach(struct drm_bridge *bridge)
-{
- struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge);
-
- cec_notifier_conn_unregister(encoder_hdmi->cec_notifier);
- encoder_hdmi->cec_notifier = NULL;
-}
-
static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi,
const struct drm_display_mode *mode)
{
@@ -321,27 +310,9 @@ static int meson_encoder_hdmi_atomic_check(struct drm_bridge *bridge,
return 0;
}
-static void meson_encoder_hdmi_hpd_notify(struct drm_bridge *bridge,
- struct drm_connector *connector,
- enum drm_connector_status status)
-{
- struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge);
-
- if (!encoder_hdmi->cec_notifier)
- return;
-
- if (status == connector_status_connected)
- cec_notifier_set_phys_addr(encoder_hdmi->cec_notifier,
- connector->display_info.source_physical_address);
- else
- cec_notifier_phys_addr_invalidate(encoder_hdmi->cec_notifier);
-}
-
static const struct drm_bridge_funcs meson_encoder_hdmi_bridge_funcs = {
.attach = meson_encoder_hdmi_attach,
- .detach = meson_encoder_hdmi_detach,
.mode_valid = meson_encoder_hdmi_mode_valid,
- .hpd_notify = meson_encoder_hdmi_hpd_notify,
.atomic_enable = meson_encoder_hdmi_atomic_enable,
.atomic_disable = meson_encoder_hdmi_atomic_disable,
.atomic_get_input_bus_fmts = meson_encoder_hdmi_get_inp_bus_fmts,
@@ -374,9 +345,9 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
meson_encoder_hdmi->bridge.next_bridge = of_drm_find_and_get_bridge(remote);
if (!meson_encoder_hdmi->bridge.next_bridge) {
- ret = dev_err_probe(priv->dev, -EPROBE_DEFER,
- "Failed to find HDMI transceiver bridge\n");
- goto err_put_node;
+ of_node_put(remote);
+ return dev_err_probe(priv->dev, -EPROBE_DEFER,
+ "Failed to find HDMI transceiver bridge\n");
}
/* HDMI Encoder Bridge */
@@ -384,6 +355,13 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
meson_encoder_hdmi->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
meson_encoder_hdmi->bridge.interlace_allowed = true;
+ pdev = of_find_device_by_node(remote);
+ of_node_put(remote);
+ if (pdev) {
+ meson_encoder_hdmi->bridge.ops |= DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER;
+ meson_encoder_hdmi->bridge.hdmi_cec_dev = &pdev->dev;
+ }
+
drm_bridge_add(&meson_encoder_hdmi->bridge);
meson_encoder_hdmi->priv = priv;
@@ -391,30 +369,24 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
/* Encoder */
ret = drm_simple_encoder_init(priv->drm, &meson_encoder_hdmi->encoder,
DRM_MODE_ENCODER_TMDS);
- if (ret) {
- dev_err_probe(priv->dev, ret, "Failed to init HDMI encoder\n");
- goto err_put_node;
- }
+ if (ret)
+ return dev_err_probe(priv->dev, ret, "Failed to init HDMI encoder\n");
meson_encoder_hdmi->encoder.possible_crtcs = BIT(0);
/* Attach HDMI Encoder Bridge to Encoder */
ret = drm_bridge_attach(&meson_encoder_hdmi->encoder, &meson_encoder_hdmi->bridge, NULL,
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
- if (ret) {
- dev_err_probe(priv->dev, ret, "Failed to attach bridge\n");
- goto err_put_node;
- }
+ if (ret)
+ return dev_err_probe(priv->dev, ret, "Failed to attach bridge\n");
/* Initialize & attach Bridge Connector */
meson_encoder_hdmi->connector = drm_bridge_connector_init(priv->drm,
&meson_encoder_hdmi->encoder);
- if (IS_ERR(meson_encoder_hdmi->connector)) {
- ret = dev_err_probe(priv->dev,
- PTR_ERR(meson_encoder_hdmi->connector),
- "Unable to create HDMI bridge connector\n");
- goto err_put_node;
- }
+ if (IS_ERR(meson_encoder_hdmi->connector))
+ return dev_err_probe(priv->dev,
+ PTR_ERR(meson_encoder_hdmi->connector),
+ "Unable to create HDMI bridge connector\n");
/*
* We should have now in place:
@@ -437,32 +409,11 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
/* Handle this here until handled by drm_bridge_connector_init() */
meson_encoder_hdmi->connector->ycbcr_420_allowed = true;
- pdev = of_find_device_by_node(remote);
- of_node_put(remote);
- if (pdev) {
- struct cec_connector_info conn_info;
- struct cec_notifier *notifier;
-
- cec_fill_conn_info_from_drm(&conn_info, meson_encoder_hdmi->connector);
-
- notifier = cec_notifier_conn_register(&pdev->dev, NULL, &conn_info);
- if (!notifier) {
- put_device(&pdev->dev);
- return -ENOMEM;
- }
-
- meson_encoder_hdmi->cec_notifier = notifier;
- }
-
priv->encoders[MESON_ENC_HDMI] = meson_encoder_hdmi;
dev_dbg(priv->dev, "HDMI encoder initialized\n");
return 0;
-
-err_put_node:
- of_node_put(remote);
- return ret;
}
void meson_encoder_hdmi_remove(struct meson_drm *priv)
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 07/13] drm/meson: encoder_hdmi: Report ycbcr_420_allowed from encoder
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
` (5 preceding siblings ...)
2026-05-18 19:47 ` [PATCH 06/13] drm/meson: encoder_hdmi: Use bridge connector CEC notifier Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-19 7:31 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 08/13] drm/meson: dw-hdmi: Use local dev variable consistently in bind() Jonas Karlman
` (5 subsequent siblings)
12 siblings, 1 reply; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
The bridge connector report ycbcr_420_allowed support when all bridges
in the chain support ycbcr_420_allowed.
Report ycbcr_420_allowed on the encoder bridge so that the bridge
connector automatically can report correct ycbcr_420_allowed support.
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/meson/meson_encoder_hdmi.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
index 45104ef35344..484675cb8284 100644
--- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
@@ -354,6 +354,7 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
meson_encoder_hdmi->bridge.of_node = priv->dev->of_node;
meson_encoder_hdmi->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
meson_encoder_hdmi->bridge.interlace_allowed = true;
+ meson_encoder_hdmi->bridge.ycbcr_420_allowed = true;
pdev = of_find_device_by_node(remote);
of_node_put(remote);
@@ -406,9 +407,6 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
drm_connector_attach_max_bpc_property(meson_encoder_hdmi->connector, 8, 8);
- /* Handle this here until handled by drm_bridge_connector_init() */
- meson_encoder_hdmi->connector->ycbcr_420_allowed = true;
-
priv->encoders[MESON_ENC_HDMI] = meson_encoder_hdmi;
dev_dbg(priv->dev, "HDMI encoder initialized\n");
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 08/13] drm/meson: dw-hdmi: Use local dev variable consistently in bind()
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
` (6 preceding siblings ...)
2026-05-18 19:47 ` [PATCH 07/13] drm/meson: encoder_hdmi: Report ycbcr_420_allowed from encoder Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-19 7:33 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 09/13] drm/meson: dw-hdmi: Use devm_clk_get_enabled() helper Jonas Karlman
` (4 subsequent siblings)
12 siblings, 1 reply; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
Replace indirect struct device accesses via pdev->dev with the local dev
parameter already available in meson_dw_hdmi_bind(), for consistency and
readability.
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/meson/meson_dw_hdmi.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 30099bf71aad..fcd2426af9fc 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -671,9 +671,9 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
DRM_DEBUG_DRIVER("\n");
- match = of_device_get_match_data(&pdev->dev);
+ match = of_device_get_match_data(dev);
if (!match) {
- dev_err(&pdev->dev, "failed to get match data\n");
+ dev_err(dev, "failed to get match data\n");
return -ENODEV;
}
@@ -771,7 +771,7 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
return PTR_ERR(meson_dw_hdmi->hdmi);
}
- meson_dw_hdmi->bridge = of_drm_find_and_get_bridge(pdev->dev.of_node);
+ meson_dw_hdmi->bridge = of_drm_find_and_get_bridge(dev->of_node);
if (!meson_dw_hdmi->bridge) {
devm_free_irq(dev, irq, meson_dw_hdmi);
dw_hdmi_remove(meson_dw_hdmi->hdmi);
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 09/13] drm/meson: dw-hdmi: Use devm_clk_get_enabled() helper
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
` (7 preceding siblings ...)
2026-05-18 19:47 ` [PATCH 08/13] drm/meson: dw-hdmi: Use local dev variable consistently in bind() Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-19 7:33 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 10/13] drm/meson: dw-hdmi: Use dev_err_probe() to report errors Jonas Karlman
` (3 subsequent siblings)
12 siblings, 1 reply; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
Change to use the devm_clk_get_enabled() helper instead of using an
open-coded variant.
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/meson/meson_dw_hdmi.c | 48 +++++++++------------------
1 file changed, 16 insertions(+), 32 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index fcd2426af9fc..d0cf2042d41c 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -634,29 +634,6 @@ static void meson_dw_hdmi_init(struct meson_dw_hdmi *meson_dw_hdmi)
}
-static void meson_disable_clk(void *data)
-{
- clk_disable_unprepare(data);
-}
-
-static int meson_enable_clk(struct device *dev, char *name)
-{
- struct clk *clk;
- int ret;
-
- clk = devm_clk_get(dev, name);
- if (IS_ERR(clk)) {
- dev_err(dev, "Unable to get %s pclk\n", name);
- return PTR_ERR(clk);
- }
-
- ret = clk_prepare_enable(clk);
- if (!ret)
- ret = devm_add_action_or_reset(dev, meson_disable_clk, clk);
-
- return ret;
-}
-
static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
void *data)
{
@@ -666,6 +643,7 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
struct drm_device *drm = data;
struct meson_drm *priv = drm->dev_private;
struct dw_hdmi_plat_data *dw_plat_data;
+ struct clk *clk;
int irq;
int ret;
@@ -716,17 +694,23 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
if (IS_ERR(meson_dw_hdmi->hdmitx))
return PTR_ERR(meson_dw_hdmi->hdmitx);
- ret = meson_enable_clk(dev, "isfr");
- if (ret)
- return ret;
+ clk = devm_clk_get_enabled(dev, "isfr");
+ if (IS_ERR(clk)) {
+ dev_err(dev, "Unable to get isfr pclk\n");
+ return PTR_ERR(clk);
+ }
- ret = meson_enable_clk(dev, "iahb");
- if (ret)
- return ret;
+ clk = devm_clk_get_enabled(dev, "iahb");
+ if (IS_ERR(clk)) {
+ dev_err(dev, "Unable to get iahb pclk\n");
+ return PTR_ERR(clk);
+ }
- ret = meson_enable_clk(dev, "venci");
- if (ret)
- return ret;
+ clk = devm_clk_get_enabled(dev, "venci");
+ if (IS_ERR(clk)) {
+ dev_err(dev, "Unable to get venci pclk\n");
+ return PTR_ERR(clk);
+ }
dw_plat_data->regm = devm_regmap_init(dev, NULL, meson_dw_hdmi,
&meson_dw_hdmi_regmap_config);
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 10/13] drm/meson: dw-hdmi: Use dev_err_probe() to report errors
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
` (8 preceding siblings ...)
2026-05-18 19:47 ` [PATCH 09/13] drm/meson: dw-hdmi: Use devm_clk_get_enabled() helper Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-19 7:34 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 11/13] drm/bridge: dw-hdmi: Export dw_hdmi_schedule_hpd_work() helper Jonas Karlman
` (2 subsequent siblings)
12 siblings, 1 reply; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
Change to use dev_err_probe() to report bind() errors consistently.
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/meson/meson_dw_hdmi.c | 65 +++++++++++++--------------
1 file changed, 30 insertions(+), 35 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index d0cf2042d41c..1dd59196ff7f 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -650,10 +650,9 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
DRM_DEBUG_DRIVER("\n");
match = of_device_get_match_data(dev);
- if (!match) {
- dev_err(dev, "failed to get match data\n");
- return -ENODEV;
- }
+ if (!match)
+ return dev_err_probe(dev, -ENODEV,
+ "Failed to get match data\n");
meson_dw_hdmi = devm_kzalloc(dev, sizeof(*meson_dw_hdmi),
GFP_KERNEL);
@@ -667,50 +666,45 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
ret = devm_regulator_get_enable_optional(dev, "hdmi");
if (ret < 0 && ret != -ENODEV)
- return ret;
+ return dev_err_probe(dev, ret,
+ "Failed to get/enable hdmi regulator\n");
meson_dw_hdmi->hdmitx_apb = devm_reset_control_get_exclusive(dev,
"hdmitx_apb");
- if (IS_ERR(meson_dw_hdmi->hdmitx_apb)) {
- dev_err(dev, "Failed to get hdmitx_apb reset\n");
- return PTR_ERR(meson_dw_hdmi->hdmitx_apb);
- }
+ if (IS_ERR(meson_dw_hdmi->hdmitx_apb))
+ return dev_err_probe(dev, PTR_ERR(meson_dw_hdmi->hdmitx_apb),
+ "Failed to get hdmitx_apb reset\n");
meson_dw_hdmi->hdmitx_ctrl = devm_reset_control_get_exclusive(dev,
"hdmitx");
- if (IS_ERR(meson_dw_hdmi->hdmitx_ctrl)) {
- dev_err(dev, "Failed to get hdmitx reset\n");
- return PTR_ERR(meson_dw_hdmi->hdmitx_ctrl);
- }
+ if (IS_ERR(meson_dw_hdmi->hdmitx_ctrl))
+ return dev_err_probe(dev, PTR_ERR(meson_dw_hdmi->hdmitx_ctrl),
+ "Failed to get hdmitx reset\n");
meson_dw_hdmi->hdmitx_phy = devm_reset_control_get_exclusive(dev,
"hdmitx_phy");
- if (IS_ERR(meson_dw_hdmi->hdmitx_phy)) {
- dev_err(dev, "Failed to get hdmitx_phy reset\n");
- return PTR_ERR(meson_dw_hdmi->hdmitx_phy);
- }
+ if (IS_ERR(meson_dw_hdmi->hdmitx_phy))
+ return dev_err_probe(dev, PTR_ERR(meson_dw_hdmi->hdmitx_phy),
+ "Failed to get hdmitx_phy reset\n");
meson_dw_hdmi->hdmitx = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(meson_dw_hdmi->hdmitx))
return PTR_ERR(meson_dw_hdmi->hdmitx);
clk = devm_clk_get_enabled(dev, "isfr");
- if (IS_ERR(clk)) {
- dev_err(dev, "Unable to get isfr pclk\n");
- return PTR_ERR(clk);
- }
+ if (IS_ERR(clk))
+ return dev_err_probe(dev, PTR_ERR(clk),
+ "Failed to get isfr pclk\n");
clk = devm_clk_get_enabled(dev, "iahb");
- if (IS_ERR(clk)) {
- dev_err(dev, "Unable to get iahb pclk\n");
- return PTR_ERR(clk);
- }
+ if (IS_ERR(clk))
+ return dev_err_probe(dev, PTR_ERR(clk),
+ "Failed to get iahb pclk\n");
clk = devm_clk_get_enabled(dev, "venci");
- if (IS_ERR(clk)) {
- dev_err(dev, "Unable to get venci pclk\n");
- return PTR_ERR(clk);
- }
+ if (IS_ERR(clk))
+ return dev_err_probe(dev, PTR_ERR(clk),
+ "Failed to get venci pclk\n");
dw_plat_data->regm = devm_regmap_init(dev, NULL, meson_dw_hdmi,
&meson_dw_hdmi_regmap_config);
@@ -724,10 +718,9 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
ret = devm_request_threaded_irq(dev, irq, dw_hdmi_top_irq,
dw_hdmi_top_thread_irq, IRQF_SHARED,
"dw_hdmi_top_irq", meson_dw_hdmi);
- if (ret) {
- dev_err(dev, "Failed to request hdmi top irq\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "Failed to request hdmi top irq\n");
meson_dw_hdmi_init(meson_dw_hdmi);
@@ -752,14 +745,16 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
meson_dw_hdmi->hdmi = dw_hdmi_probe(pdev, &meson_dw_hdmi->dw_plat_data);
if (IS_ERR(meson_dw_hdmi->hdmi)) {
devm_free_irq(dev, irq, meson_dw_hdmi);
- return PTR_ERR(meson_dw_hdmi->hdmi);
+ return dev_err_probe(dev, PTR_ERR(meson_dw_hdmi->hdmi),
+ "Failed to probe dw-hdmi bridge\n");
}
meson_dw_hdmi->bridge = of_drm_find_and_get_bridge(dev->of_node);
if (!meson_dw_hdmi->bridge) {
devm_free_irq(dev, irq, meson_dw_hdmi);
dw_hdmi_remove(meson_dw_hdmi->hdmi);
- return -ENODEV;
+ return dev_err_probe(dev, -ENODEV,
+ "Failed to find dw-hdmi bridge\n");
}
DRM_DEBUG_DRIVER("HDMI controller initialized\n");
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 11/13] drm/bridge: dw-hdmi: Export dw_hdmi_schedule_hpd_work() helper
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
` (9 preceding siblings ...)
2026-05-18 19:47 ` [PATCH 10/13] drm/meson: dw-hdmi: Use dev_err_probe() to report errors Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-18 19:47 ` [PATCH 12/13] drm/meson: dw-hdmi: Use " Jonas Karlman
2026-05-18 19:47 ` [PATCH 13/13] drm/meson: dw-hdmi: Use suspend_late/resume_early/resume_noirq pm ops Jonas Karlman
12 siblings, 0 replies; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Andrzej Hajda,
Robert Foss, Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Luca Ceresoli, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter
Cc: Jerome Brunet, Martin Blumenstingl, dri-devel, linux-amlogic,
linux-arm-kernel, linux-kernel, linux-rockchip
Export a dw_hdmi_schedule_hpd_work() helper that schedule the HPD
delayed work. Primarily to be used by the meson dw-hdmi driver.
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 11 +++++++++--
include/drm/bridge/dw_hdmi.h | 2 ++
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 99dd62b6becf..54d75317ce9c 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -3014,8 +3014,7 @@ static irqreturn_t dw_hdmi_hardirq(int irq, void *dev_id)
status == connector_status_connected ?
"plugin" : "plugout");
- mod_delayed_work(system_percpu_wq, &hdmi->hpd_work,
- msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS));
+ dw_hdmi_schedule_hpd_work(hdmi);
hdmi_writeb(hdmi, intr_stat, HDMI_IH_PHY_STAT0);
hdmi_writeb(hdmi, ~HDMI_IH_PHY_STAT0_HPD, HDMI_IH_MUTE_PHY_STAT0);
@@ -3025,6 +3024,14 @@ static irqreturn_t dw_hdmi_hardirq(int irq, void *dev_id)
return ret;
}
+void dw_hdmi_schedule_hpd_work(struct dw_hdmi *hdmi)
+{
+ if (!IS_ERR_OR_NULL(hdmi))
+ mod_delayed_work(system_percpu_wq, &hdmi->hpd_work,
+ msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS));
+}
+EXPORT_SYMBOL_GPL(dw_hdmi_schedule_hpd_work);
+
static void dw_hdmi_hpd_work(struct work_struct *work)
{
struct dw_hdmi *hdmi = container_of(work, struct dw_hdmi, hpd_work.work);
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
index 10013b8d3adb..c56d1775f04a 100644
--- a/include/drm/bridge/dw_hdmi.h
+++ b/include/drm/bridge/dw_hdmi.h
@@ -184,6 +184,8 @@ struct dw_hdmi *dw_hdmi_bind(struct platform_device *pdev,
void dw_hdmi_resume(struct dw_hdmi *hdmi);
+void dw_hdmi_schedule_hpd_work(struct dw_hdmi *hdmi);
+
int dw_hdmi_set_plugged_cb(struct dw_hdmi *hdmi, hdmi_codec_plugged_cb fn,
struct device *codec_dev);
void dw_hdmi_set_sample_non_pcm(struct dw_hdmi *hdmi, unsigned int non_pcm);
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 12/13] drm/meson: dw-hdmi: Use dw_hdmi_schedule_hpd_work() helper
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
` (10 preceding siblings ...)
2026-05-18 19:47 ` [PATCH 11/13] drm/bridge: dw-hdmi: Export dw_hdmi_schedule_hpd_work() helper Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
2026-05-18 19:47 ` [PATCH 13/13] drm/meson: dw-hdmi: Use suspend_late/resume_early/resume_noirq pm ops Jonas Karlman
12 siblings, 0 replies; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
Change to use the dw-hdmi HPD delayed work to handle HPD events.
Also merge top and bottom half IRQ handlers to simplify IRQ handling now
that HPD event is handled using a delayed work.
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
drivers/gpu/drm/meson/meson_dw_hdmi.c | 26 +++++---------------------
1 file changed, 5 insertions(+), 21 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 1dd59196ff7f..7b465e216759 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -145,7 +145,6 @@ struct meson_dw_hdmi {
struct reset_control *hdmitx_apb;
struct reset_control *hdmitx_ctrl;
struct reset_control *hdmitx_phy;
- u32 irq_stat;
struct dw_hdmi *hdmi;
struct drm_bridge *bridge;
};
@@ -498,10 +497,10 @@ static irqreturn_t dw_hdmi_top_irq(int irq, void *dev_id)
stat = dw_hdmi->data->top_read(dw_hdmi, HDMITX_TOP_INTR_STAT);
dw_hdmi->data->top_write(dw_hdmi, HDMITX_TOP_INTR_STAT_CLR, stat);
- /* HPD Events, handle in the threaded interrupt handler */
+ /* HPD Events, handle in delayed work */
if (stat & (HDMITX_TOP_INTR_HPD_RISE | HDMITX_TOP_INTR_HPD_FALL)) {
- dw_hdmi->irq_stat = stat;
- return IRQ_WAKE_THREAD;
+ dw_hdmi_schedule_hpd_work(dw_hdmi->hdmi);
+ return IRQ_HANDLED;
}
/* HDMI Controller Interrupt */
@@ -513,20 +512,6 @@ static irqreturn_t dw_hdmi_top_irq(int irq, void *dev_id)
return IRQ_HANDLED;
}
-/* Threaded interrupt handler to manage HPD events */
-static irqreturn_t dw_hdmi_top_thread_irq(int irq, void *dev_id)
-{
- struct meson_dw_hdmi *dw_hdmi = dev_id;
- u32 stat = dw_hdmi->irq_stat;
-
- /* HPD Events */
- if (stat & (HDMITX_TOP_INTR_HPD_RISE | HDMITX_TOP_INTR_HPD_FALL) &&
- dw_hdmi->bridge)
- drm_helper_hpd_irq_event(dw_hdmi->bridge->dev);
-
- return IRQ_HANDLED;
-}
-
/* DW HDMI Regmap */
static int meson_dw_hdmi_reg_read(void *context, unsigned int reg,
@@ -715,9 +700,8 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
if (irq < 0)
return irq;
- ret = devm_request_threaded_irq(dev, irq, dw_hdmi_top_irq,
- dw_hdmi_top_thread_irq, IRQF_SHARED,
- "dw_hdmi_top_irq", meson_dw_hdmi);
+ ret = devm_request_irq(dev, irq, dw_hdmi_top_irq, IRQF_SHARED,
+ "dw_hdmi_top_irq", meson_dw_hdmi);
if (ret)
return dev_err_probe(dev, ret,
"Failed to request hdmi top irq\n");
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 13/13] drm/meson: dw-hdmi: Use suspend_late/resume_early/resume_noirq pm ops
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
` (11 preceding siblings ...)
2026-05-18 19:47 ` [PATCH 12/13] drm/meson: dw-hdmi: Use " Jonas Karlman
@ 2026-05-18 19:47 ` Jonas Karlman
12 siblings, 0 replies; 26+ messages in thread
From: Jonas Karlman @ 2026-05-18 19:47 UTC (permalink / raw)
To: Neil Armstrong, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
Jonas Karlman, linux-rockchip
meson_drv_pm_suspend()/drm_mode_config_helper_suspend() and
meson_drv_pm_resume()/drm_mode_config_helper_resume() is called
after/before the suspend/resume pm ops of dw-hdmi.
This result in atomic_disable() being called after
meson_dw_hdmi_pm_suspend() and atomic_enable() before
meson_dw_hdmi_pm_resume()/dw_hdmi_resume() is called.
Suspend (without changes):
- meson_dw_hdmi_pm_suspend()
- meson_drv_pm_suspend()
- drm_mode_config_helper_suspend()
- atomic_disable()
Resume (without changes):
- resume_irq() <<-- system freeze at hdmi-tx irq on G12B
- meson_drv_pm_resume()
- drm_mode_config_helper_resume()
- atomic_enable()
- meson_dw_hdmi_pm_resume()
- meson_dw_hdmi_init()
- dw_hdmi_resume()
- dw_hdmi_init_hw()
Change to use suspend_late/resume_early pm ops for system suspend to
ensure pm ops for dw-hdmi is run after/before meson_drv pm ops.
The G12B can trigger an IRQ (stat=0x40) very early during resume_irq
that causes a system freeze. Move the meson_dw_hdmi_init() call to
resume_noirq pm ops to resolve the system freeze.
Also move meson_dw_hdmi_init() to run before interrupt allocation to
ensure HW has been initialized when first IRQ is triggered.
Suspend (with changes):
- meson_drv_pm_suspend()
- drm_mode_config_helper_suspend()
- atomic_disable()
- meson_dw_hdmi_pm_suspend_late()
Resume (with changes):
- meson_dw_hdmi_pm_resume_noirq()
- meson_dw_hdmi_init()
- resume_irq()
- meson_dw_hdmi_pm_resume_early()
- dw_hdmi_resume()
- dw_hdmi_init_hw()
- meson_drv_pm_resume()
- drm_mode_config_helper_resume()
- atomic_enable()
Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
---
This can be tested using CONFIG_PM_DEBUG with a simulated suspend:
echo N > /sys/module/printk/parameters/console_suspend
echo 1 > /sys/power/pm_debug_messages
echo platform > /sys/power/pm_test
echo mem > /sys/power/state
or using something like following for real suspend/resume:
echo N > /sys/module/printk/parameters/console_suspend
rtcwake -m mem -s 5 -d /dev/rtc1
On S905X a simulated platform pm_test could only be tested. On G12A both
simulated and real suspend works. And on G12B the board seems to freeze
at a later stage when taking out of real suspend, however platform
pm_test works.
---
drivers/gpu/drm/meson/meson_dw_hdmi.c | 27 +++++++++++++++++++--------
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 7b465e216759..16f15466a6f4 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -696,6 +696,8 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
if (IS_ERR(dw_plat_data->regm))
return PTR_ERR(dw_plat_data->regm);
+ meson_dw_hdmi_init(meson_dw_hdmi);
+
irq = platform_get_irq(pdev, 0);
if (irq < 0)
return irq;
@@ -706,8 +708,6 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
return dev_err_probe(dev, ret,
"Failed to request hdmi top irq\n");
- meson_dw_hdmi_init(meson_dw_hdmi);
-
/* Bridge / Connector */
dw_plat_data->priv_data = meson_dw_hdmi;
@@ -763,7 +763,7 @@ static const struct component_ops meson_dw_hdmi_ops = {
.unbind = meson_dw_hdmi_unbind,
};
-static int __maybe_unused meson_dw_hdmi_pm_suspend(struct device *dev)
+static int __maybe_unused meson_dw_hdmi_pm_suspend_late(struct device *dev)
{
struct meson_dw_hdmi *meson_dw_hdmi = dev_get_drvdata(dev);
@@ -777,7 +777,19 @@ static int __maybe_unused meson_dw_hdmi_pm_suspend(struct device *dev)
return 0;
}
-static int __maybe_unused meson_dw_hdmi_pm_resume(struct device *dev)
+static int __maybe_unused meson_dw_hdmi_pm_resume_early(struct device *dev)
+{
+ struct meson_dw_hdmi *meson_dw_hdmi = dev_get_drvdata(dev);
+
+ if (!meson_dw_hdmi)
+ return 0;
+
+ dw_hdmi_resume(meson_dw_hdmi->hdmi);
+
+ return 0;
+}
+
+static int __maybe_unused meson_dw_hdmi_pm_resume_noirq(struct device *dev)
{
struct meson_dw_hdmi *meson_dw_hdmi = dev_get_drvdata(dev);
@@ -786,8 +798,6 @@ static int __maybe_unused meson_dw_hdmi_pm_resume(struct device *dev)
meson_dw_hdmi_init(meson_dw_hdmi);
- dw_hdmi_resume(meson_dw_hdmi->hdmi);
-
return 0;
}
@@ -802,8 +812,9 @@ static void meson_dw_hdmi_remove(struct platform_device *pdev)
}
static const struct dev_pm_ops meson_dw_hdmi_pm_ops = {
- SET_SYSTEM_SLEEP_PM_OPS(meson_dw_hdmi_pm_suspend,
- meson_dw_hdmi_pm_resume)
+ SET_LATE_SYSTEM_SLEEP_PM_OPS(meson_dw_hdmi_pm_suspend_late,
+ meson_dw_hdmi_pm_resume_early)
+ SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL, meson_dw_hdmi_pm_resume_noirq)
};
static const struct of_device_id meson_dw_hdmi_of_table[] = {
--
2.54.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH 05/13] drm/meson: encoder_hdmi: Use CEC phys addr from display_info
2026-05-18 19:47 ` [PATCH 05/13] drm/meson: encoder_hdmi: Use CEC phys addr from display_info Jonas Karlman
@ 2026-05-19 6:36 ` Hans Verkuil
2026-05-19 7:27 ` Neil Armstrong
1 sibling, 0 replies; 26+ messages in thread
From: Hans Verkuil @ 2026-05-19 6:36 UTC (permalink / raw)
To: Jonas Karlman, Neil Armstrong, Kevin Hilman, Heiko Stuebner,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 18/05/2026 21:47, Jonas Karlman wrote:
> The dw-hdmi bridge detect() func now updates EDID for the connector.
> Something that ensures that display_info.source_physical_address has an
> updated CEC phys addr when the hpd_notify() func is called.
>
> Change to use display_info source_physical_address directly instead of
> re-reading EDID to set the CEC phys addr at HPD interrupt.
>
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
Acked-by: Hans Verkuil <hverkuil+cisco@kernel•org>
Regards,
Hans
> ---
> drivers/gpu/drm/meson/meson_encoder_hdmi.c | 26 ++++------------------
> 1 file changed, 4 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> index 55c0601df3c6..1b9a1d9ed3d3 100644
> --- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> @@ -330,28 +330,10 @@ static void meson_encoder_hdmi_hpd_notify(struct drm_bridge *bridge,
> if (!encoder_hdmi->cec_notifier)
> return;
>
> - if (status == connector_status_connected) {
> - const struct drm_edid *drm_edid;
> - const struct edid *edid;
> -
> - drm_edid = drm_bridge_edid_read(encoder_hdmi->bridge.next_bridge,
> - encoder_hdmi->connector);
> - if (!drm_edid)
> - return;
> -
> - /*
> - * FIXME: The CEC physical address should be set using
> - * cec_notifier_set_phys_addr(encoder_hdmi->cec_notifier,
> - * connector->display_info.source_physical_address) from a path
> - * that has read the EDID and called
> - * drm_edid_connector_update().
> - */
> - edid = drm_edid_raw(drm_edid);
> -
> - cec_notifier_set_phys_addr_from_edid(encoder_hdmi->cec_notifier, edid);
> -
> - drm_edid_free(drm_edid);
> - } else
> + if (status == connector_status_connected)
> + cec_notifier_set_phys_addr(encoder_hdmi->cec_notifier,
> + connector->display_info.source_physical_address);
> + else
> cec_notifier_phys_addr_invalidate(encoder_hdmi->cec_notifier);
> }
>
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 06/13] drm/meson: encoder_hdmi: Use bridge connector CEC notifier
2026-05-18 19:47 ` [PATCH 06/13] drm/meson: encoder_hdmi: Use bridge connector CEC notifier Jonas Karlman
@ 2026-05-19 6:38 ` Hans Verkuil
2026-05-19 7:30 ` Neil Armstrong
1 sibling, 0 replies; 26+ messages in thread
From: Hans Verkuil @ 2026-05-19 6:38 UTC (permalink / raw)
To: Jonas Karlman, Neil Armstrong, Kevin Hilman, Heiko Stuebner,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 18/05/2026 21:47, Jonas Karlman wrote:
> The dw-hdmi bridge detect() func now updates EDID and CEC phys addr for
> the connector and any registered generic CEC notifier.
>
> Replace the open-coded CEC notifier handling with use of the bridge CEC
> notifier op.
>
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
Acked-by: Hans Verkuil <hverkuil+cisco@kernel•org>
Regards,
Hans
> ---
> drivers/gpu/drm/meson/Kconfig | 1 +
> drivers/gpu/drm/meson/meson_encoder_hdmi.c | 85 +++++-----------------
> 2 files changed, 19 insertions(+), 67 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/Kconfig b/drivers/gpu/drm/meson/Kconfig
> index 417f79829cf8..0dc5ca21e4fc 100644
> --- a/drivers/gpu/drm/meson/Kconfig
> +++ b/drivers/gpu/drm/meson/Kconfig
> @@ -13,6 +13,7 @@ config DRM_MESON
> select REGMAP_MMIO
> select MESON_CANVAS
> select CEC_CORE if CEC_NOTIFIER
> + select DRM_DISPLAY_HDMI_CEC_NOTIFIER_HELPER if CEC_NOTIFIER
>
> config DRM_MESON_DW_HDMI
> tristate "HDMI Synopsys Controller support for Amlogic Meson Display"
> diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> index 1b9a1d9ed3d3..45104ef35344 100644
> --- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> @@ -16,8 +16,6 @@
> #include <linux/regulator/consumer.h>
> #include <linux/reset.h>
>
> -#include <media/cec-notifier.h>
> -
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_bridge.h>
> #include <drm/drm_bridge_connector.h>
> @@ -41,7 +39,6 @@ struct meson_encoder_hdmi {
> struct drm_connector *connector;
> struct meson_drm *priv;
> unsigned long output_bus_fmt;
> - struct cec_notifier *cec_notifier;
> };
>
> #define bridge_to_meson_encoder_hdmi(x) \
> @@ -57,14 +54,6 @@ static int meson_encoder_hdmi_attach(struct drm_bridge *bridge,
> &encoder_hdmi->bridge, flags);
> }
>
> -static void meson_encoder_hdmi_detach(struct drm_bridge *bridge)
> -{
> - struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge);
> -
> - cec_notifier_conn_unregister(encoder_hdmi->cec_notifier);
> - encoder_hdmi->cec_notifier = NULL;
> -}
> -
> static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi,
> const struct drm_display_mode *mode)
> {
> @@ -321,27 +310,9 @@ static int meson_encoder_hdmi_atomic_check(struct drm_bridge *bridge,
> return 0;
> }
>
> -static void meson_encoder_hdmi_hpd_notify(struct drm_bridge *bridge,
> - struct drm_connector *connector,
> - enum drm_connector_status status)
> -{
> - struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge);
> -
> - if (!encoder_hdmi->cec_notifier)
> - return;
> -
> - if (status == connector_status_connected)
> - cec_notifier_set_phys_addr(encoder_hdmi->cec_notifier,
> - connector->display_info.source_physical_address);
> - else
> - cec_notifier_phys_addr_invalidate(encoder_hdmi->cec_notifier);
> -}
> -
> static const struct drm_bridge_funcs meson_encoder_hdmi_bridge_funcs = {
> .attach = meson_encoder_hdmi_attach,
> - .detach = meson_encoder_hdmi_detach,
> .mode_valid = meson_encoder_hdmi_mode_valid,
> - .hpd_notify = meson_encoder_hdmi_hpd_notify,
> .atomic_enable = meson_encoder_hdmi_atomic_enable,
> .atomic_disable = meson_encoder_hdmi_atomic_disable,
> .atomic_get_input_bus_fmts = meson_encoder_hdmi_get_inp_bus_fmts,
> @@ -374,9 +345,9 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
>
> meson_encoder_hdmi->bridge.next_bridge = of_drm_find_and_get_bridge(remote);
> if (!meson_encoder_hdmi->bridge.next_bridge) {
> - ret = dev_err_probe(priv->dev, -EPROBE_DEFER,
> - "Failed to find HDMI transceiver bridge\n");
> - goto err_put_node;
> + of_node_put(remote);
> + return dev_err_probe(priv->dev, -EPROBE_DEFER,
> + "Failed to find HDMI transceiver bridge\n");
> }
>
> /* HDMI Encoder Bridge */
> @@ -384,6 +355,13 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
> meson_encoder_hdmi->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
> meson_encoder_hdmi->bridge.interlace_allowed = true;
>
> + pdev = of_find_device_by_node(remote);
> + of_node_put(remote);
> + if (pdev) {
> + meson_encoder_hdmi->bridge.ops |= DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER;
> + meson_encoder_hdmi->bridge.hdmi_cec_dev = &pdev->dev;
> + }
> +
> drm_bridge_add(&meson_encoder_hdmi->bridge);
>
> meson_encoder_hdmi->priv = priv;
> @@ -391,30 +369,24 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
> /* Encoder */
> ret = drm_simple_encoder_init(priv->drm, &meson_encoder_hdmi->encoder,
> DRM_MODE_ENCODER_TMDS);
> - if (ret) {
> - dev_err_probe(priv->dev, ret, "Failed to init HDMI encoder\n");
> - goto err_put_node;
> - }
> + if (ret)
> + return dev_err_probe(priv->dev, ret, "Failed to init HDMI encoder\n");
>
> meson_encoder_hdmi->encoder.possible_crtcs = BIT(0);
>
> /* Attach HDMI Encoder Bridge to Encoder */
> ret = drm_bridge_attach(&meson_encoder_hdmi->encoder, &meson_encoder_hdmi->bridge, NULL,
> DRM_BRIDGE_ATTACH_NO_CONNECTOR);
> - if (ret) {
> - dev_err_probe(priv->dev, ret, "Failed to attach bridge\n");
> - goto err_put_node;
> - }
> + if (ret)
> + return dev_err_probe(priv->dev, ret, "Failed to attach bridge\n");
>
> /* Initialize & attach Bridge Connector */
> meson_encoder_hdmi->connector = drm_bridge_connector_init(priv->drm,
> &meson_encoder_hdmi->encoder);
> - if (IS_ERR(meson_encoder_hdmi->connector)) {
> - ret = dev_err_probe(priv->dev,
> - PTR_ERR(meson_encoder_hdmi->connector),
> - "Unable to create HDMI bridge connector\n");
> - goto err_put_node;
> - }
> + if (IS_ERR(meson_encoder_hdmi->connector))
> + return dev_err_probe(priv->dev,
> + PTR_ERR(meson_encoder_hdmi->connector),
> + "Unable to create HDMI bridge connector\n");
>
> /*
> * We should have now in place:
> @@ -437,32 +409,11 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
> /* Handle this here until handled by drm_bridge_connector_init() */
> meson_encoder_hdmi->connector->ycbcr_420_allowed = true;
>
> - pdev = of_find_device_by_node(remote);
> - of_node_put(remote);
> - if (pdev) {
> - struct cec_connector_info conn_info;
> - struct cec_notifier *notifier;
> -
> - cec_fill_conn_info_from_drm(&conn_info, meson_encoder_hdmi->connector);
> -
> - notifier = cec_notifier_conn_register(&pdev->dev, NULL, &conn_info);
> - if (!notifier) {
> - put_device(&pdev->dev);
> - return -ENOMEM;
> - }
> -
> - meson_encoder_hdmi->cec_notifier = notifier;
> - }
> -
> priv->encoders[MESON_ENC_HDMI] = meson_encoder_hdmi;
>
> dev_dbg(priv->dev, "HDMI encoder initialized\n");
>
> return 0;
> -
> -err_put_node:
> - of_node_put(remote);
> - return ret;
> }
>
> void meson_encoder_hdmi_remove(struct meson_drm *priv)
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 01/13] drm/meson: dw-hdmi: Report connector status based on HPD bit
2026-05-18 19:47 ` [PATCH 01/13] drm/meson: dw-hdmi: Report connector status based on HPD bit Jonas Karlman
@ 2026-05-19 7:23 ` Neil Armstrong
0 siblings, 0 replies; 26+ messages in thread
From: Neil Armstrong @ 2026-05-19 7:23 UTC (permalink / raw)
To: Jonas Karlman, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 5/18/26 21:47, Jonas Karlman wrote:
> G12A added support for RX-SENSE, status for both HPD and RX-SENSE is
> reported in the TOP_STAT0 register.
>
> Limit read_hpd() phy ops to only report connected status based on the
> HPD status bit in TOP_STAT0, to help ensure that EDID can be read from
> the sink in the connector detect() func.
>
> Fixes: 3b7c1237a72a ("drm/meson: Add G12A support for the DW-HDMI Glue")
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
> ---
> drivers/gpu/drm/meson/meson_dw_hdmi.c | 6 ++++--
> drivers/gpu/drm/meson/meson_dw_hdmi.h | 3 +++
> 2 files changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index 2a8756da569b..993f6d5d4b29 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -457,9 +457,11 @@ static enum drm_connector_status dw_hdmi_read_hpd(struct dw_hdmi *hdmi,
> void *data)
> {
> struct meson_dw_hdmi *dw_hdmi = (struct meson_dw_hdmi *)data;
> + unsigned int stat;
>
> - return !!dw_hdmi->data->top_read(dw_hdmi, HDMITX_TOP_STAT0) ?
> - connector_status_connected : connector_status_disconnected;
> + stat = dw_hdmi->data->top_read(dw_hdmi, HDMITX_TOP_STAT0);
> + return stat & HDMITX_TOP_STAT0_HPD ? connector_status_connected :
> + connector_status_disconnected;
> }
>
> static void dw_hdmi_setup_hpd(struct dw_hdmi *hdmi,
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.h b/drivers/gpu/drm/meson/meson_dw_hdmi.h
> index 08e1c14e4ea0..cb4616daf667 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.h
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.h
> @@ -157,4 +157,7 @@
> */
> #define HDMITX_TOP_STAT0 (0x00E)
>
> +#define HDMITX_TOP_STAT0_HPD BIT(0)
> +#define HDMITX_TOP_STAT0_RXSENSE BIT(1)
> +
> #endif /* __MESON_DW_HDMI_H */
Thanks, pretty sure the RXSENSE needs some setup in the PHY to work
and Amlogic never enabled it, but this version is clearly better.
Reviewed-by: Neil Armstrong <neil.armstrong@linaro•org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 02/13] drm/meson: dw-hdmi: Protect from possible NULL pointer dereference
2026-05-18 19:47 ` [PATCH 02/13] drm/meson: dw-hdmi: Protect from possible NULL pointer dereference Jonas Karlman
@ 2026-05-19 7:23 ` Neil Armstrong
0 siblings, 0 replies; 26+ messages in thread
From: Neil Armstrong @ 2026-05-19 7:23 UTC (permalink / raw)
To: Jonas Karlman, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl, Sam Ravnborg
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 5/18/26 21:47, Jonas Karlman wrote:
> The IRQ handler can be called at any time after the call to
> devm_request_threaded_irq() completes, even before dw_hdmi->bridge has
> been assigned later in meson_dw_hdmi_bind().
>
> Protect from a possible NULL pointer dereference in IRQ handler by only
> calling drm_helper_hpd_irq_event() when bridge has been assigned.
>
> Fixes: e67f6037ae1b ("drm/meson: split out encoder from meson_dw_hdmi")
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
> ---
> I only observed this NULL pointer dereference one time, without being
> able to reliably re-create a similar timing scenario. I still think this
> is an issue that possible could happen and likely should be fixed.
>
> Note that patches later in this series will fully replace this change.
> ---
> drivers/gpu/drm/meson/meson_dw_hdmi.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index 993f6d5d4b29..eafe7daf6ff1 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -520,7 +520,8 @@ static irqreturn_t dw_hdmi_top_thread_irq(int irq, void *dev_id)
> u32 stat = dw_hdmi->irq_stat;
>
> /* HPD Events */
> - if (stat & (HDMITX_TOP_INTR_HPD_RISE | HDMITX_TOP_INTR_HPD_FALL)) {
> + if (stat & (HDMITX_TOP_INTR_HPD_RISE | HDMITX_TOP_INTR_HPD_FALL) &&
> + dw_hdmi->bridge) {
> bool hpd_connected = false;
>
> if (stat & HDMITX_TOP_INTR_HPD_RISE)
Reviewed-by: Neil Armstrong <neil.armstrong@linaro•org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 03/13] drm/meson: dw-hdmi: Call dw_hdmi_remove() consistently
2026-05-18 19:47 ` [PATCH 03/13] drm/meson: dw-hdmi: Call dw_hdmi_remove() consistently Jonas Karlman
@ 2026-05-19 7:24 ` Neil Armstrong
0 siblings, 0 replies; 26+ messages in thread
From: Neil Armstrong @ 2026-05-19 7:24 UTC (permalink / raw)
To: Jonas Karlman, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 5/18/26 21:47, Jonas Karlman wrote:
> dw-hdmi export two similar pair of functions to probe()/remove() and
> bind()/unbind(), update to use dw_hdmi_remove() for consistency.
>
> dw_hdmi_probe() will drm_bridge_add() the dw-hdmi bridge, so it is
> expected that of_drm_find_and_get_bridge() always return the dw-hdmi
> bridge. Regardless, validate that the dw-hdmi can be found for
> consistent error handling.
>
> Also always ensure the IRQ handler and bridge is released before
> dw_hdmi_remove() is called.
>
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
> ---
> drivers/gpu/drm/meson/meson_dw_hdmi.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index eafe7daf6ff1..9aafdc768f2b 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -775,10 +775,17 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
> platform_set_drvdata(pdev, meson_dw_hdmi);
>
> meson_dw_hdmi->hdmi = dw_hdmi_probe(pdev, &meson_dw_hdmi->dw_plat_data);
> - if (IS_ERR(meson_dw_hdmi->hdmi))
> + if (IS_ERR(meson_dw_hdmi->hdmi)) {
> + devm_free_irq(dev, irq, meson_dw_hdmi);
> return PTR_ERR(meson_dw_hdmi->hdmi);
> + }
>
> meson_dw_hdmi->bridge = of_drm_find_and_get_bridge(pdev->dev.of_node);
> + if (!meson_dw_hdmi->bridge) {
> + devm_free_irq(dev, irq, meson_dw_hdmi);
> + dw_hdmi_remove(meson_dw_hdmi->hdmi);
> + return -ENODEV;
> + }
>
> DRM_DEBUG_DRIVER("HDMI controller initialized\n");
>
> @@ -793,8 +800,8 @@ static void meson_dw_hdmi_unbind(struct device *dev, struct device *master,
> int irq = platform_get_irq(pdev, 0);
>
> devm_free_irq(dev, irq, meson_dw_hdmi);
> - dw_hdmi_unbind(meson_dw_hdmi->hdmi);
> drm_bridge_put(meson_dw_hdmi->bridge);
> + dw_hdmi_remove(meson_dw_hdmi->hdmi);
> }
>
> static const struct component_ops meson_dw_hdmi_ops = {
Reviewed-by: Neil Armstrong <neil.armstrong@linaro•org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 04/13] drm/meson: dw-hdmi: Drop call to drm_bridge_hpd_notify()
2026-05-18 19:47 ` [PATCH 04/13] drm/meson: dw-hdmi: Drop call to drm_bridge_hpd_notify() Jonas Karlman
@ 2026-05-19 7:25 ` Neil Armstrong
0 siblings, 0 replies; 26+ messages in thread
From: Neil Armstrong @ 2026-05-19 7:25 UTC (permalink / raw)
To: Jonas Karlman, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 5/18/26 21:47, Jonas Karlman wrote:
> Calls to both drm_helper_hpd_irq_event() and drm_bridge_hpd_notify() in
> the IRQ handler causes multiple hotplug uevents and modesets during an
> HPD interrupt.
>
> Change to only call drm_helper_hpd_irq_event() in IRQ handler to ensure
> only one hotplug uevent is triggered when the connection status or EDID
> has changed.
>
> The bridge connectors detect() func help ensure that any hpd_notify()
> func is called for all bridges in the chain.
>
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
> ---
> drivers/gpu/drm/meson/meson_dw_hdmi.c | 11 +----------
> 1 file changed, 1 insertion(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index 9aafdc768f2b..30099bf71aad 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -521,17 +521,8 @@ static irqreturn_t dw_hdmi_top_thread_irq(int irq, void *dev_id)
>
> /* HPD Events */
> if (stat & (HDMITX_TOP_INTR_HPD_RISE | HDMITX_TOP_INTR_HPD_FALL) &&
> - dw_hdmi->bridge) {
> - bool hpd_connected = false;
> -
> - if (stat & HDMITX_TOP_INTR_HPD_RISE)
> - hpd_connected = true;
> -
> + dw_hdmi->bridge)
> drm_helper_hpd_irq_event(dw_hdmi->bridge->dev);
> - drm_bridge_hpd_notify(dw_hdmi->bridge,
> - hpd_connected ? connector_status_connected
> - : connector_status_disconnected);
> - }
>
> return IRQ_HANDLED;
> }
Reviewed-by: Neil Armstrong <neil.armstrong@linaro•org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 05/13] drm/meson: encoder_hdmi: Use CEC phys addr from display_info
2026-05-18 19:47 ` [PATCH 05/13] drm/meson: encoder_hdmi: Use CEC phys addr from display_info Jonas Karlman
2026-05-19 6:36 ` Hans Verkuil
@ 2026-05-19 7:27 ` Neil Armstrong
1 sibling, 0 replies; 26+ messages in thread
From: Neil Armstrong @ 2026-05-19 7:27 UTC (permalink / raw)
To: Jonas Karlman, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 5/18/26 21:47, Jonas Karlman wrote:
> The dw-hdmi bridge detect() func now updates EDID for the connector.
> Something that ensures that display_info.source_physical_address has an
> updated CEC phys addr when the hpd_notify() func is called.
>
> Change to use display_info source_physical_address directly instead of
> re-reading EDID to set the CEC phys addr at HPD interrupt.
>
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
> ---
> drivers/gpu/drm/meson/meson_encoder_hdmi.c | 26 ++++------------------
> 1 file changed, 4 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> index 55c0601df3c6..1b9a1d9ed3d3 100644
> --- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> @@ -330,28 +330,10 @@ static void meson_encoder_hdmi_hpd_notify(struct drm_bridge *bridge,
> if (!encoder_hdmi->cec_notifier)
> return;
>
> - if (status == connector_status_connected) {
> - const struct drm_edid *drm_edid;
> - const struct edid *edid;
> -
> - drm_edid = drm_bridge_edid_read(encoder_hdmi->bridge.next_bridge,
> - encoder_hdmi->connector);
> - if (!drm_edid)
> - return;
> -
> - /*
> - * FIXME: The CEC physical address should be set using
> - * cec_notifier_set_phys_addr(encoder_hdmi->cec_notifier,
> - * connector->display_info.source_physical_address) from a path
> - * that has read the EDID and called
> - * drm_edid_connector_update().
> - */
> - edid = drm_edid_raw(drm_edid);
> -
> - cec_notifier_set_phys_addr_from_edid(encoder_hdmi->cec_notifier, edid);
> -
> - drm_edid_free(drm_edid);
> - } else
> + if (status == connector_status_connected)
> + cec_notifier_set_phys_addr(encoder_hdmi->cec_notifier,
> + connector->display_info.source_physical_address);
> + else
> cec_notifier_phys_addr_invalidate(encoder_hdmi->cec_notifier);
> }
>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro•org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 06/13] drm/meson: encoder_hdmi: Use bridge connector CEC notifier
2026-05-18 19:47 ` [PATCH 06/13] drm/meson: encoder_hdmi: Use bridge connector CEC notifier Jonas Karlman
2026-05-19 6:38 ` Hans Verkuil
@ 2026-05-19 7:30 ` Neil Armstrong
1 sibling, 0 replies; 26+ messages in thread
From: Neil Armstrong @ 2026-05-19 7:30 UTC (permalink / raw)
To: Jonas Karlman, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 5/18/26 21:47, Jonas Karlman wrote:
> The dw-hdmi bridge detect() func now updates EDID and CEC phys addr for
> the connector and any registered generic CEC notifier.
>
> Replace the open-coded CEC notifier handling with use of the bridge CEC
> notifier op.
>
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
> ---
> drivers/gpu/drm/meson/Kconfig | 1 +
> drivers/gpu/drm/meson/meson_encoder_hdmi.c | 85 +++++-----------------
> 2 files changed, 19 insertions(+), 67 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/Kconfig b/drivers/gpu/drm/meson/Kconfig
> index 417f79829cf8..0dc5ca21e4fc 100644
> --- a/drivers/gpu/drm/meson/Kconfig
> +++ b/drivers/gpu/drm/meson/Kconfig
> @@ -13,6 +13,7 @@ config DRM_MESON
> select REGMAP_MMIO
> select MESON_CANVAS
> select CEC_CORE if CEC_NOTIFIER
> + select DRM_DISPLAY_HDMI_CEC_NOTIFIER_HELPER if CEC_NOTIFIER
>
> config DRM_MESON_DW_HDMI
> tristate "HDMI Synopsys Controller support for Amlogic Meson Display"
> diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> index 1b9a1d9ed3d3..45104ef35344 100644
> --- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> @@ -16,8 +16,6 @@
> #include <linux/regulator/consumer.h>
> #include <linux/reset.h>
>
> -#include <media/cec-notifier.h>
> -
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_bridge.h>
> #include <drm/drm_bridge_connector.h>
> @@ -41,7 +39,6 @@ struct meson_encoder_hdmi {
> struct drm_connector *connector;
> struct meson_drm *priv;
> unsigned long output_bus_fmt;
> - struct cec_notifier *cec_notifier;
> };
>
> #define bridge_to_meson_encoder_hdmi(x) \
> @@ -57,14 +54,6 @@ static int meson_encoder_hdmi_attach(struct drm_bridge *bridge,
> &encoder_hdmi->bridge, flags);
> }
>
> -static void meson_encoder_hdmi_detach(struct drm_bridge *bridge)
> -{
> - struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge);
> -
> - cec_notifier_conn_unregister(encoder_hdmi->cec_notifier);
> - encoder_hdmi->cec_notifier = NULL;
> -}
> -
> static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi,
> const struct drm_display_mode *mode)
> {
> @@ -321,27 +310,9 @@ static int meson_encoder_hdmi_atomic_check(struct drm_bridge *bridge,
> return 0;
> }
>
> -static void meson_encoder_hdmi_hpd_notify(struct drm_bridge *bridge,
> - struct drm_connector *connector,
> - enum drm_connector_status status)
> -{
> - struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge);
> -
> - if (!encoder_hdmi->cec_notifier)
> - return;
> -
> - if (status == connector_status_connected)
> - cec_notifier_set_phys_addr(encoder_hdmi->cec_notifier,
> - connector->display_info.source_physical_address);
> - else
> - cec_notifier_phys_addr_invalidate(encoder_hdmi->cec_notifier);
> -}
> -
> static const struct drm_bridge_funcs meson_encoder_hdmi_bridge_funcs = {
> .attach = meson_encoder_hdmi_attach,
> - .detach = meson_encoder_hdmi_detach,
> .mode_valid = meson_encoder_hdmi_mode_valid,
> - .hpd_notify = meson_encoder_hdmi_hpd_notify,
> .atomic_enable = meson_encoder_hdmi_atomic_enable,
> .atomic_disable = meson_encoder_hdmi_atomic_disable,
> .atomic_get_input_bus_fmts = meson_encoder_hdmi_get_inp_bus_fmts,
> @@ -374,9 +345,9 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
>
> meson_encoder_hdmi->bridge.next_bridge = of_drm_find_and_get_bridge(remote);
> if (!meson_encoder_hdmi->bridge.next_bridge) {
> - ret = dev_err_probe(priv->dev, -EPROBE_DEFER,
> - "Failed to find HDMI transceiver bridge\n");
> - goto err_put_node;
> + of_node_put(remote);
> + return dev_err_probe(priv->dev, -EPROBE_DEFER,
> + "Failed to find HDMI transceiver bridge\n");
> }
>
> /* HDMI Encoder Bridge */
> @@ -384,6 +355,13 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
> meson_encoder_hdmi->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
> meson_encoder_hdmi->bridge.interlace_allowed = true;
>
> + pdev = of_find_device_by_node(remote);
> + of_node_put(remote);
> + if (pdev) {
> + meson_encoder_hdmi->bridge.ops |= DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER;
> + meson_encoder_hdmi->bridge.hdmi_cec_dev = &pdev->dev;
> + }
> +
> drm_bridge_add(&meson_encoder_hdmi->bridge);
>
> meson_encoder_hdmi->priv = priv;
> @@ -391,30 +369,24 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
> /* Encoder */
> ret = drm_simple_encoder_init(priv->drm, &meson_encoder_hdmi->encoder,
> DRM_MODE_ENCODER_TMDS);
> - if (ret) {
> - dev_err_probe(priv->dev, ret, "Failed to init HDMI encoder\n");
> - goto err_put_node;
> - }
> + if (ret)
> + return dev_err_probe(priv->dev, ret, "Failed to init HDMI encoder\n");
>
> meson_encoder_hdmi->encoder.possible_crtcs = BIT(0);
>
> /* Attach HDMI Encoder Bridge to Encoder */
> ret = drm_bridge_attach(&meson_encoder_hdmi->encoder, &meson_encoder_hdmi->bridge, NULL,
> DRM_BRIDGE_ATTACH_NO_CONNECTOR);
> - if (ret) {
> - dev_err_probe(priv->dev, ret, "Failed to attach bridge\n");
> - goto err_put_node;
> - }
> + if (ret)
> + return dev_err_probe(priv->dev, ret, "Failed to attach bridge\n");
>
> /* Initialize & attach Bridge Connector */
> meson_encoder_hdmi->connector = drm_bridge_connector_init(priv->drm,
> &meson_encoder_hdmi->encoder);
> - if (IS_ERR(meson_encoder_hdmi->connector)) {
> - ret = dev_err_probe(priv->dev,
> - PTR_ERR(meson_encoder_hdmi->connector),
> - "Unable to create HDMI bridge connector\n");
> - goto err_put_node;
> - }
> + if (IS_ERR(meson_encoder_hdmi->connector))
> + return dev_err_probe(priv->dev,
> + PTR_ERR(meson_encoder_hdmi->connector),
> + "Unable to create HDMI bridge connector\n");
>
> /*
> * We should have now in place:
> @@ -437,32 +409,11 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
> /* Handle this here until handled by drm_bridge_connector_init() */
> meson_encoder_hdmi->connector->ycbcr_420_allowed = true;
>
> - pdev = of_find_device_by_node(remote);
> - of_node_put(remote);
> - if (pdev) {
> - struct cec_connector_info conn_info;
> - struct cec_notifier *notifier;
> -
> - cec_fill_conn_info_from_drm(&conn_info, meson_encoder_hdmi->connector);
> -
> - notifier = cec_notifier_conn_register(&pdev->dev, NULL, &conn_info);
> - if (!notifier) {
> - put_device(&pdev->dev);
> - return -ENOMEM;
> - }
> -
> - meson_encoder_hdmi->cec_notifier = notifier;
> - }
> -
> priv->encoders[MESON_ENC_HDMI] = meson_encoder_hdmi;
>
> dev_dbg(priv->dev, "HDMI encoder initialized\n");
>
> return 0;
> -
> -err_put_node:
> - of_node_put(remote);
> - return ret;
> }
>
> void meson_encoder_hdmi_remove(struct meson_drm *priv)
Reviewed-by: Neil Armstrong <neil.armstrong@linaro•org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 07/13] drm/meson: encoder_hdmi: Report ycbcr_420_allowed from encoder
2026-05-18 19:47 ` [PATCH 07/13] drm/meson: encoder_hdmi: Report ycbcr_420_allowed from encoder Jonas Karlman
@ 2026-05-19 7:31 ` Neil Armstrong
0 siblings, 0 replies; 26+ messages in thread
From: Neil Armstrong @ 2026-05-19 7:31 UTC (permalink / raw)
To: Jonas Karlman, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 5/18/26 21:47, Jonas Karlman wrote:
> The bridge connector report ycbcr_420_allowed support when all bridges
> in the chain support ycbcr_420_allowed.
>
> Report ycbcr_420_allowed on the encoder bridge so that the bridge
> connector automatically can report correct ycbcr_420_allowed support.
>
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
> ---
> drivers/gpu/drm/meson/meson_encoder_hdmi.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> index 45104ef35344..484675cb8284 100644
> --- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c
> @@ -354,6 +354,7 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
> meson_encoder_hdmi->bridge.of_node = priv->dev->of_node;
> meson_encoder_hdmi->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
> meson_encoder_hdmi->bridge.interlace_allowed = true;
> + meson_encoder_hdmi->bridge.ycbcr_420_allowed = true;
>
> pdev = of_find_device_by_node(remote);
> of_node_put(remote);
> @@ -406,9 +407,6 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv)
>
> drm_connector_attach_max_bpc_property(meson_encoder_hdmi->connector, 8, 8);
>
> - /* Handle this here until handled by drm_bridge_connector_init() */
> - meson_encoder_hdmi->connector->ycbcr_420_allowed = true;
> -
> priv->encoders[MESON_ENC_HDMI] = meson_encoder_hdmi;
>
> dev_dbg(priv->dev, "HDMI encoder initialized\n");
Reviewed-by: Neil Armstrong <neil.armstrong@linaro•org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 08/13] drm/meson: dw-hdmi: Use local dev variable consistently in bind()
2026-05-18 19:47 ` [PATCH 08/13] drm/meson: dw-hdmi: Use local dev variable consistently in bind() Jonas Karlman
@ 2026-05-19 7:33 ` Neil Armstrong
0 siblings, 0 replies; 26+ messages in thread
From: Neil Armstrong @ 2026-05-19 7:33 UTC (permalink / raw)
To: Jonas Karlman, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 5/18/26 21:47, Jonas Karlman wrote:
> Replace indirect struct device accesses via pdev->dev with the local dev
> parameter already available in meson_dw_hdmi_bind(), for consistency and
> readability.
>
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
> ---
> drivers/gpu/drm/meson/meson_dw_hdmi.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index 30099bf71aad..fcd2426af9fc 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -671,9 +671,9 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
>
> DRM_DEBUG_DRIVER("\n");
>
> - match = of_device_get_match_data(&pdev->dev);
> + match = of_device_get_match_data(dev);
> if (!match) {
> - dev_err(&pdev->dev, "failed to get match data\n");
> + dev_err(dev, "failed to get match data\n");
> return -ENODEV;
> }
>
> @@ -771,7 +771,7 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
> return PTR_ERR(meson_dw_hdmi->hdmi);
> }
>
> - meson_dw_hdmi->bridge = of_drm_find_and_get_bridge(pdev->dev.of_node);
> + meson_dw_hdmi->bridge = of_drm_find_and_get_bridge(dev->of_node);
> if (!meson_dw_hdmi->bridge) {
> devm_free_irq(dev, irq, meson_dw_hdmi);
> dw_hdmi_remove(meson_dw_hdmi->hdmi);
Reviewed-by: Neil Armstrong <neil.armstrong@linaro•org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 09/13] drm/meson: dw-hdmi: Use devm_clk_get_enabled() helper
2026-05-18 19:47 ` [PATCH 09/13] drm/meson: dw-hdmi: Use devm_clk_get_enabled() helper Jonas Karlman
@ 2026-05-19 7:33 ` Neil Armstrong
0 siblings, 0 replies; 26+ messages in thread
From: Neil Armstrong @ 2026-05-19 7:33 UTC (permalink / raw)
To: Jonas Karlman, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 5/18/26 21:47, Jonas Karlman wrote:
> Change to use the devm_clk_get_enabled() helper instead of using an
> open-coded variant.
>
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
> ---
> drivers/gpu/drm/meson/meson_dw_hdmi.c | 48 +++++++++------------------
> 1 file changed, 16 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index fcd2426af9fc..d0cf2042d41c 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -634,29 +634,6 @@ static void meson_dw_hdmi_init(struct meson_dw_hdmi *meson_dw_hdmi)
>
> }
>
> -static void meson_disable_clk(void *data)
> -{
> - clk_disable_unprepare(data);
> -}
> -
> -static int meson_enable_clk(struct device *dev, char *name)
> -{
> - struct clk *clk;
> - int ret;
> -
> - clk = devm_clk_get(dev, name);
> - if (IS_ERR(clk)) {
> - dev_err(dev, "Unable to get %s pclk\n", name);
> - return PTR_ERR(clk);
> - }
> -
> - ret = clk_prepare_enable(clk);
> - if (!ret)
> - ret = devm_add_action_or_reset(dev, meson_disable_clk, clk);
> -
> - return ret;
> -}
> -
> static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
> void *data)
> {
> @@ -666,6 +643,7 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
> struct drm_device *drm = data;
> struct meson_drm *priv = drm->dev_private;
> struct dw_hdmi_plat_data *dw_plat_data;
> + struct clk *clk;
> int irq;
> int ret;
>
> @@ -716,17 +694,23 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
> if (IS_ERR(meson_dw_hdmi->hdmitx))
> return PTR_ERR(meson_dw_hdmi->hdmitx);
>
> - ret = meson_enable_clk(dev, "isfr");
> - if (ret)
> - return ret;
> + clk = devm_clk_get_enabled(dev, "isfr");
> + if (IS_ERR(clk)) {
> + dev_err(dev, "Unable to get isfr pclk\n");
> + return PTR_ERR(clk);
> + }
>
> - ret = meson_enable_clk(dev, "iahb");
> - if (ret)
> - return ret;
> + clk = devm_clk_get_enabled(dev, "iahb");
> + if (IS_ERR(clk)) {
> + dev_err(dev, "Unable to get iahb pclk\n");
> + return PTR_ERR(clk);
> + }
>
> - ret = meson_enable_clk(dev, "venci");
> - if (ret)
> - return ret;
> + clk = devm_clk_get_enabled(dev, "venci");
> + if (IS_ERR(clk)) {
> + dev_err(dev, "Unable to get venci pclk\n");
> + return PTR_ERR(clk);
> + }
>
> dw_plat_data->regm = devm_regmap_init(dev, NULL, meson_dw_hdmi,
> &meson_dw_hdmi_regmap_config);
Reviewed-by: Neil Armstrong <neil.armstrong@linaro•org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 10/13] drm/meson: dw-hdmi: Use dev_err_probe() to report errors
2026-05-18 19:47 ` [PATCH 10/13] drm/meson: dw-hdmi: Use dev_err_probe() to report errors Jonas Karlman
@ 2026-05-19 7:34 ` Neil Armstrong
0 siblings, 0 replies; 26+ messages in thread
From: Neil Armstrong @ 2026-05-19 7:34 UTC (permalink / raw)
To: Jonas Karlman, Kevin Hilman, Heiko Stuebner, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
Jerome Brunet, Martin Blumenstingl
Cc: dri-devel, linux-amlogic, linux-arm-kernel, linux-kernel,
linux-rockchip
On 5/18/26 21:47, Jonas Karlman wrote:
> Change to use dev_err_probe() to report bind() errors consistently.
>
> Signed-off-by: Jonas Karlman <jonas@kwiboo•se>
> ---
> drivers/gpu/drm/meson/meson_dw_hdmi.c | 65 +++++++++++++--------------
> 1 file changed, 30 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index d0cf2042d41c..1dd59196ff7f 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -650,10 +650,9 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
> DRM_DEBUG_DRIVER("\n");
>
> match = of_device_get_match_data(dev);
> - if (!match) {
> - dev_err(dev, "failed to get match data\n");
> - return -ENODEV;
> - }
> + if (!match)
> + return dev_err_probe(dev, -ENODEV,
> + "Failed to get match data\n");
>
> meson_dw_hdmi = devm_kzalloc(dev, sizeof(*meson_dw_hdmi),
> GFP_KERNEL);
> @@ -667,50 +666,45 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
>
> ret = devm_regulator_get_enable_optional(dev, "hdmi");
> if (ret < 0 && ret != -ENODEV)
> - return ret;
> + return dev_err_probe(dev, ret,
> + "Failed to get/enable hdmi regulator\n");
>
> meson_dw_hdmi->hdmitx_apb = devm_reset_control_get_exclusive(dev,
> "hdmitx_apb");
> - if (IS_ERR(meson_dw_hdmi->hdmitx_apb)) {
> - dev_err(dev, "Failed to get hdmitx_apb reset\n");
> - return PTR_ERR(meson_dw_hdmi->hdmitx_apb);
> - }
> + if (IS_ERR(meson_dw_hdmi->hdmitx_apb))
> + return dev_err_probe(dev, PTR_ERR(meson_dw_hdmi->hdmitx_apb),
> + "Failed to get hdmitx_apb reset\n");
>
> meson_dw_hdmi->hdmitx_ctrl = devm_reset_control_get_exclusive(dev,
> "hdmitx");
> - if (IS_ERR(meson_dw_hdmi->hdmitx_ctrl)) {
> - dev_err(dev, "Failed to get hdmitx reset\n");
> - return PTR_ERR(meson_dw_hdmi->hdmitx_ctrl);
> - }
> + if (IS_ERR(meson_dw_hdmi->hdmitx_ctrl))
> + return dev_err_probe(dev, PTR_ERR(meson_dw_hdmi->hdmitx_ctrl),
> + "Failed to get hdmitx reset\n");
>
> meson_dw_hdmi->hdmitx_phy = devm_reset_control_get_exclusive(dev,
> "hdmitx_phy");
> - if (IS_ERR(meson_dw_hdmi->hdmitx_phy)) {
> - dev_err(dev, "Failed to get hdmitx_phy reset\n");
> - return PTR_ERR(meson_dw_hdmi->hdmitx_phy);
> - }
> + if (IS_ERR(meson_dw_hdmi->hdmitx_phy))
> + return dev_err_probe(dev, PTR_ERR(meson_dw_hdmi->hdmitx_phy),
> + "Failed to get hdmitx_phy reset\n");
>
> meson_dw_hdmi->hdmitx = devm_platform_ioremap_resource(pdev, 0);
> if (IS_ERR(meson_dw_hdmi->hdmitx))
> return PTR_ERR(meson_dw_hdmi->hdmitx);
>
> clk = devm_clk_get_enabled(dev, "isfr");
> - if (IS_ERR(clk)) {
> - dev_err(dev, "Unable to get isfr pclk\n");
> - return PTR_ERR(clk);
> - }
> + if (IS_ERR(clk))
> + return dev_err_probe(dev, PTR_ERR(clk),
> + "Failed to get isfr pclk\n");
>
> clk = devm_clk_get_enabled(dev, "iahb");
> - if (IS_ERR(clk)) {
> - dev_err(dev, "Unable to get iahb pclk\n");
> - return PTR_ERR(clk);
> - }
> + if (IS_ERR(clk))
> + return dev_err_probe(dev, PTR_ERR(clk),
> + "Failed to get iahb pclk\n");
>
> clk = devm_clk_get_enabled(dev, "venci");
> - if (IS_ERR(clk)) {
> - dev_err(dev, "Unable to get venci pclk\n");
> - return PTR_ERR(clk);
> - }
> + if (IS_ERR(clk))
> + return dev_err_probe(dev, PTR_ERR(clk),
> + "Failed to get venci pclk\n");
>
> dw_plat_data->regm = devm_regmap_init(dev, NULL, meson_dw_hdmi,
> &meson_dw_hdmi_regmap_config);
> @@ -724,10 +718,9 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
> ret = devm_request_threaded_irq(dev, irq, dw_hdmi_top_irq,
> dw_hdmi_top_thread_irq, IRQF_SHARED,
> "dw_hdmi_top_irq", meson_dw_hdmi);
> - if (ret) {
> - dev_err(dev, "Failed to request hdmi top irq\n");
> - return ret;
> - }
> + if (ret)
> + return dev_err_probe(dev, ret,
> + "Failed to request hdmi top irq\n");
>
> meson_dw_hdmi_init(meson_dw_hdmi);
>
> @@ -752,14 +745,16 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
> meson_dw_hdmi->hdmi = dw_hdmi_probe(pdev, &meson_dw_hdmi->dw_plat_data);
> if (IS_ERR(meson_dw_hdmi->hdmi)) {
> devm_free_irq(dev, irq, meson_dw_hdmi);
> - return PTR_ERR(meson_dw_hdmi->hdmi);
> + return dev_err_probe(dev, PTR_ERR(meson_dw_hdmi->hdmi),
> + "Failed to probe dw-hdmi bridge\n");
> }
>
> meson_dw_hdmi->bridge = of_drm_find_and_get_bridge(dev->of_node);
> if (!meson_dw_hdmi->bridge) {
> devm_free_irq(dev, irq, meson_dw_hdmi);
> dw_hdmi_remove(meson_dw_hdmi->hdmi);
> - return -ENODEV;
> + return dev_err_probe(dev, -ENODEV,
> + "Failed to find dw-hdmi bridge\n");
> }
>
> DRM_DEBUG_DRIVER("HDMI controller initialized\n");
Reviewed-by: Neil Armstrong <neil.armstrong@linaro•org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2026-05-19 7:34 UTC | newest]
Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-18 19:47 [PATCH 00/13] drm/meson: dw-hdmi: Misc cleanup and use CEC notifier helpers Jonas Karlman
2026-05-18 19:47 ` [PATCH 01/13] drm/meson: dw-hdmi: Report connector status based on HPD bit Jonas Karlman
2026-05-19 7:23 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 02/13] drm/meson: dw-hdmi: Protect from possible NULL pointer dereference Jonas Karlman
2026-05-19 7:23 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 03/13] drm/meson: dw-hdmi: Call dw_hdmi_remove() consistently Jonas Karlman
2026-05-19 7:24 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 04/13] drm/meson: dw-hdmi: Drop call to drm_bridge_hpd_notify() Jonas Karlman
2026-05-19 7:25 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 05/13] drm/meson: encoder_hdmi: Use CEC phys addr from display_info Jonas Karlman
2026-05-19 6:36 ` Hans Verkuil
2026-05-19 7:27 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 06/13] drm/meson: encoder_hdmi: Use bridge connector CEC notifier Jonas Karlman
2026-05-19 6:38 ` Hans Verkuil
2026-05-19 7:30 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 07/13] drm/meson: encoder_hdmi: Report ycbcr_420_allowed from encoder Jonas Karlman
2026-05-19 7:31 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 08/13] drm/meson: dw-hdmi: Use local dev variable consistently in bind() Jonas Karlman
2026-05-19 7:33 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 09/13] drm/meson: dw-hdmi: Use devm_clk_get_enabled() helper Jonas Karlman
2026-05-19 7:33 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 10/13] drm/meson: dw-hdmi: Use dev_err_probe() to report errors Jonas Karlman
2026-05-19 7:34 ` Neil Armstrong
2026-05-18 19:47 ` [PATCH 11/13] drm/bridge: dw-hdmi: Export dw_hdmi_schedule_hpd_work() helper Jonas Karlman
2026-05-18 19:47 ` [PATCH 12/13] drm/meson: dw-hdmi: Use " Jonas Karlman
2026-05-18 19:47 ` [PATCH 13/13] drm/meson: dw-hdmi: Use suspend_late/resume_early/resume_noirq pm ops Jonas Karlman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox