static int intel_hdmi_get_modes(struct drm_connector *connector) { struct intel_output *intel_output = to_intel_output(connector); return intel_ddc_get_modes(intel_output); }
static void intel_hdmi_save(struct drm_connector *connector) { struct drm_device *dev = connector->dev; struct drm_i915_private *dev_priv = dev->dev_private; struct intel_output *intel_output = to_intel_output(connector); struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; hdmi_priv->save_SDVOX = I915_READ(hdmi_priv->sdvox_reg); }
static void intel_hdmi_restore(struct drm_connector *connector) { struct drm_device *dev = connector->dev; struct drm_i915_private *dev_priv = dev->dev_private; struct intel_output *intel_output = to_intel_output(connector); struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; I915_WRITE(hdmi_priv->sdvox_reg, hdmi_priv->save_SDVOX); POSTING_READ(hdmi_priv->sdvox_reg); }
static void intel_hdmi_destroy(struct drm_connector *connector) { struct intel_output *intel_output = to_intel_output(connector); if (intel_output->i2c_bus) intel_i2c_destroy(intel_output->i2c_bus); drm_sysfs_connector_remove(connector); drm_connector_cleanup(connector); kfree(intel_output); }
static int intel_hdmi_get_modes(struct drm_connector *connector) { struct intel_output *intel_output = to_intel_output(connector); /* We should parse the EDID data and find out if it's an HDMI sink so * we can send audio to it. */ return intel_ddc_get_modes(intel_output); }
static void intel_hdmi_sink_detect(struct drm_connector *connector) { struct intel_output *intel_output = to_intel_output(connector); struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; struct edid *edid = NULL; edid = drm_get_edid(&intel_output->base, &intel_output->ddc_bus->adapter); if (edid != NULL) { hdmi_priv->has_hdmi_sink = drm_detect_hdmi_monitor(edid); kfree(edid); intel_output->base.display_info.raw_edid = NULL; } }
static enum drm_connector_status intel_hdmi_detect(struct drm_connector *connector) { struct intel_output *intel_output = to_intel_output(connector); struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; struct edid *edid = NULL; enum drm_connector_status status = connector_status_disconnected; hdmi_priv->has_hdmi_sink = false; edid = drm_get_edid(&intel_output->base, intel_output->ddc_bus); if (edid) { if (edid->input & DRM_EDID_INPUT_DIGITAL) { status = connector_status_connected; hdmi_priv->has_hdmi_sink = drm_detect_hdmi_monitor(edid); } intel_output->base.display_info.raw_edid = NULL; kfree(edid); } return status; }
static enum drm_connector_status intel_hdmi_detect(struct drm_connector *connector) { struct drm_device *dev = connector->dev; struct drm_i915_private *dev_priv = dev->dev_private; struct intel_output *intel_output = to_intel_output(connector); struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; u32 temp, bit; temp = I915_READ(PORT_HOTPLUG_EN); I915_WRITE(PORT_HOTPLUG_EN, temp | HDMIB_HOTPLUG_INT_EN | HDMIC_HOTPLUG_INT_EN | HDMID_HOTPLUG_INT_EN); POSTING_READ(PORT_HOTPLUG_EN); switch (hdmi_priv->sdvox_reg) { case SDVOB: bit = HDMIB_HOTPLUG_INT_STATUS; break; case SDVOC: bit = HDMIC_HOTPLUG_INT_STATUS; break; default: return connector_status_unknown; } if ((I915_READ(PORT_HOTPLUG_STAT) & bit) != 0) { intel_hdmi_sink_detect(connector); return connector_status_connected; } else return connector_status_disconnected; }