From patchwork Tue Jul 28 02:10:28 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhao, Yakui" X-Patchwork-Id: 37660 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n6S2A1X7003915 for ; Tue, 28 Jul 2009 02:10:01 GMT Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1C1C99EFF9; Mon, 27 Jul 2009 19:10:01 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga14.intel.com (mga14.intel.com [143.182.124.37]) by gabe.freedesktop.org (Postfix) with ESMTP id A79FF9EFF9 for ; Mon, 27 Jul 2009 19:09:55 -0700 (PDT) Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga102.ch.intel.com with ESMTP; 27 Jul 2009 19:09:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.43,280,1246863600"; d="scan'208";a="169537375" Received: from yakui_zhao.sh.intel.com (HELO localhost.localdomain) ([10.239.13.194]) by azsmga001.ch.intel.com with ESMTP; 27 Jul 2009 19:09:54 -0700 From: yakui.zhao@intel.com To: eric@anholt.net Date: Tue, 28 Jul 2009 10:10:28 +0800 Message-Id: <1248747028-4231-4-git-send-email-yakui.zhao@intel.com> X-Mailer: git-send-email 1.5.4.5 In-Reply-To: <1248747028-4231-3-git-send-email-yakui.zhao@intel.com> References: <1248747028-4231-1-git-send-email-yakui.zhao@intel.com> <1248747028-4231-2-git-send-email-yakui.zhao@intel.com> <1248747028-4231-3-git-send-email-yakui.zhao@intel.com> Cc: intel-gfx@lists.freedesktop.org Subject: [Intel-gfx] [Patch 3/3] DRM/I915: Use the child device to decide whether the given DP should be intialized X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.9 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org From: Zhao Yakui 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 --- 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-07-13 08:49:30.000000000 +0800 +++ linux-2.6/drivers/gpu/drm/i915/intel_dp.c 2009-07-20 17:18:27.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) @@ -1098,7 +1103,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) { @@ -1107,6 +1149,10 @@ struct intel_output *intel_output; struct intel_dp_priv *dp_priv; + 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)