From 372aa23ceea45131298b92ca182935a1b85a7d9e Mon Sep 17 00:00:00 2001 From: Nilesh Laad Date: Fri, 24 Mar 2023 17:04:41 +0530 Subject: [PATCH] disp: msm: dp: add eDP support as a primary display Add support for new eDP interface. As the protocol is similar to DP, the new eDP driver shall re-use the DP functionality wherever applicable. Change-Id: I0bcaa2bf2c401cbfb3470ecf232bf6643fb43a7d Signed-off-by: Sankeerth Billakanti Signed-off-by: Nilesh Laad --- msm/dp/dp_display.c | 27 ++++++++++++++++++++++++++- msm/dp/dp_display.h | 1 + msm/dp/dp_drm.c | 11 +++++++++-- msm/sde/sde_encoder.c | 5 ++++- msm/sde/sde_kms.c | 2 +- 5 files changed, 41 insertions(+), 5 deletions(-) diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c index ee48229f19df..844c2174ff95 100644 --- a/msm/dp/dp_display.c +++ b/msm/dp/dp_display.c @@ -68,6 +68,10 @@ enum dp_display_states { DP_STATE_TUI_ACTIVE = BIT(11), }; +struct dp_display_type_info { + int display_type; +}; + static char *dp_display_state_name(enum dp_display_states state) { static char buf[SZ_1K]; @@ -203,8 +207,19 @@ struct dp_display_private { struct notifier_block usb_nb; }; +static const struct dp_display_type_info dp_info = { + .display_type = DRM_MODE_CONNECTOR_DisplayPort, +}; + +static const struct dp_display_type_info edp_info = { + .display_type = DRM_MODE_CONNECTOR_eDP, +}; + static const struct of_device_id dp_dt_match[] = { - {.compatible = "qcom,dp-display"}, + { .compatible = "qcom,dp-display", + .data = &dp_info,}, + { .compatible = "qcom,edp-display", + .data = &edp_info,}, {} }; @@ -3596,6 +3611,8 @@ static int dp_display_probe(struct platform_device *pdev) { int rc = 0; struct dp_display_private *dp; + const struct of_device_id *id; + const struct dp_display_type_info *info; if (!pdev || !pdev->dev.of_node) { DP_ERR("pdev not found\n"); @@ -3603,6 +3620,12 @@ static int dp_display_probe(struct platform_device *pdev) goto bail; } + id = of_match_node(dp_dt_match, pdev->dev.of_node); + if (!id) + return -ENODEV; + + info = id->data; + dp = devm_kzalloc(&pdev->dev, sizeof(*dp), GFP_KERNEL); if (!dp) { rc = -ENOMEM; @@ -3673,6 +3696,8 @@ static int dp_display_probe(struct platform_device *pdev) g_dp_display->mst_get_fixed_topology_display_type = dp_display_mst_get_fixed_topology_display_type; + g_dp_display->is_edp = (info->display_type == DRM_MODE_CONNECTOR_eDP) ? true : false; + rc = component_add(&pdev->dev, &dp_display_comp_ops); if (rc) { DP_ERR("component add failed, rc=%d\n", rc); diff --git a/msm/dp/dp_display.h b/msm/dp/dp_display.h index de5daae9521b..ae2285becc60 100644 --- a/msm/dp/dp_display.h +++ b/msm/dp/dp_display.h @@ -71,6 +71,7 @@ struct dp_display { void *base_dp_panel; bool is_sst_connected; bool is_mst_supported; + bool is_edp; bool dsc_cont_pps; u32 max_pclk_khz; void *dp_mst_prv_info; diff --git a/msm/dp/dp_drm.c b/msm/dp/dp_drm.c index 60e9cc418ca2..95d2a834ebe7 100644 --- a/msm/dp/dp_drm.c +++ b/msm/dp/dp_drm.c @@ -457,8 +457,15 @@ int dp_connector_get_info(struct drm_connector *connector, info->num_of_h_tiles = 1; info->h_tile_instance[0] = 0; info->is_connected = display->is_sst_connected; - info->capabilities = MSM_DISPLAY_CAP_VID_MODE | MSM_DISPLAY_CAP_EDID | - MSM_DISPLAY_CAP_HOT_PLUG; + info->curr_panel_mode = MSM_DISPLAY_VIDEO_MODE; + info->capabilities = MSM_DISPLAY_CAP_VID_MODE | MSM_DISPLAY_CAP_EDID; + + if (display && display->is_edp) { + info->intf_type = DRM_MODE_CONNECTOR_eDP; + info->display_type = SDE_CONNECTOR_PRIMARY; + } else { + info->capabilities |= MSM_DISPLAY_CAP_HOT_PLUG; + } return 0; } diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 3eeb518c1a63..d2c54c99ab14 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark @@ -4858,6 +4858,9 @@ static int sde_encoder_setup_display(struct sde_encoder_virt *sde_enc, if (disp_info->intf_type == DRM_MODE_CONNECTOR_DSI) { *drm_enc_mode = DRM_MODE_ENCODER_DSI; intf_type = INTF_DSI; + } else if (disp_info->intf_type == DRM_MODE_CONNECTOR_eDP) { + *drm_enc_mode = DRM_MODE_ENCODER_TMDS; + intf_type = INTF_DP; } else if (disp_info->intf_type == DRM_MODE_CONNECTOR_HDMIA) { *drm_enc_mode = DRM_MODE_ENCODER_TMDS; intf_type = INTF_HDMI; diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 95ee152f691f..4eea06bff77e 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -1957,7 +1957,7 @@ static int _sde_kms_setup_displays(struct drm_device *dev, display, &dp_ops, DRM_CONNECTOR_POLL_HPD, - DRM_MODE_CONNECTOR_DisplayPort); + info.intf_type); if (connector) { priv->encoders[priv->num_encoders++] = encoder; priv->connectors[priv->num_connectors++] = connector;