OSDN Git Service

Merge "drm/msm: notify hpd status when audio codec is ready"
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / drivers / gpu / drm / msm / hdmi-staging / sde_hdmi_bridge.c
index 6c82c3d..34268aa 100644 (file)
@@ -372,6 +372,8 @@ static void _sde_hdmi_bridge_pre_enable(struct drm_bridge *bridge)
        struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
        struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
        struct hdmi_phy *phy = hdmi->phy;
+       struct sde_connector *c_conn = to_sde_connector(hdmi->connector);
+       struct sde_hdmi *display = (struct sde_hdmi *)c_conn->display;
 
        DRM_DEBUG("power up");
 
@@ -388,41 +390,20 @@ static void _sde_hdmi_bridge_pre_enable(struct drm_bridge *bridge)
        if (hdmi->hdcp_ctrl && hdmi->is_hdcp_supported)
                hdmi_hdcp_ctrl_on(hdmi->hdcp_ctrl);
 
-       sde_hdmi_ack_state(hdmi->connector, EXT_DISPLAY_CABLE_CONNECT);
-}
-
-static void sde_hdmi_force_update_audio(struct drm_connector *connector,
-       enum drm_connector_status status)
-{
-       struct sde_connector *c_conn = to_sde_connector(connector);
-       struct sde_hdmi *display = (struct sde_hdmi *)c_conn->display;
-
-       if (display && display->non_pluggable) {
-               display->ext_audio_data.intf_ops.hpd(display->ext_pdev,
-                               display->ext_audio_data.type,
-                               status,
-                               MSM_EXT_DISP_HPD_AUDIO);
-       }
+       mutex_lock(&display->display_lock);
+       if (display->codec_ready)
+               sde_hdmi_notify_clients(display, display->connected);
+       else
+               display->client_notify_pending = true;
+       mutex_unlock(&display->display_lock);
 }
 
 static void _sde_hdmi_bridge_enable(struct drm_bridge *bridge)
 {
-       struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
-       struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
-
-       /* force update audio ops when there's no HPD event */
-       sde_hdmi_force_update_audio(hdmi->connector,
-               EXT_DISPLAY_CABLE_CONNECT);
 }
 
 static void _sde_hdmi_bridge_disable(struct drm_bridge *bridge)
 {
-       struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
-       struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
-
-       /* force update audio ops when there's no HPD event */
-       sde_hdmi_force_update_audio(hdmi->connector,
-               EXT_DISPLAY_CABLE_DISCONNECT);
 }
 
 static void _sde_hdmi_bridge_post_disable(struct drm_bridge *bridge)
@@ -430,6 +411,10 @@ static void _sde_hdmi_bridge_post_disable(struct drm_bridge *bridge)
        struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
        struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
        struct hdmi_phy *phy = hdmi->phy;
+       struct sde_connector *c_conn = to_sde_connector(hdmi->connector);
+       struct sde_hdmi *display = (struct sde_hdmi *)c_conn->display;
+
+       sde_hdmi_notify_clients(display, display->connected);
 
        if (hdmi->hdcp_ctrl && hdmi->is_hdcp_supported)
                hdmi_hdcp_ctrl_off(hdmi->hdcp_ctrl);
@@ -446,8 +431,6 @@ static void _sde_hdmi_bridge_post_disable(struct drm_bridge *bridge)
                _sde_hdmi_bridge_power_off(bridge);
                hdmi->power_on = false;
        }
-
-       sde_hdmi_ack_state(hdmi->connector, EXT_DISPLAY_CABLE_DISCONNECT);
 }
 
 static void _sde_hdmi_bridge_set_avi_infoframe(struct hdmi *hdmi,