Message ID | 1249613719-22194-4-git-send-email-yakui.zhao@intel.com (mailing list archive) |
---|---|
State | Rejected |
Headers | show |
Same comments from the HDMI patch apply here. On Fri, 7 Aug 2009 10:55:19 +0800 yakui.zhao@intel.com wrote: > From: Zhao Yakui <yakui.zhao@intel.com> > > Use the child device array to decide whether the given DP output > should be initialized. If the given DP port can't be found in child > device array, it is not present and won't be initialized. > > Signed-off-by: Zhao Yakui <yakui.zhao@intel.com> > --- > drivers/gpu/drm/i915/intel_dp.c | 46 > ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 > insertions(+) > > Index: linux-2.6/drivers/gpu/drm/i915/intel_dp.c > =================================================================== > --- linux-2.6.orig/drivers/gpu/drm/i915/intel_dp.c 2009-08-07 > 10:46:25.000000000 +0800 +++ > linux-2.6/drivers/gpu/drm/i915/intel_dp.c 2009-08-07 > 10:49:15.000000000 +0800 @@ -35,6 +35,11 @@ #include "i915_drv.h" > #include "intel_dp.h" > > +#define INT_DP_CLASS 0x68C6 > +#define PORT_IDPB 0x7 > +#define PORT_IDPC 0x8 > +#define PORT_IDPD 0x9 > + > #define DP_LINK_STATUS_SIZE 6 > #define DP_LINK_CHECK_TIMEOUT (10 * 1000) > > @@ -1227,7 +1232,44 @@ > if (dp_priv->dpms_mode == DRM_MODE_DPMS_ON) > intel_dp_check_link_status(intel_output); > } > +/* > + * Enumerate the child dev array parsed from VBT to check whether > + * the given DP is present. > + * If it is present, return 1. > + * If it is not present, return false. > + * If no child dev is parsed from VBT, it assumes that the given > + * DP is present. > + */ > +int dp_is_present_in_vbt(struct drm_device *dev, int dp_reg) > +{ > + struct drm_i915_private *dev_priv = dev->dev_private; > + struct child_device_config *p_child; > + int i, dp_port, ret; > + > + if (!dev_priv->child_dev_num) > + return 1; > > + if (dp_reg == DP_B) > + dp_port = PORT_IDPB; > + else if (dp_reg == DP_C) > + dp_port = PORT_IDPC; > + else > + dp_port = PORT_IDPD; > + > + ret = 0; > + for (i = 0; i < dev_priv->child_dev_num; i++) { > + p_child = dev_priv->child_dev + i; > + /* > + * If the device type is not HDMI, continue. > + */ > + if (p_child->device_type != INT_DP_CLASS) > + continue; > + /* Find the DP port */ > + if (p_child->dvo_port == dp_port) > + ret = 1; > + } > + return ret; > +} > void > intel_dp_init(struct drm_device *dev, int output_reg) > { > @@ -1237,6 +1279,10 @@ > struct intel_dp_priv *dp_priv; > const char *name = NULL; > > + if (!dp_is_present_in_vbt(dev, output_reg)) { > + DRM_DEBUG("DP is not present. Ignore it\n"); > + return; > + } > intel_output = kcalloc(sizeof(struct intel_output) + > sizeof(struct intel_dp_priv), 1, > GFP_KERNEL); if (!intel_output) >
Index: linux-2.6/drivers/gpu/drm/i915/intel_dp.c =================================================================== --- linux-2.6.orig/drivers/gpu/drm/i915/intel_dp.c 2009-08-07 10:46:25.000000000 +0800 +++ linux-2.6/drivers/gpu/drm/i915/intel_dp.c 2009-08-07 10:49:15.000000000 +0800 @@ -35,6 +35,11 @@ #include "i915_drv.h" #include "intel_dp.h" +#define INT_DP_CLASS 0x68C6 +#define PORT_IDPB 0x7 +#define PORT_IDPC 0x8 +#define PORT_IDPD 0x9 + #define DP_LINK_STATUS_SIZE 6 #define DP_LINK_CHECK_TIMEOUT (10 * 1000) @@ -1227,7 +1232,44 @@ if (dp_priv->dpms_mode == DRM_MODE_DPMS_ON) intel_dp_check_link_status(intel_output); } +/* + * Enumerate the child dev array parsed from VBT to check whether + * the given DP is present. + * If it is present, return 1. + * If it is not present, return false. + * If no child dev is parsed from VBT, it assumes that the given + * DP is present. + */ +int dp_is_present_in_vbt(struct drm_device *dev, int dp_reg) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct child_device_config *p_child; + int i, dp_port, ret; + + if (!dev_priv->child_dev_num) + return 1; + if (dp_reg == DP_B) + dp_port = PORT_IDPB; + else if (dp_reg == DP_C) + dp_port = PORT_IDPC; + else + dp_port = PORT_IDPD; + + ret = 0; + for (i = 0; i < dev_priv->child_dev_num; i++) { + p_child = dev_priv->child_dev + i; + /* + * If the device type is not HDMI, continue. + */ + if (p_child->device_type != INT_DP_CLASS) + continue; + /* Find the DP port */ + if (p_child->dvo_port == dp_port) + ret = 1; + } + return ret; +} void intel_dp_init(struct drm_device *dev, int output_reg) { @@ -1237,6 +1279,10 @@ struct intel_dp_priv *dp_priv; const char *name = NULL; + if (!dp_is_present_in_vbt(dev, output_reg)) { + DRM_DEBUG("DP is not present. Ignore it\n"); + return; + } intel_output = kcalloc(sizeof(struct intel_output) + sizeof(struct intel_dp_priv), 1, GFP_KERNEL); if (!intel_output)