From patchwork Thu Aug 30 06:53:23 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: y@samsung.com X-Patchwork-Id: 1386571 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by patchwork2.kernel.org (Postfix) with ESMTP id DFF77DF264 for ; Thu, 30 Aug 2012 06:16:17 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B8AA9A01FF for ; Wed, 29 Aug 2012 23:16:17 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by gabe.freedesktop.org (Postfix) with ESMTP id EC9EC9EFF7 for ; Wed, 29 Aug 2012 20:55:10 -0700 (PDT) Received: from epcpsbgm2.samsung.com (epcpsbgm2 [203.254.230.27]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0M9J00M6VUET75F0@mailout3.samsung.com> for dri-devel@lists.freedesktop.org; Thu, 30 Aug 2012 12:45:09 +0900 (KST) X-AuditID: cbfee61b-b7faf6d00000476a-90-503ee1c5fb97 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id EC.46.18282.5C1EE305; Thu, 30 Aug 2012 12:45:09 +0900 (KST) Received: from localhost.localdomain ([107.108.73.106]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0M9J00KU8UD7KXC0@mmp1.samsung.com> for dri-devel@lists.freedesktop.org; Thu, 30 Aug 2012 12:45:09 +0900 (KST) From: y@samsung.com To: dri-devel@lists.freedesktop.org Subject: [PATCH] drm: edid: add support for E-DDC Date: Thu, 30 Aug 2012 12:23:23 +0530 Message-id: <1346309603-17808-2-git-send-email-y@samsung.com> X-Mailer: git-send-email 1.7.0.4 In-reply-to: <1346309603-17808-1-git-send-email-y@samsung.com> References: <1346309603-17808-1-git-send-email-y@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrIJMWRmVeSWpSXmKPExsVy+t9jAd2jD+0CDBpuiVpc+fqezYHR4373 caYAxigum5TUnMyy1CJ9uwSujFs7prMXzBesmDfhAWsD4wbeLkZODgkBE4muLV1MELaYxIV7 69m6GLk4hAQWMUqsuXyLCcJZzSQx5dV69i5GDg42AWGJqQe0QBpEBJQl/k5cxQhiMwv4Suxe s5gVpERYwFDiREM0SJhFQFXizdVmVhCbV8BW4v2Tc2wQuxQkWpcdYgexOQXsJB6tvgVWIwRU c3TPX7YJjLwLGBlWMYqmFiQXFCel5xrpFSfmFpfmpesl5+duYgR7/Jn0DsZVDRaHGAU4GJV4 eCdOtQsQYk0sK67MPcQowcGsJMK74y5QiDclsbIqtSg/vqg0J7X4EKM0B4uSOK/TOaCUQHpi SWp2ampBahFMlomDU6qB0WDdF9UUSVYpj+J/Z1e4+2/78Hin3sOe7LMTrK5ez/i+e9Hka152 mkq+kw5kCK4q9M3u1V/ZuLzWYKfrJbX1m+8vTbgxQfinDTOfWe9Nx4f1vk9C3inpTwz+aMb3 JXXOxy8ZxntzXC8drrgus7nW7ytjdm6LdKunSKBAOyefmI9C9PprBZWnlViKMxINtZiLihMB uwWhvPQBAAA= X-Mailman-Approved-At: Wed, 29 Aug 2012 23:11:08 -0700 Cc: Shirish S X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org From: Shirish S The current logic for probing ddc is limited to 2 blocks (256 bytes), this patch adds support for the 4 block (512) data. To do this, a single 8-bit segment index is passed to the display via the I2C address 30h. Data from the selected segment is then immediately read via the regular DDC2 address using a repeated I2C 'START' signal. Signed-off-by: Shirish S Reviewed-by: Jean Delvare Reviewed-by: Daniel Vetter Reviewed-by: Ville Syrjala --- drivers/gpu/drm/drm_edid.c | 19 ++++++++++++++++--- 1 files changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index bcc4725..7f62de5 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -254,6 +254,8 @@ drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf, int block, int len) { unsigned char start = block * EDID_LENGTH; + unsigned char segment = block >> 1; + unsigned char xfers = segment ? 3 : 2; int ret, retries = 5; /* The core i2c driver will automatically retry the transfer if the @@ -265,6 +267,11 @@ drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf, do { struct i2c_msg msgs[] = { { + .addr = DDC_SEGMENT_ADDR, + .flags = 0, + .len = 1, + .buf = &segment, + }, { .addr = DDC_ADDR, .flags = 0, .len = 1, @@ -276,15 +283,21 @@ drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf, .buf = buf, } }; - ret = i2c_transfer(adapter, msgs, 2); + + /* + * Avoid sending the segment addr to not upset non-compliant ddc + * monitors. + */ + ret = i2c_transfer(adapter, &msgs[3 - xfers], xfers); + if (ret == -ENXIO) { DRM_DEBUG_KMS("drm: skipping non-existent adapter %s\n", adapter->name); break; } - } while (ret != 2 && --retries); + } while (ret != xfers && --retries); - return ret == 2 ? 0 : -1; + return ret == xfers ? 0 : -1; } static bool drm_edid_is_zero(u8 *in_edid, int length)