[RFC,2/3] DRM/I915: Use the child device to decide whether the given HDMI should be intialized
diff mbox

Message ID 1249613719-22194-3-git-send-email-yakui.zhao@intel.com
State Rejected
Headers show

Commit Message

Zhao, Yakui Aug. 7, 2009, 2:55 a.m. UTC
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(+)

Comments

Jesse Barnes Aug. 7, 2009, 5:06 p.m. UTC | #1
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".

Patch
diff mbox

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)