From 2113d61f92b57fcf23f16549dc7e6f034e625c70 Mon Sep 17 00:00:00 2001 From: Adrian Salido Date: Mon, 5 Jun 2023 22:41:15 -0700 Subject: panel: remove call to drm_connector_register With fixes in dsim, bridge attach should now always be called ahead of drm_dev_register. So we can safely delay drm_connector_register until then. This requires sysfs/debugfs registration to happen during late register stage. Bug: 281959066 Test: check debugfs and sysfs Change-Id: I94feae14da735f4a9f91d4db38010be631f7b487 Signed-off-by: Ken Huang Signed-off-by: Adrian Salido (cherry picked from commit fc0f21b0b6dcf25b6f7e99c4af826216df3f4367) --- samsung/exynos_drm_connector.c | 12 +++++++++ samsung/exynos_drm_connector.h | 1 + samsung/panel/panel-samsung-drv.c | 51 ++++++++++++++++++++++++--------------- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/samsung/exynos_drm_connector.c b/samsung/exynos_drm_connector.c index b153043..00a1a1b 100644 --- a/samsung/exynos_drm_connector.c +++ b/samsung/exynos_drm_connector.c @@ -130,6 +130,17 @@ static void exynos_drm_connector_print_state(struct drm_printer *p, funcs->atomic_print_state(p, exynos_connector_state); } +static int exynos_drm_connector_late_register(struct drm_connector *connector) +{ + struct exynos_drm_connector *exynos_connector = to_exynos_connector(connector); + const struct exynos_drm_connector_funcs *funcs = exynos_connector->funcs; + + if (funcs && funcs->late_register) + return funcs->late_register(exynos_connector); + + return -EINVAL; +} + static const struct drm_connector_funcs exynos_drm_connector_funcs = { .fill_modes = drm_helper_probe_single_connector_modes, .reset = exynos_drm_connector_reset, @@ -138,6 +149,7 @@ static const struct drm_connector_funcs exynos_drm_connector_funcs = { .atomic_get_property = exynos_drm_connector_get_property, .atomic_set_property = exynos_drm_connector_set_property, .atomic_print_state = exynos_drm_connector_print_state, + .late_register = exynos_drm_connector_late_register, }; bool is_exynos_drm_connector(const struct drm_connector *connector) diff --git a/samsung/exynos_drm_connector.h b/samsung/exynos_drm_connector.h index 35ed9a2..722a153 100644 --- a/samsung/exynos_drm_connector.h +++ b/samsung/exynos_drm_connector.h @@ -202,6 +202,7 @@ struct exynos_drm_connector_funcs { const struct exynos_drm_connector_state *exynos_state, struct drm_property *property, uint64_t *val); + int (*late_register)(struct exynos_drm_connector *exynos_connector); }; struct exynos_drm_connector_helper_funcs { diff --git a/samsung/panel/panel-samsung-drv.c b/samsung/panel/panel-samsung-drv.c index 70f1582..ac289f4 100644 --- a/samsung/panel/panel-samsung-drv.c +++ b/samsung/panel/panel-samsung-drv.c @@ -60,6 +60,7 @@ static void panel_update_local_hbm_locked(struct exynos_panel *ctx, bool enable) static void exynos_panel_check_mipi_sync_timing(struct drm_crtc *crtc, const struct exynos_panel_mode *current_mode, struct exynos_panel *ctx); +static void exynos_panel_node_attach(struct exynos_drm_connector *exynos_connector); static inline bool is_backlight_off_state(const struct backlight_device *bl) { @@ -1746,10 +1747,17 @@ static int exynos_panel_connector_set_property( return 0; } +static int exynos_panel_connector_late_register(struct exynos_drm_connector *exynos_connector) +{ + exynos_panel_node_attach(exynos_connector); + return 0; +} + static const struct exynos_drm_connector_funcs exynos_panel_connector_funcs = { .atomic_print_state = exynos_panel_connector_print_state, .atomic_get_property = exynos_panel_connector_get_property, .atomic_set_property = exynos_panel_connector_set_property, + .late_register = exynos_panel_connector_late_register, }; static void exynos_panel_set_dimming(struct exynos_panel *ctx, bool dimming_on) @@ -3184,13 +3192,36 @@ static const char *exynos_panel_get_sysfs_name(struct exynos_panel *ctx) return "primary-panel"; } +static void exynos_panel_node_attach(struct exynos_drm_connector *exynos_connector) +{ + struct exynos_panel *ctx = exynos_connector_to_panel(exynos_connector); + struct drm_connector *connector = &exynos_connector->base; + const char *sysfs_name = exynos_panel_get_sysfs_name(ctx); + struct drm_bridge *bridge = &ctx->bridge; + int ret; + + ret = sysfs_create_link(&connector->kdev->kobj, &ctx->dev->kobj, + "panel"); + if (ret) + dev_warn(ctx->dev, "unable to link panel sysfs (%d)\n", ret); + + exynos_debugfs_panel_add(ctx, connector->debugfs_entry); + exynos_dsi_debugfs_add(to_mipi_dsi_device(ctx->dev), ctx->debugfs_entry); + panel_debugfs_add(ctx, ctx->debugfs_entry); + + ret = sysfs_create_link(&bridge->dev->dev->kobj, &ctx->dev->kobj, sysfs_name); + if (ret) + dev_warn(ctx->dev, "unable to link %s sysfs (%d)\n", sysfs_name, ret); + else + dev_dbg(ctx->dev, "succeed to link %s sysfs\n", sysfs_name); +} + static int exynos_panel_bridge_attach(struct drm_bridge *bridge, enum drm_bridge_attach_flags flags) { struct drm_device *dev = bridge->dev; struct exynos_panel *ctx = bridge_to_exynos_panel(bridge); struct drm_connector *connector = &ctx->exynos_connector.base; - const char *sysfs_name = exynos_panel_get_sysfs_name(ctx); int ret; ret = exynos_drm_connector_init(dev, &ctx->exynos_connector, @@ -3210,32 +3241,14 @@ static int exynos_panel_bridge_attach(struct drm_bridge *bridge, drm_connector_helper_add(connector, &exynos_connector_helper_funcs); - drm_connector_register(connector); - drm_connector_attach_encoder(connector, bridge->encoder); connector->funcs->reset(connector); connector->status = connector_status_connected; if (ctx->desc->exynos_panel_func && ctx->desc->exynos_panel_func->commit_done) ctx->exynos_connector.needs_commit = true; - ret = sysfs_create_link(&connector->kdev->kobj, &ctx->dev->kobj, - "panel"); - if (ret) - dev_warn(ctx->dev, "unable to link panel sysfs (%d)\n", ret); - - exynos_debugfs_panel_add(ctx, connector->debugfs_entry); - exynos_dsi_debugfs_add(to_mipi_dsi_device(ctx->dev), ctx->debugfs_entry); - panel_debugfs_add(ctx, ctx->debugfs_entry); - drm_kms_helper_hotplug_event(connector->dev); - - ret = sysfs_create_link(&bridge->dev->dev->kobj, &ctx->dev->kobj, sysfs_name); - if (ret) - dev_warn(ctx->dev, "unable to link %s sysfs (%d)\n", sysfs_name, ret); - else - dev_dbg(ctx->dev, "succeed to link %s sysfs\n", sysfs_name); - return 0; } -- cgit v1.2.3