From 30b933f50c9c234fc59d83d5253fab24a74e7cbd Mon Sep 17 00:00:00 2001 From: Nilesh Laad Date: Fri, 28 Apr 2023 15:27:44 +0530 Subject: [PATCH] disp: msm: dp: add eDP panel notifier support If panel notifier support is set, get panel phandle and add panel to drm_panel. Notifier for this panel will be called on dpms update. Change-Id: I6346eb09a551a993ec9050797d1ba9383491e612 Signed-off-by: Nilesh Laad --- msm/dp/dp_display.c | 2 ++ msm/dp/dp_panel.c | 27 +++++++++++++++++++++++++++ msm/dp/dp_panel.h | 4 ++++ msm/dp/dp_parser.c | 4 ++++ msm/dp/dp_parser.h | 1 + 5 files changed, 38 insertions(+) diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c index afa73fa3e013..89301247b79d 100644 --- a/msm/dp/dp_display.c +++ b/msm/dp/dp_display.c @@ -2095,6 +2095,8 @@ static int dp_init_sub_modules(struct dp_display_private *dp) panel_in.connector = dp->dp_display.base_connector; panel_in.base_panel = NULL; panel_in.parser = dp->parser; + panel_in.is_edp = dp->dp_display.is_edp; + panel_in.panel_notifier_support = dp->parser->panel_notifier_support; dp->panel = dp_panel_get(&panel_in); if (IS_ERR(dp->panel)) { diff --git a/msm/dp/dp_panel.c b/msm/dp/dp_panel.c index 5369ab30bdb4..6c24c52b0004 100644 --- a/msm/dp/dp_panel.c +++ b/msm/dp/dp_panel.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. */ @@ -3015,6 +3016,8 @@ struct dp_panel *dp_panel_get(struct dp_panel_in *in) struct dp_panel_private *panel; struct dp_panel *dp_panel; struct sde_connector *sde_conn; + struct device *dev; + struct device_node *of_node = NULL; if (!in->dev || !in->catalog || !in->aux || !in->link || !in->connector) { @@ -3029,6 +3032,13 @@ struct dp_panel *dp_panel_get(struct dp_panel_in *in) goto error; } + dev = devm_kzalloc(in->dev, sizeof(*dev), GFP_KERNEL); + if (!dev) { + DP_ERR("failed to allocate dev\n"); + rc = -ENOMEM; + goto error; + } + panel->dev = in->dev; panel->aux = in->aux; panel->catalog = in->catalog; @@ -3088,6 +3098,23 @@ struct dp_panel *dp_panel_get(struct dp_panel_in *in) dp_panel_edid_register(panel); + if (in->is_edp && in->panel_notifier_support) { + of_node = of_parse_phandle(in->dev->of_node, "qcom,edp-default-panel", 0); + if (!of_node) { + DP_ERR("phandle for default panel not found\n"); + } else { + drm_panel_init(&dp_panel->drm_panel); + dp_panel->drm_panel.dev = dev; + dev->of_node = of_node; + + rc = drm_panel_add(&dp_panel->drm_panel); + if (rc) + DP_ERR("Failed to add drm_panel\n"); + + dp_panel->connector->panel = &dp_panel->drm_panel; + } + } + return dp_panel; error: return ERR_PTR(rc); diff --git a/msm/dp/dp_panel.h b/msm/dp/dp_panel.h index f388f2d94063..822393143ab8 100644 --- a/msm/dp/dp_panel.h +++ b/msm/dp/dp_panel.h @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. */ @@ -74,6 +75,8 @@ struct dp_panel_in { struct drm_connector *connector; struct dp_panel *base_panel; struct dp_parser *parser; + bool is_edp; + bool panel_notifier_support; }; struct dp_dsc_caps { @@ -95,6 +98,7 @@ struct dp_panel { u8 fec_dpcd; u8 fec_sts_dpcd[DP_RECEIVER_FEC_STATUS_SIZE + 1]; + struct drm_panel drm_panel; struct drm_dp_link link_info; struct sde_edid_ctrl *edid_ctrl; struct dp_panel_info pinfo; diff --git a/msm/dp/dp_parser.c b/msm/dp/dp_parser.c index 1a18d69ed070..7f5501a136bf 100644 --- a/msm/dp/dp_parser.c +++ b/msm/dp/dp_parser.c @@ -177,6 +177,10 @@ static int dp_parser_misc(struct dp_parser *parser) if (!parser->display_type) parser->display_type = "unknown"; + parser->panel_notifier_support = of_property_read_bool(of_node, + "qcom,panel-notifier-support"); + DP_DEBUG("panel-notifier-support = %d\n", parser->panel_notifier_support); + return 0; } diff --git a/msm/dp/dp_parser.h b/msm/dp/dp_parser.h index 4404930d255a..5c6c0bf0410b 100644 --- a/msm/dp/dp_parser.h +++ b/msm/dp/dp_parser.h @@ -264,6 +264,7 @@ struct dp_parser { bool has_widebus; bool gpio_aux_switch; bool lphw_hpd; + bool panel_notifier_support; u32 mst_fixed_port[MAX_DP_MST_STREAMS]; u32 pixel_base_off[MAX_DP_MST_STREAMS]; const char *mst_fixed_display_type[MAX_DP_MST_STREAMS];