diff mbox

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

Message ID 1249613719-22194-4-git-send-email-yakui.zhao@intel.com (mailing list archive)
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 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(+)

Comments

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

Patch

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)