drm/msm/dp: add display-type support in dp
Add display-type in connector's capability blob for DP-SST.
This allows user to configure DP as primary display.
Change-Id: Ib5f6d9d72e8c42f88d38e06ed504848b8fc52029
Signed-off-by: Xiaowen Wu <wxiaowen@codeaurora.org>
Signed-off-by: Narender Ankam <nankam@codeaurora.org>
Signed-off-by: Chirag Khurana <ckhurana@codeaurora.org>
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index 3743119..4f109ce 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -1435,6 +1435,28 @@
return rc;
}
+static int dp_display_get_display_type(struct dp_display *dp_display,
+ const char **display_type)
+{
+ struct dp_display_private *dp;
+
+ if (!dp_display || !display_type) {
+ pr_err("invalid input\n");
+ return -EINVAL;
+ }
+
+ dp = container_of(dp_display, struct dp_display_private, dp_display);
+
+ *display_type = dp->parser->display_type;
+
+ if (!strcmp(*display_type, "primary"))
+ dp_display->is_primary = true;
+ else
+ dp_display->is_primary = false;
+
+ return 0;
+}
+
static int dp_display_create_workqueue(struct dp_display_private *dp)
{
dp->wq = create_singlethread_workqueue("drm_dp");
@@ -1499,6 +1521,7 @@
g_dp_display->post_open = dp_display_post_open;
g_dp_display->post_init = dp_display_post_init;
g_dp_display->config_hdr = dp_display_config_hdr;
+ g_dp_display->get_display_type = dp_display_get_display_type;
rc = component_add(&pdev->dev, &dp_display_comp_ops);
if (rc) {
diff --git a/drivers/gpu/drm/msm/dp/dp_display.h b/drivers/gpu/drm/msm/dp/dp_display.h
index 98f2afa..b4fe33f 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.h
+++ b/drivers/gpu/drm/msm/dp/dp_display.h
@@ -25,6 +25,7 @@
struct dp_bridge *bridge;
struct drm_connector *connector;
bool is_connected;
+ bool is_primary;
u32 max_pclk_khz;
bool yuv_support;
@@ -50,6 +51,8 @@
int (*config_hdr)(struct dp_display *dp_display,
struct drm_msm_ext_hdr_metadata *hdr_meta);
void (*post_init)(struct dp_display *dp_display);
+ int (*get_display_type)(struct dp_display *dp_display,
+ const char **display_type);
};
int dp_display_get_num_of_displays(void);
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c
index 51501ee..80aca25 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.c
+++ b/drivers/gpu/drm/msm/dp/dp_drm.c
@@ -439,6 +439,7 @@
info->num_of_h_tiles = 1;
info->h_tile_instance[0] = 0;
info->is_connected = display->is_connected;
+ info->is_primary = display->is_primary;
info->capabilities = MSM_DISPLAY_CAP_VID_MODE | MSM_DISPLAY_CAP_EDID |
MSM_DISPLAY_CAP_HOT_PLUG;
@@ -597,6 +598,19 @@
return rc;
}
+int dp_connnector_set_info_blob(struct drm_connector *connector,
+ void *info, void *display, struct msm_mode_info *mode_info)
+{
+ struct dp_display *dp_display = display;
+ const char *display_type = NULL;
+
+ dp_display->get_display_type(dp_display, &display_type);
+ sde_kms_info_add_keystr(info,
+ "display type", display_type);
+
+ return 0;
+}
+
int dp_drm_bridge_init(void *data, struct drm_encoder *encoder)
{
int rc = 0;
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.h b/drivers/gpu/drm/msm/dp/dp_drm.h
index 3ca10c2..4181472 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.h
+++ b/drivers/gpu/drm/msm/dp/dp_drm.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -99,6 +99,17 @@
*/
void dp_connector_post_open(void *display);
+/**
+ * dp_conn_set_info_blob - callback to perform info blob initialization
+ * @connector: Pointer to drm connector structure
+ * @info: Pointer to sde connector info structure
+ * @display: Pointer to private display handle
+ * @mode_info: Pointer to mode info structure
+ * Returns: Zero on success
+ */
+int dp_connnector_set_info_blob(struct drm_connector *connector,
+ void *info, void *display, struct msm_mode_info *mode_info);
+
int dp_drm_bridge_init(void *display,
struct drm_encoder *encoder);
diff --git a/drivers/gpu/drm/msm/dp/dp_parser.c b/drivers/gpu/drm/msm/dp/dp_parser.c
index 010930e..09fa4fd 100644
--- a/drivers/gpu/drm/msm/dp/dp_parser.c
+++ b/drivers/gpu/drm/msm/dp/dp_parser.c
@@ -160,6 +160,11 @@
parser->yuv_support = of_property_read_bool(of_node,
"qcom,yuv-support");
+ parser->display_type = of_get_property(of_node,
+ "qcom,display-type", NULL);
+ if (!parser->display_type)
+ parser->display_type = "unknown";
+
return 0;
}
diff --git a/drivers/gpu/drm/msm/dp/dp_parser.h b/drivers/gpu/drm/msm/dp/dp_parser.h
index c1267c4..a32a8ec 100644
--- a/drivers/gpu/drm/msm/dp/dp_parser.h
+++ b/drivers/gpu/drm/msm/dp/dp_parser.h
@@ -161,6 +161,7 @@
* @pinctrl: pin-control related data
* @ctrl_resouce: controller's register address realated data
* @disp_data: controller's display related data
+ * @display_type: display type as defined in device tree.
* @parse: function to be called by client to parse device tree.
* @get_io: function to be called by client to get io data.
* @get_io_buf: function to be called by client to get io buffers.
@@ -179,6 +180,8 @@
u32 max_pclk_khz;
bool yuv_support;
+ const char *display_type;
+
int (*parse)(struct dp_parser *parser);
struct dp_io_data *(*get_io)(struct dp_parser *parser, char *name);
void (*get_io_buf)(struct dp_parser *parser, char *name);
diff --git a/drivers/gpu/drm/msm/sde/sde_kms.c b/drivers/gpu/drm/msm/sde/sde_kms.c
index 1b59ac7..977e3a5 100644
--- a/drivers/gpu/drm/msm/sde/sde_kms.c
+++ b/drivers/gpu/drm/msm/sde/sde_kms.c
@@ -1306,6 +1306,7 @@
.get_panel_vfp = NULL,
};
static const struct sde_connector_ops dp_ops = {
+ .set_info_blob = dp_connnector_set_info_blob,
.post_init = dp_connector_post_init,
.detect = dp_connector_detect,
.get_modes = dp_connector_get_modes,