[PORT FROM R2] GFX-Display: Fix issu of HDMI cannot turn on after end call.
authorShreyas Neerebailoor <shreyasx.neerebailoor@intel.com>
Fri, 9 Mar 2012 13:19:26 +0000 (18:49 +0530)
committerbuildbot <buildbot@intel.com>
Thu, 29 Mar 2012 00:29:13 +0000 (17:29 -0700)
BZ: 24745

The issue is because we lost a HOTPLUG event sending to audio driver, this patch
sends HOTPLUG message according to HDMI port status.

Change-Id: Iac845d5bd34bd5bd722dd44cee9dfd09bf823cf0
Signed-off-by: Shreyas Neerebailoor <shreyasx.neerebailoor@intel.com>
Reviewed-on: http://android.intel.com:8080/38150
Reviewed-by: Xu, Randy <randy.xu@intel.com>
Reviewed-by: Agarwal, Vaibhav <vaibhav.agarwal@intel.com>
Tested-by: Xu, Randy <randy.xu@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/staging/mrst/drv/psb_intel_hdmi.c

index 8d519dc..426a1e9 100644 (file)
@@ -607,8 +607,7 @@ static void mdfld_hdmi_mode_set(struct drm_encoder *encoder,
        hdmi_phy_misc = REG_READ(HDMIPHYMISCCTL) & ~HDMI_PHY_POWER_DOWN;
        REG_WRITE(HDMIPHYMISCCTL, hdmi_phy_misc);
 
-       hdmib = REG_READ(hdmi_priv->hdmib_reg) | HDMIB_PORT_EN |
-               HDMIB_PIPE_B_SELECT;
+       hdmib = REG_READ(hdmi_priv->hdmib_reg) | HDMIB_PIPE_B_SELECT;
 
        if (dev_priv->bDVIport) {
                hdmib &= ~(HDMIB_NULL_PACKET | HDMI_AUDIO_ENABLE) ;
@@ -658,6 +657,10 @@ static void mdfld_hdmi_mode_set(struct drm_encoder *encoder,
        else
                hdmib &= ~BIT4;
 
+       /*port will be enabled in dpms function
+       here make sure it is off before mode set completed */
+       hdmib &= ~HDMIB_PORT_EN;
+
        REG_WRITE(hdmi_priv->hdmib_reg, hdmib);
        REG_READ(hdmi_priv->hdmib_reg);
 
@@ -783,6 +786,7 @@ static void mdfld_hdmi_dpms(struct drm_encoder *encoder, int mode)
                (struct drm_psb_private *)dev->dev_private;
        struct psb_intel_output *output = enc_to_psb_intel_output(encoder);
        struct mid_intel_hdmi_priv *hdmi_priv = output->dev_priv;
+       u32 hdmip_enabled = 0;
        u32 hdmib, hdmi_phy_misc;
 
        PSB_DEBUG_ENTRY("%s\n", mode == DRM_MODE_DPMS_ON ?
@@ -802,11 +806,13 @@ static void mdfld_hdmi_dpms(struct drm_encoder *encoder, int mode)
                hdmib |= (HDMIB_NULL_PACKET | HDMI_AUDIO_ENABLE);
 
        hdmi_phy_misc = REG_READ(HDMIPHYMISCCTL);
+       hdmip_enabled = REG_READ(hdmi_priv->hdmib_reg) & HDMIB_PORT_EN;
+       PSB_DEBUG_ENTRY("hdmip_enabled is %x\n", hdmip_enabled);
 
        if (mode != DRM_MODE_DPMS_ON) {
                if (dev_priv->mdfld_had_event_callbacks
                        && !dev_priv->bDVIport
-                       && !dev_priv->bhdmiconnected)
+                       && (hdmip_enabled != 0))
                        (*dev_priv->mdfld_had_event_callbacks)
                                (HAD_EVENT_HOT_UNPLUG, dev_priv->had_pvt_data);
 
@@ -824,7 +830,7 @@ static void mdfld_hdmi_dpms(struct drm_encoder *encoder, int mode)
 
                if (dev_priv->mdfld_had_event_callbacks
                        && !dev_priv->bDVIport
-                       && dev_priv->bhdmiconnected)
+                       && (hdmip_enabled == 0))
                        (*dev_priv->mdfld_had_event_callbacks)
                                (HAD_EVENT_HOT_PLUG, dev_priv->had_pvt_data);
        }