summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-02-23 21:35:36 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-02-23 21:35:36 -0800
commit64190381d8b2cf03d555b6c004f930600bad6e01 (patch)
treea839a755d8c5c7375e97bf89ff51c9e6ded4a235 /drivers/gpu
parent6687ca759cfcbb769cb8238e912b051d51a028aa (diff)
parent08c7eadeecca5207917be30d6abbb43e0eff6587 (diff)
Merge "drm/msm: enable hpd event support for hdmi display"
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.c13
-rw-r--r--drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h2
-rw-r--r--drivers/gpu/drm/msm/sde/sde_kms.c10
3 files changed, 18 insertions, 7 deletions
diff --git a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.c b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.c
index 6b5f3d2f5db6..fb893b653c6a 100644
--- a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.c
+++ b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.c
@@ -400,7 +400,7 @@ static void _sde_hdmi_connector_irq(struct sde_hdmi *sde_hdmi)
if ((hpd_int_ctrl & HDMI_HPD_INT_CTRL_INT_EN) &&
(hpd_int_status & HDMI_HPD_INT_STATUS_INT)) {
- bool detected = !!(hpd_int_status &
+ sde_hdmi->connected = !!(hpd_int_status &
HDMI_HPD_INT_STATUS_CABLE_DETECTED);
/* ack & disable (temporarily) HPD events: */
@@ -412,7 +412,7 @@ static void _sde_hdmi_connector_irq(struct sde_hdmi *sde_hdmi)
/* detect disconnect if we are connected or visa versa: */
hpd_int_ctrl = HDMI_HPD_INT_CTRL_INT_EN;
- if (!detected)
+ if (!sde_hdmi->connected)
hpd_int_ctrl |= HDMI_HPD_INT_CTRL_INT_CONNECT;
hdmi_write(hdmi, REG_HDMI_HPD_INT_CTRL, hpd_int_ctrl);
@@ -451,6 +451,7 @@ int sde_hdmi_get_info(struct msm_display_info *info,
{
int rc = 0;
struct sde_hdmi *hdmi_display = (struct sde_hdmi *)display;
+ struct hdmi *hdmi = hdmi_display->ctrl.ctrl;
if (!display || !info) {
SDE_ERROR("display=%p or info=%p is NULL\n", display, info);
@@ -463,11 +464,15 @@ int sde_hdmi_get_info(struct msm_display_info *info,
info->num_of_h_tiles = 1;
info->h_tile_instance[0] = 0;
info->is_connected = true;
- if (hdmi_display->non_pluggable)
+ if (hdmi_display->non_pluggable) {
info->capabilities = MSM_DISPLAY_CAP_VID_MODE;
- else
+ hdmi_display->connected = true;
+ hdmi->hdmi_mode = true;
+ } else {
info->capabilities = MSM_DISPLAY_CAP_HOT_PLUG |
MSM_DISPLAY_CAP_EDID | MSM_DISPLAY_CAP_VID_MODE;
+ }
+ info->is_connected = hdmi_display->connected;
info->max_width = 1920;
info->max_height = 1080;
info->compression = MSM_DISPLAY_COMPRESS_NONE;
diff --git a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h
index cf6f5de892fe..ce3937feee9b 100644
--- a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h
+++ b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h
@@ -71,6 +71,7 @@ struct sde_hdmi_ctrl {
* @non_pluggable: If HDMI display is non pluggable
* @num_of_modes: Number of modes supported by display if non pluggable.
* @mode_list: Mode list if non pluggable.
+ * @connected: If HDMI display is connected.
* @is_tpg_enabled: TPG state.
* @hpd_work: HPD work structure.
* @root: Debug fs root entry.
@@ -89,6 +90,7 @@ struct sde_hdmi {
bool non_pluggable;
u32 num_of_modes;
struct list_head mode_list;
+ bool connected;
bool is_tpg_enabled;
struct work_struct hpd_work;
diff --git a/drivers/gpu/drm/msm/sde/sde_kms.c b/drivers/gpu/drm/msm/sde/sde_kms.c
index 7c23421fb8a7..581918da183f 100644
--- a/drivers/gpu/drm/msm/sde/sde_kms.c
+++ b/drivers/gpu/drm/msm/sde/sde_kms.c
@@ -599,11 +599,12 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
.mode_valid = sde_hdmi_mode_valid,
.get_info = sde_hdmi_get_info,
};
- struct msm_display_info info;
+ struct msm_display_info info = {0};
struct drm_encoder *encoder;
void *display, *connector;
int i, max_encoders;
int rc = 0;
+ int connector_poll;
if (!dev || !priv || !sde_kms) {
SDE_ERROR("invalid argument(s)\n");
@@ -720,7 +721,10 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
SDE_ERROR("hdmi get_info %d failed\n", i);
continue;
}
-
+ if (info.capabilities & MSM_DISPLAY_CAP_HOT_PLUG)
+ connector_poll = DRM_CONNECTOR_POLL_HPD;
+ else
+ connector_poll = 0;
encoder = sde_encoder_init(dev, &info);
if (IS_ERR_OR_NULL(encoder)) {
SDE_ERROR("encoder init failed for hdmi %d\n", i);
@@ -739,7 +743,7 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
0,
display,
&hdmi_ops,
- DRM_CONNECTOR_POLL_HPD,
+ connector_poll,
DRM_MODE_CONNECTOR_HDMIA);
if (connector) {
priv->encoders[priv->num_encoders++] = encoder;