diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_hdmi.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 64 |
1 files changed, 4 insertions, 60 deletions
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 9e30daae37dc..1842290cded3 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -130,16 +130,17 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder, | |||
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | static enum drm_connector_status | 132 | static enum drm_connector_status |
| 133 | intel_hdmi_edid_detect(struct drm_connector *connector) | 133 | intel_hdmi_detect(struct drm_connector *connector) |
| 134 | { | 134 | { |
| 135 | struct intel_output *intel_output = to_intel_output(connector); | 135 | struct intel_output *intel_output = to_intel_output(connector); |
| 136 | struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; | 136 | struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; |
| 137 | struct edid *edid = NULL; | 137 | struct edid *edid = NULL; |
| 138 | enum drm_connector_status status = connector_status_disconnected; | 138 | enum drm_connector_status status = connector_status_disconnected; |
| 139 | 139 | ||
| 140 | hdmi_priv->has_hdmi_sink = false; | ||
| 140 | edid = drm_get_edid(&intel_output->base, | 141 | edid = drm_get_edid(&intel_output->base, |
| 141 | intel_output->ddc_bus); | 142 | intel_output->ddc_bus); |
| 142 | hdmi_priv->has_hdmi_sink = false; | 143 | |
| 143 | if (edid) { | 144 | if (edid) { |
| 144 | if (edid->input & DRM_EDID_INPUT_DIGITAL) { | 145 | if (edid->input & DRM_EDID_INPUT_DIGITAL) { |
| 145 | status = connector_status_connected; | 146 | status = connector_status_connected; |
| @@ -148,65 +149,8 @@ intel_hdmi_edid_detect(struct drm_connector *connector) | |||
| 148 | intel_output->base.display_info.raw_edid = NULL; | 149 | intel_output->base.display_info.raw_edid = NULL; |
| 149 | kfree(edid); | 150 | kfree(edid); |
| 150 | } | 151 | } |
| 151 | return status; | ||
| 152 | } | ||
| 153 | |||
| 154 | static enum drm_connector_status | ||
| 155 | igdng_hdmi_detect(struct drm_connector *connector) | ||
| 156 | { | ||
| 157 | struct intel_output *intel_output = to_intel_output(connector); | ||
| 158 | struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; | ||
| 159 | |||
| 160 | /* FIXME hotplug detect */ | ||
| 161 | |||
| 162 | hdmi_priv->has_hdmi_sink = false; | ||
| 163 | return intel_hdmi_edid_detect(connector); | ||
| 164 | } | ||
| 165 | 152 | ||
| 166 | static enum drm_connector_status | 153 | return status; |
| 167 | intel_hdmi_detect(struct drm_connector *connector) | ||
| 168 | { | ||
| 169 | struct drm_device *dev = connector->dev; | ||
| 170 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 171 | struct intel_output *intel_output = to_intel_output(connector); | ||
| 172 | struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; | ||
| 173 | u32 temp, bit; | ||
| 174 | |||
| 175 | if (IS_IGDNG(dev)) | ||
| 176 | return igdng_hdmi_detect(connector); | ||
| 177 | |||
| 178 | temp = I915_READ(PORT_HOTPLUG_EN); | ||
| 179 | |||
| 180 | switch (hdmi_priv->sdvox_reg) { | ||
| 181 | case SDVOB: | ||
| 182 | temp |= HDMIB_HOTPLUG_INT_EN; | ||
| 183 | break; | ||
| 184 | case SDVOC: | ||
| 185 | temp |= HDMIC_HOTPLUG_INT_EN; | ||
| 186 | break; | ||
| 187 | default: | ||
| 188 | return connector_status_unknown; | ||
| 189 | } | ||
| 190 | |||
| 191 | I915_WRITE(PORT_HOTPLUG_EN, temp); | ||
| 192 | |||
| 193 | POSTING_READ(PORT_HOTPLUG_EN); | ||
| 194 | |||
| 195 | switch (hdmi_priv->sdvox_reg) { | ||
| 196 | case SDVOB: | ||
| 197 | bit = HDMIB_HOTPLUG_INT_STATUS; | ||
| 198 | break; | ||
| 199 | case SDVOC: | ||
| 200 | bit = HDMIC_HOTPLUG_INT_STATUS; | ||
| 201 | break; | ||
| 202 | default: | ||
| 203 | return connector_status_unknown; | ||
| 204 | } | ||
| 205 | |||
| 206 | if ((I915_READ(PORT_HOTPLUG_STAT) & bit) != 0) | ||
| 207 | return intel_hdmi_edid_detect(connector); | ||
| 208 | else | ||
| 209 | return connector_status_disconnected; | ||
| 210 | } | 154 | } |
| 211 | 155 | ||
| 212 | static int intel_hdmi_get_modes(struct drm_connector *connector) | 156 | static int intel_hdmi_get_modes(struct drm_connector *connector) |
