[PATCH RFC 8/9] drm/panel: add atomic_print_state callback
From: Dmitry Baryshkov
Date: Thu Oct 08 2026 - 09:19:13 EST
Panel drivers subclassing drm_panel_state have no way to get their part
of the state into the atomic state dumps, as the state is printed
through the bridge embedded in the panel.
Add an optional atomic_print_state callback, called from the
atomic_print_state callback of the embedded bridge.
Assisted-by: LLM
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxxxxxxxx>
---
drivers/gpu/drm/drm_panel.c | 14 +++++++++++++-
include/drm/drm_panel.h | 11 +++++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
index a2cd043fe146..9be36c5b1037 100644
--- a/drivers/gpu/drm/drm_panel.c
+++ b/drivers/gpu/drm/drm_panel.c
@@ -483,6 +483,17 @@ static void panel_bridge_atomic_destroy_state(struct drm_bridge *bridge,
drm_bridge_state_to_panel_state(bridge_state));
}
+static void panel_bridge_atomic_print_state(struct drm_printer *p,
+ const struct drm_bridge_state *bridge_state)
+{
+ struct drm_bridge *bridge = drm_priv_to_bridge(bridge_state->base.obj);
+ struct drm_panel *panel = drm_bridge_to_panel(bridge);
+
+ if (panel->funcs->atomic_print_state)
+ panel->funcs->atomic_print_state(p,
+ drm_bridge_state_to_panel_state(bridge_state));
+}
+
static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
.attach = panel_bridge_attach,
.detach = panel_bridge_detach,
@@ -495,6 +506,7 @@ static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
.atomic_create_state = panel_bridge_atomic_create_state,
.atomic_duplicate_state = panel_bridge_atomic_duplicate_state,
.atomic_destroy_state = panel_bridge_atomic_destroy_state,
+ .atomic_print_state = panel_bridge_atomic_print_state,
.atomic_get_input_bus_fmts = drm_atomic_helper_bridge_propagate_bus_fmt,
.debugfs_init = panel_bridge_debugfs_init,
};
@@ -853,7 +865,7 @@ static void drm_panel_init(struct drm_panel *panel, struct device *dev,
!funcs->atomic_create_state &&
(funcs->atomic_check || funcs->atomic_prepare ||
funcs->atomic_enable || funcs->atomic_disable ||
- funcs->atomic_unprepare),
+ funcs->atomic_unprepare || funcs->atomic_print_state),
"Atomic callbacks require the panel state callbacks\n");
INIT_LIST_HEAD(&panel->list);
diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
index dedd792d2c52..20e5b1e5f50d 100644
--- a/include/drm/drm_panel.h
+++ b/include/drm/drm_panel.h
@@ -43,6 +43,7 @@ struct drm_crtc_state;
struct drm_device;
struct drm_panel_follower;
struct drm_panel;
+struct drm_printer;
struct display_timing;
enum drm_panel_orientation;
@@ -301,6 +302,16 @@ struct drm_panel_funcs {
*/
void (*atomic_destroy_state)(struct drm_panel *panel,
struct drm_panel_state *state);
+
+ /**
+ * @atomic_print_state:
+ *
+ * If driver subclasses &struct drm_panel_state, it should implement
+ * this optional hook for printing additional driver specific state.
+ * It can only be implemented together with @atomic_create_state.
+ */
+ void (*atomic_print_state)(struct drm_printer *p,
+ const struct drm_panel_state *state);
};
struct drm_panel_follower_funcs {
--
2.47.3