Message ID | 1249613719-22194-3-git-send-email-yakui.zhao@intel.com (mailing list archive) |
---|---|
State | Rejected |
Headers | show |
On Fri, 7 Aug 2009 10:55:18 +0800 yakui.zhao@intel.com wrote: > From: Zhao Yakui <yakui.zhao@intel.com> > > Use the child device array to decide whether the given HDMI output > should be initialized. If the given HDMI 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_hdmi.c | 50 > ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 > insertions(+) > > Index: linux-2.6/drivers/gpu/drm/i915/intel_hdmi.c > =================================================================== > --- linux-2.6.orig/drivers/gpu/drm/i915/intel_hdmi.c > 2009-08-07 10:46:28.000000000 +0800 +++ > linux-2.6/drivers/gpu/drm/i915/intel_hdmi.c 2009-08-07 > 10:49:03.000000000 +0800 @@ -36,6 +36,11 @@ #include "i915_drm.h" > #include "i915_drv.h" > > +#define HDMI_CLASS 0x60D2 > +#define DVO_B 1 > +#define DVO_C 2 > +#define DVO_D 3 These belong in intel_bios.h. You could also add a mapping table there to avoid the set of conditionals in hdmi_is_present_in_vbt. > + > struct intel_hdmi_priv { > u32 sdvox_reg; > u32 save_SDVOX; > @@ -207,7 +212,48 @@ > .destroy = intel_hdmi_enc_destroy, > }; > > +/* > + * Enumerate the child dev array parsed from VBT to check whether > + * the given HDMI 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 > + * HDMI is present. > + */ > +int hdmi_is_present_in_vbt(struct drm_device *dev, int hdmi_reg) > +{ > + struct drm_i915_private *dev_priv = dev->dev_private; > + struct child_device_config *p_child; More Hungarian notation to drop... > + int i, hdmi_port, ret; > + > + if (!dev_priv->child_dev_num) > + return 1; > > + if (hdmi_reg == SDVOB) > + hdmi_port = DVO_B; > + else if (hdmi_reg == SDVOC) > + hdmi_port = DVO_C; > + else if (hdmi_reg == HDMIB) > + hdmi_port = DVO_B; > + else if (hdmi_reg == HDMIC) > + hdmi_port = DVO_C; > + else if (hdmi_reg == HDMID) > + hdmi_port = DVO_D; > + > + 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 != HDMI_CLASS) > + continue; > + /* Find the HDMI port */ > + if (p_child->dvo_port == hdmi_port) > + ret = 1; > + } > + return ret; > +} > void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) > { > struct drm_i915_private *dev_priv = dev->dev_private; > @@ -215,6 +261,10 @@ > struct intel_output *intel_output; > struct intel_hdmi_priv *hdmi_priv; > > + if (!hdmi_is_present_in_vbt(dev, sdvox_reg)) { > + DRM_DEBUG("HDMI is not present. Ignored it \n"); > + return; > + } Maybe just "HMDI not listed in VBT, ignored.\n".
Index: linux-2.6/drivers/gpu/drm/i915/intel_hdmi.c =================================================================== --- linux-2.6.orig/drivers/gpu/drm/i915/intel_hdmi.c 2009-08-07 10:46:28.000000000 +0800 +++ linux-2.6/drivers/gpu/drm/i915/intel_hdmi.c 2009-08-07 10:49:03.000000000 +0800 @@ -36,6 +36,11 @@ #include "i915_drm.h" #include "i915_drv.h" +#define HDMI_CLASS 0x60D2 +#define DVO_B 1 +#define DVO_C 2 +#define DVO_D 3 + struct intel_hdmi_priv { u32 sdvox_reg; u32 save_SDVOX; @@ -207,7 +212,48 @@ .destroy = intel_hdmi_enc_destroy, }; +/* + * Enumerate the child dev array parsed from VBT to check whether + * the given HDMI 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 + * HDMI is present. + */ +int hdmi_is_present_in_vbt(struct drm_device *dev, int hdmi_reg) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct child_device_config *p_child; + int i, hdmi_port, ret; + + if (!dev_priv->child_dev_num) + return 1; + if (hdmi_reg == SDVOB) + hdmi_port = DVO_B; + else if (hdmi_reg == SDVOC) + hdmi_port = DVO_C; + else if (hdmi_reg == HDMIB) + hdmi_port = DVO_B; + else if (hdmi_reg == HDMIC) + hdmi_port = DVO_C; + else if (hdmi_reg == HDMID) + hdmi_port = DVO_D; + + 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 != HDMI_CLASS) + continue; + /* Find the HDMI port */ + if (p_child->dvo_port == hdmi_port) + ret = 1; + } + return ret; +} void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) { struct drm_i915_private *dev_priv = dev->dev_private; @@ -215,6 +261,10 @@ struct intel_output *intel_output; struct intel_hdmi_priv *hdmi_priv; + if (!hdmi_is_present_in_vbt(dev, sdvox_reg)) { + DRM_DEBUG("HDMI is not present. Ignored it \n"); + return; + } intel_output = kcalloc(sizeof(struct intel_output) + sizeof(struct intel_hdmi_priv), 1, GFP_KERNEL); if (!intel_output)