summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Salido <salidoa@google.com>2023-06-05 22:41:15 -0700
committerKen Huang <kenbshuang@google.com>2024-01-03 20:35:13 +0800
commit2113d61f92b57fcf23f16549dc7e6f034e625c70 (patch)
tree3ea3a7a077e2fb8623344c2a1a7ecd0d7c7033b2
parentd35e2143f2aca18d53c21030366b3d205910d79f (diff)
downloaddisplay-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.c12
-rw-r--r--samsung/exynos_drm_connector.h1
-rw-r--r--samsung/panel/panel-samsung-drv.c51
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;
}