diff options
author | Adrian Salido <salidoa@google.com> | 2023-06-05 22:41:15 -0700 |
---|---|---|
committer | Ken Huang <kenbshuang@google.com> | 2024-01-03 20:35:13 +0800 |
commit | 2113d61f92b57fcf23f16549dc7e6f034e625c70 (patch) | |
tree | 3ea3a7a077e2fb8623344c2a1a7ecd0d7c7033b2 | |
parent | d35e2143f2aca18d53c21030366b3d205910d79f (diff) | |
download | display-2113d61f92b57fcf23f16549dc7e6f034e625c70.tar.gz |
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 <kenbshuang@google.com>
Signed-off-by: Adrian Salido <salidoa@google.com>
(cherry picked from commit fc0f21b0b6dcf25b6f7e99c4af826216df3f4367)
-rw-r--r-- | samsung/exynos_drm_connector.c | 12 | ||||
-rw-r--r-- | samsung/exynos_drm_connector.h | 1 | ||||
-rw-r--r-- | 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; } |