mirror of https://gitee.com/openkylin/linux.git
drm/i915: add port parameter to intel_hdmi_init
Instead of having a giant if cascade to figure this out according to the passed-in register. We could do quite a bit more cleaning up and all by using the port at more places, but I think this should be part of a bigger rework to introduce a struct intel_digital_port which would keep track of all these things. I guess this will be part of some haswell-DP-induced refactoring. For now this rips out the big cascade, which is what annoyed me so much. v2: Add port variable name back for the func decl (I've tried to trick myself below the 80 char limit). Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
66a9278eec
commit
08d644add0
|
@ -250,7 +250,7 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
|
||||||
case PORT_B:
|
case PORT_B:
|
||||||
case PORT_C:
|
case PORT_C:
|
||||||
case PORT_D:
|
case PORT_D:
|
||||||
intel_hdmi_init(dev, DDI_BUF_CTL(port));
|
intel_hdmi_init(dev, DDI_BUF_CTL(port), port);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DRM_DEBUG_DRIVER("No handlers defined for port %d, skipping DDI initialization\n",
|
DRM_DEBUG_DRIVER("No handlers defined for port %d, skipping DDI initialization\n",
|
||||||
|
|
|
@ -6798,16 +6798,16 @@ static void intel_setup_outputs(struct drm_device *dev)
|
||||||
/* PCH SDVOB multiplex with HDMIB */
|
/* PCH SDVOB multiplex with HDMIB */
|
||||||
found = intel_sdvo_init(dev, PCH_SDVOB, true);
|
found = intel_sdvo_init(dev, PCH_SDVOB, true);
|
||||||
if (!found)
|
if (!found)
|
||||||
intel_hdmi_init(dev, HDMIB);
|
intel_hdmi_init(dev, HDMIB, PORT_B);
|
||||||
if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED))
|
if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED))
|
||||||
intel_dp_init(dev, PCH_DP_B);
|
intel_dp_init(dev, PCH_DP_B);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (I915_READ(HDMIC) & PORT_DETECTED)
|
if (I915_READ(HDMIC) & PORT_DETECTED)
|
||||||
intel_hdmi_init(dev, HDMIC);
|
intel_hdmi_init(dev, HDMIC, PORT_C);
|
||||||
|
|
||||||
if (!dpd_is_edp && I915_READ(HDMID) & PORT_DETECTED)
|
if (!dpd_is_edp && I915_READ(HDMID) & PORT_DETECTED)
|
||||||
intel_hdmi_init(dev, HDMID);
|
intel_hdmi_init(dev, HDMID, PORT_D);
|
||||||
|
|
||||||
if (I915_READ(PCH_DP_C) & DP_DETECTED)
|
if (I915_READ(PCH_DP_C) & DP_DETECTED)
|
||||||
intel_dp_init(dev, PCH_DP_C);
|
intel_dp_init(dev, PCH_DP_C);
|
||||||
|
@ -6821,13 +6821,13 @@ static void intel_setup_outputs(struct drm_device *dev)
|
||||||
/* SDVOB multiplex with HDMIB */
|
/* SDVOB multiplex with HDMIB */
|
||||||
found = intel_sdvo_init(dev, SDVOB, true);
|
found = intel_sdvo_init(dev, SDVOB, true);
|
||||||
if (!found)
|
if (!found)
|
||||||
intel_hdmi_init(dev, SDVOB);
|
intel_hdmi_init(dev, SDVOB, PORT_B);
|
||||||
if (!found && (I915_READ(DP_B) & DP_DETECTED))
|
if (!found && (I915_READ(DP_B) & DP_DETECTED))
|
||||||
intel_dp_init(dev, DP_B);
|
intel_dp_init(dev, DP_B);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (I915_READ(SDVOC) & PORT_DETECTED)
|
if (I915_READ(SDVOC) & PORT_DETECTED)
|
||||||
intel_hdmi_init(dev, SDVOC);
|
intel_hdmi_init(dev, SDVOC, PORT_C);
|
||||||
|
|
||||||
/* Shares lanes with HDMI on SDVOC */
|
/* Shares lanes with HDMI on SDVOC */
|
||||||
if (I915_READ(DP_C) & DP_DETECTED)
|
if (I915_READ(DP_C) & DP_DETECTED)
|
||||||
|
@ -6840,7 +6840,7 @@ static void intel_setup_outputs(struct drm_device *dev)
|
||||||
found = intel_sdvo_init(dev, SDVOB, true);
|
found = intel_sdvo_init(dev, SDVOB, true);
|
||||||
if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) {
|
if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) {
|
||||||
DRM_DEBUG_KMS("probing HDMI on SDVOB\n");
|
DRM_DEBUG_KMS("probing HDMI on SDVOB\n");
|
||||||
intel_hdmi_init(dev, SDVOB);
|
intel_hdmi_init(dev, SDVOB, PORT_B);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found && SUPPORTS_INTEGRATED_DP(dev)) {
|
if (!found && SUPPORTS_INTEGRATED_DP(dev)) {
|
||||||
|
@ -6860,7 +6860,7 @@ static void intel_setup_outputs(struct drm_device *dev)
|
||||||
|
|
||||||
if (SUPPORTS_INTEGRATED_HDMI(dev)) {
|
if (SUPPORTS_INTEGRATED_HDMI(dev)) {
|
||||||
DRM_DEBUG_KMS("probing HDMI on SDVOC\n");
|
DRM_DEBUG_KMS("probing HDMI on SDVOC\n");
|
||||||
intel_hdmi_init(dev, SDVOC);
|
intel_hdmi_init(dev, SDVOC, PORT_C);
|
||||||
}
|
}
|
||||||
if (SUPPORTS_INTEGRATED_DP(dev)) {
|
if (SUPPORTS_INTEGRATED_DP(dev)) {
|
||||||
DRM_DEBUG_KMS("probing DP_C\n");
|
DRM_DEBUG_KMS("probing DP_C\n");
|
||||||
|
|
|
@ -364,7 +364,8 @@ extern void intel_attach_force_audio_property(struct drm_connector *connector);
|
||||||
extern void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
|
extern void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
|
||||||
|
|
||||||
extern void intel_crt_init(struct drm_device *dev);
|
extern void intel_crt_init(struct drm_device *dev);
|
||||||
extern void intel_hdmi_init(struct drm_device *dev, int sdvox_reg);
|
extern void intel_hdmi_init(struct drm_device *dev,
|
||||||
|
int sdvox_reg, enum port port);
|
||||||
extern struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder);
|
extern struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder);
|
||||||
extern void intel_dip_infoframe_csum(struct dip_infoframe *avi_if);
|
extern void intel_dip_infoframe_csum(struct dip_infoframe *avi_if);
|
||||||
extern bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg,
|
extern bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg,
|
||||||
|
|
|
@ -889,7 +889,7 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *c
|
||||||
intel_attach_broadcast_rgb_property(connector);
|
intel_attach_broadcast_rgb_property(connector);
|
||||||
}
|
}
|
||||||
|
|
||||||
void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
|
void intel_hdmi_init(struct drm_device *dev, int sdvox_reg, enum port port)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
struct drm_connector *connector;
|
struct drm_connector *connector;
|
||||||
|
@ -925,40 +925,23 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
|
||||||
|
|
||||||
intel_encoder->cloneable = false;
|
intel_encoder->cloneable = false;
|
||||||
|
|
||||||
/* Set up the DDC bus. */
|
intel_hdmi->ddi_port = port;
|
||||||
if (sdvox_reg == SDVOB) {
|
switch (port) {
|
||||||
|
case PORT_B:
|
||||||
intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
|
intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
|
||||||
dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
|
dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
|
||||||
} else if (sdvox_reg == SDVOC) {
|
break;
|
||||||
|
case PORT_C:
|
||||||
intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
|
intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
|
||||||
dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
|
dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
|
||||||
} else if (sdvox_reg == HDMIB) {
|
break;
|
||||||
intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
|
case PORT_D:
|
||||||
dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
|
|
||||||
} else if (sdvox_reg == HDMIC) {
|
|
||||||
intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
|
|
||||||
dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
|
|
||||||
} else if (sdvox_reg == HDMID) {
|
|
||||||
intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
|
intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
|
||||||
dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
|
dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
|
||||||
} else if (sdvox_reg == DDI_BUF_CTL(PORT_B)) {
|
break;
|
||||||
DRM_DEBUG_DRIVER("LPT: detected output on DDI B\n");
|
case PORT_A:
|
||||||
intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
|
/* Internal port only for eDP. */
|
||||||
intel_hdmi->ddi_port = PORT_B;
|
default:
|
||||||
dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
|
|
||||||
} else if (sdvox_reg == DDI_BUF_CTL(PORT_C)) {
|
|
||||||
DRM_DEBUG_DRIVER("LPT: detected output on DDI C\n");
|
|
||||||
intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
|
|
||||||
intel_hdmi->ddi_port = PORT_C;
|
|
||||||
dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
|
|
||||||
} else if (sdvox_reg == DDI_BUF_CTL(PORT_D)) {
|
|
||||||
DRM_DEBUG_DRIVER("LPT: detected output on DDI D\n");
|
|
||||||
intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
|
|
||||||
intel_hdmi->ddi_port = PORT_D;
|
|
||||||
dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
|
|
||||||
} else {
|
|
||||||
/* If we got an unknown sdvox_reg, things are pretty much broken
|
|
||||||
* in a way that we should let the kernel know about it */
|
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue