From patchwork Fri Aug 30 12:37:36 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulrich Hecht X-Patchwork-Id: 2851960 Return-Path: X-Original-To: patchwork-linux-sh@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 4A1A4C0AB5 for ; Fri, 30 Aug 2013 12:39:10 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1C0192039D for ; Fri, 30 Aug 2013 12:39:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id DFD712039A for ; Fri, 30 Aug 2013 12:39:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756036Ab3H3Mi7 (ORCPT ); Fri, 30 Aug 2013 08:38:59 -0400 Received: from mail-ea0-f181.google.com ([209.85.215.181]:65403 "EHLO mail-ea0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755991Ab3H3Mi6 (ORCPT ); Fri, 30 Aug 2013 08:38:58 -0400 Received: by mail-ea0-f181.google.com with SMTP id d10so889788eaj.40 for ; Fri, 30 Aug 2013 05:38:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bATyvgNY6tLBzMtp16HwKCtpuRDwYKQy0d7pJrbpaX4=; b=rp1HCI4VUWnUisSIXC/gCvNcKp+fpmeZcaKe80b27DxKRJyFe49a/TrQdaqg3dLAJu bJsAhtdlhFx7p2TT+iTkfr1CkgDw+5iuPcF2V9rFkMD9elsCVAdjYSGh+fkLx6Kh+ta7 M+pRyM3Ios/Jxhx7gJqi9OG3VC9C1pgrPWYR7B8XZkBWXyNpEAPbjkiHCS05jee8Iv2e g+s1k8QdG1NBOgixE7djEdaANGV2OhNb7djk+rdh3WWy5BMnaRID4/ZfZr5qbOlktHGG xGrzCoIfO6leAY9vtLgv+Io+JxR/wzodUt3QhSBAqIq5aDDQEAQjCkPJlLSPC23E3+1O fvtg== X-Received: by 10.14.225.199 with SMTP id z47mr12579343eep.24.1377866337414; Fri, 30 Aug 2013 05:38:57 -0700 (PDT) Received: from groucho.site ([109.201.152.242]) by mx.google.com with ESMTPSA id j7sm54444384eeo.15.1969.12.31.16.00.00 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 30 Aug 2013 05:38:56 -0700 (PDT) From: Ulrich Hecht To: linux-sh@vger.kernel.org Cc: magnus.damm@gmail.com, Ulrich Hecht , Lars-Peter Clausen Subject: [RFC 02/10] drm: Decouple edid parsing from i2c adapter Date: Fri, 30 Aug 2013 14:37:36 +0200 Message-Id: <1377866264-21110-3-git-send-email-ulrich.hecht@gmail.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1377866264-21110-1-git-send-email-ulrich.hecht@gmail.com> References: <1377866264-21110-1-git-send-email-ulrich.hecht@gmail.com> Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org X-Spam-Status: No, score=-8.9 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Lars-Peter Clausen --- drivers/gpu/drm/drm_edid.c | 18 ++++++++++-------- include/drm/drm_edid.h | 3 +++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 95d6f4b..94f4d79 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -1059,9 +1059,10 @@ EXPORT_SYMBOL(drm_edid_is_valid); * Try to fetch EDID information by calling i2c driver function. */ static int -drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf, +drm_do_probe_ddc_edid(void *data, unsigned char *buf, int block, int len) { + struct i2c_adapter *adapter = data; unsigned char start = block * EDID_LENGTH; unsigned char segment = block >> 1; unsigned char xfers = segment ? 3 : 2; @@ -1117,8 +1118,8 @@ static bool drm_edid_is_zero(u8 *in_edid, int length) return true; } -static u8 * -drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) +struct edid *drm_do_get_edid(struct drm_connector *connector, + int (*get_edid_block)(void *, unsigned char *buf, int, int), void *data) { int i, j = 0, valid_extensions = 0; u8 *block, *new; @@ -1129,7 +1130,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) /* base block fetch */ for (i = 0; i < 4; i++) { - if (drm_do_probe_ddc_edid(adapter, block, 0, EDID_LENGTH)) + if (get_edid_block(data, block, 0, EDID_LENGTH)) goto out; if (drm_edid_block_valid(block, 0, print_bad_edid)) break; @@ -1143,7 +1144,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) /* if there's no extensions, we're done */ if (block[0x7e] == 0) - return block; + return (struct edid *)block; new = krealloc(block, (block[0x7e] + 1) * EDID_LENGTH, GFP_KERNEL); if (!new) @@ -1152,7 +1153,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) for (j = 1; j <= block[0x7e]; j++) { for (i = 0; i < 4; i++) { - if (drm_do_probe_ddc_edid(adapter, + if (get_edid_block(data, block + (valid_extensions + 1) * EDID_LENGTH, j, EDID_LENGTH)) goto out; @@ -1180,7 +1181,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) block = new; } - return block; + return (struct edid *)block; carp: if (print_bad_edid) { @@ -1193,6 +1194,7 @@ out: kfree(block); return NULL; } +EXPORT_SYMBOL_GPL(drm_do_get_edid); /** * Probe DDC presence. @@ -1225,7 +1227,7 @@ struct edid *drm_get_edid(struct drm_connector *connector, struct edid *edid = NULL; if (drm_probe_ddc(adapter)) - edid = (struct edid *)drm_do_get_edid(connector, adapter); + edid = (struct edid *)drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter); return edid; } diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index fc481fc..fff4a48 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -269,4 +269,7 @@ int drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, const struct drm_display_mode *mode); +struct edid *drm_do_get_edid(struct drm_connector *connector, + int (*get_edid_block)(void *, unsigned char *buf, int, int), void *data); + #endif /* __DRM_EDID_H__ */