diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-02-23 21:35:36 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-02-23 21:35:36 -0800 |
| commit | 64190381d8b2cf03d555b6c004f930600bad6e01 (patch) | |
| tree | a839a755d8c5c7375e97bf89ff51c9e6ded4a235 /drivers/gpu | |
| parent | 6687ca759cfcbb769cb8238e912b051d51a028aa (diff) | |
| parent | 08c7eadeecca5207917be30d6abbb43e0eff6587 (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.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/sde/sde_kms.c | 10 |
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; |
