summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorAbhinav Kumar <abhinavk@codeaurora.org>2017-02-13 14:23:10 -0800
committerAbhinav Kumar <abhinavk@codeaurora.org>2017-02-22 02:06:47 -0800
commit08c7eadeecca5207917be30d6abbb43e0eff6587 (patch)
treea442fb46c7beec32b3d2c722ae3172508ead3881 /drivers/gpu/drm
parent776bf6f2f02f11ee5c411af06b681d142345fc70 (diff)
drm/msm: enable hpd event support for hdmi display
When HPD is enabled in DTSI for HDMI display, driver needs to poll the HPD status change and report event back to user space. Change-Id: I6dd2f3078875698ff8cfd7bdb7cfd662e85eec9b Signed-off-by: Abhinav Kumar <abhinavk@codeaurora.org>
Diffstat (limited to 'drivers/gpu/drm')
-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 ebf618635cfb..cb0dd623aeba 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;