From patchwork Thu Oct 28 12:34:48 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guennadi Liakhovetski X-Patchwork-Id: 287502 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o9SCYgAc021656 for ; Thu, 28 Oct 2010 12:34:42 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758590Ab0J1Mem (ORCPT ); Thu, 28 Oct 2010 08:34:42 -0400 Received: from mailout-de.gmx.net ([213.165.64.23]:40458 "HELO mail.gmx.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with SMTP id S1758654Ab0J1Mel (ORCPT ); Thu, 28 Oct 2010 08:34:41 -0400 Received: (qmail invoked by alias); 28 Oct 2010 12:34:34 -0000 Received: from p50898A9A.dip0.t-ipconnect.de (EHLO axis700.grange) [80.137.138.154] by mail.gmx.net (mp011) with SMTP; 28 Oct 2010 14:34:34 +0200 X-Authenticated: #20450766 X-Provags-ID: V01U2FsdGVkX1+MDYodAeuMgV47x63qGffCHdixGddZfY52Lf8VVg iXedsx/KlIKpGd Received: from lyakh (helo=localhost) by axis700.grange with local-esmtp (Exim 4.63) (envelope-from ) id 1PBRgu-0000Kf-9m; Thu, 28 Oct 2010 14:34:48 +0200 Date: Thu, 28 Oct 2010 14:34:48 +0200 (CEST) From: Guennadi Liakhovetski To: linux-fbdev@vger.kernel.org cc: linux-sh@vger.kernel.org, Erik Gilling , Andrew Morton , Dave Airlie , Geert Uytterhoeven Subject: [PATCH 2/4] fbdev: export fb_edid_add_monspecs() for modules, improve algorithm In-Reply-To: Message-ID: References: MIME-Version: 1.0 X-Y-GMX-Trusted: 0 Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Thu, 28 Oct 2010 12:34:42 +0000 (UTC) diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c index 7a77170..d9ba6c1 100644 --- a/drivers/video/fbmon.c +++ b/drivers/video/fbmon.c @@ -976,10 +976,11 @@ void fb_edid_to_monspecs(unsigned char *edid, struct fb_monspecs *specs) void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs) { unsigned char *block; - struct fb_videomode *mode, *m; - int num = 0, i, first = 1; + struct fb_videomode *m; + int num = 0, i; + u8 edt[(128 - 4) / DETAILED_TIMING_DESCRIPTION_SIZE]; - if (edid == NULL) + if (!edid) return; if (!edid_checksum(edid)) @@ -988,43 +989,34 @@ void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs) if (edid[0] != 0x2) return; - mode = kzalloc(50 * sizeof(struct fb_videomode), GFP_KERNEL); - if (mode == NULL) - return; - block = edid + edid[0x2]; DPRINTK(" Extended Detailed Timings\n"); for (i = 0; i < (128 - edid[0x2]) / DETAILED_TIMING_DESCRIPTION_SIZE; - i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) { - if (!(block[0] == 0x00 && block[1] == 0x00)) { - get_detailed_timing(block, &mode[num]); - if (first) { - mode[num].flag |= FB_MODE_IS_FIRST; - first = 0; - } - num++; - } - } + i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) + if (!(block[0] == 0x00 && block[1] == 0x00)) + edt[num++] = block - edid; /* Yikes, EDID data is totally useless */ - if (!num) { - kfree(mode); + if (!num) return; - } m = kzalloc((specs->modedb_len + num) * sizeof(struct fb_videomode), GFP_KERNEL); - if (!m) { - kfree(mode); + if (!m) return; - } memmove(m, specs->modedb, specs->modedb_len * sizeof(struct fb_videomode)); - memmove(m + specs->modedb_len, mode, num * sizeof(struct fb_videomode)); - kfree(mode); + + for (i = specs->modedb_len; i < specs->modedb_len + num; i++) { + get_detailed_timing(edid + edt[i - specs->modedb_len], &m[i]); + if (i == specs->modedb_len) + m[i].flag |= FB_MODE_IS_FIRST; + pr_debug("Adding %ux%u@%u\n", m[i].xres, m[i].yres, m[i].refresh); + } + kfree(specs->modedb); specs->modedb = m; specs->modedb_len = specs->modedb_len + num; @@ -1345,6 +1337,9 @@ int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var) void fb_edid_to_monspecs(unsigned char *edid, struct fb_monspecs *specs) { } +void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs) +{ +} void fb_destroy_modedb(struct fb_videomode *modedb) { } @@ -1452,6 +1447,7 @@ EXPORT_SYMBOL(fb_firmware_edid); EXPORT_SYMBOL(fb_parse_edid); EXPORT_SYMBOL(fb_edid_to_monspecs); +EXPORT_SYMBOL(fb_edid_add_monspecs); EXPORT_SYMBOL(fb_get_mode); EXPORT_SYMBOL(fb_validate_mode); EXPORT_SYMBOL(fb_destroy_modedb);