From: Tomi Valkeinen <tomi.valkeinen@ti.com>
To: linux-omap@vger.kernel.org, linux-fbdev@vger.kernel.org
Cc: archit@ti.com, mythripk@ti.com, Tomi Valkeinen <tomi.valkeinen@ti.com>
Subject: [PATCH 07/12] OMAP: DSS2: HDMI: clean up edid reading & fix checksum
Date: Wed, 31 Aug 2011 13:23:18 +0000 [thread overview]
Message-ID: <1314797003-17638-8-git-send-email-tomi.valkeinen@ti.com> (raw)
In-Reply-To: <1314797003-17638-1-git-send-email-tomi.valkeinen@ti.com>
Clean up reading of EDID by passing direct address to the block being
read, instead of start address of the whole EDID memory area. Rewrite
the loop which reads the EDID.
This also fixes the checksum calculation, which used to calculate the
checksum only for the first block.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
---
drivers/video/omap2/dss/hdmi.c | 67 ++++++++++++++++++++-------------------
1 files changed, 34 insertions(+), 33 deletions(-)
diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c
index 04ce105..34e05ee 100644
--- a/drivers/video/omap2/dss/hdmi.c
+++ b/drivers/video/omap2/dss/hdmi.c
@@ -414,8 +414,8 @@ static int hdmi_core_ddc_init(void)
static int hdmi_core_ddc_edid(u8 *pedid, int ext)
{
- u32 i, j;
- char checksum = 0;
+ u32 i;
+ char checksum;
u32 offset = 0;
/* HDMI_CORE_DDC_STATUS_IN_PROG */
@@ -457,21 +457,31 @@ static int hdmi_core_ddc_edid(u8 *pedid, int ext)
return -EIO;
}
- i = ext * 128;
- j = 0;
- while (((REG_GET(HDMI_CORE_DDC_STATUS, 4, 4) = 1) ||
- (REG_GET(HDMI_CORE_DDC_STATUS, 2, 2) = 0)) &&
- j < 128) {
+ for (i = 0; i < 0x80; ++i) {
+ int t;
- if (REG_GET(HDMI_CORE_DDC_STATUS, 2, 2) = 0) {
- /* FIFO not empty */
- pedid[i++] = REG_GET(HDMI_CORE_DDC_DATA, 7, 0);
- j++;
+ /* IN_PROG */
+ if (REG_GET(HDMI_CORE_DDC_STATUS, 4, 4) = 0) {
+ DSSERR("operation stopped when reading edid\n");
+ return -EIO;
+ }
+
+ t = 0;
+ /* FIFO_EMPTY */
+ while (REG_GET(HDMI_CORE_DDC_STATUS, 2, 2) = 1) {
+ if (t++ > 10000) {
+ DSSERR("timeout reading edid\n");
+ return -ETIMEDOUT;
+ }
+ udelay(1);
}
+
+ pedid[i] = REG_GET(HDMI_CORE_DDC_DATA, 7, 0);
}
- for (j = 0; j < 128; j++)
- checksum += pedid[j];
+ checksum = 0;
+ for (i = 0; i < 0x80; ++i)
+ checksum += pedid[i];
if (checksum != 0) {
DSSERR("E-EDID checksum failed!!\n");
@@ -481,40 +491,31 @@ static int hdmi_core_ddc_edid(u8 *pedid, int ext)
return 0;
}
-static int read_edid(u8 *pedid, u16 max_length)
+static int read_edid(u8 *edid, int len)
{
- int r = 0, n = 0, i = 0;
- int max_ext_blocks = (max_length / 128) - 1;
- int len;
+ int r, l;
+
+ if (len < 128)
+ return -EINVAL;
r = hdmi_core_ddc_init();
if (r)
return r;
- r = hdmi_core_ddc_edid(pedid, 0);
+ r = hdmi_core_ddc_edid(edid, 0);
if (r)
return r;
- len = 128;
- n = pedid[0x7e];
-
- /*
- * README: need to comply with max_length set by the caller.
- * Better implementation should be to allocate necessary
- * memory to store EDID according to nb_block field found
- * in first block
- */
- if (n > max_ext_blocks)
- n = max_ext_blocks;
+ l = 128;
- for (i = 1; i <= n; i++) {
- r = hdmi_core_ddc_edid(pedid, i);
+ if (len >= 128 * 2 && edid[0x7e] > 0) {
+ r = hdmi_core_ddc_edid(edid + 0x80, 1);
if (r)
return r;
- len += 128;
+ l += 128;
}
- return len;
+ return l;
}
static int get_timings_index(void)
--
1.7.4.1
next prev parent reply other threads:[~2011-08-31 13:23 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-31 13:23 [PATCH 00/12] OMAP: DSS2: EDID & detect support Tomi Valkeinen
2011-08-31 13:23 ` [PATCH 01/12] OMAP: DSS2: add read_edid() to omap_dss_driver struct Tomi Valkeinen
2011-08-31 13:23 ` [PATCH 02/12] OMAP: DSS2: add detect() " Tomi Valkeinen
2011-08-31 13:23 ` [PATCH 03/12] OMAP: DSS2: HDMI: make set_timing saner Tomi Valkeinen
2011-08-31 13:23 ` [PATCH 04/12] OMAP: DSS2: HDMI: implement read_edid() Tomi Valkeinen
2011-08-31 13:23 ` [PATCH 05/12] OMAP: DSS2: HDMI: remove edid parsing Tomi Valkeinen
2011-08-31 13:23 ` [PATCH 06/12] OMAP: DSS2: HDMI: split hdmi_core_ddc_edid Tomi Valkeinen
2011-08-31 13:23 ` Tomi Valkeinen [this message]
2011-08-31 13:23 ` [PATCH 08/12] OMAP: DSS2: HDMI: remove error prints in check_timings Tomi Valkeinen
2011-08-31 13:23 ` [PATCH 09/12] OMAP: DSS2: HDMI: implement detect() Tomi Valkeinen
2011-08-31 13:23 ` [PATCH 10/12] OMAP: DSS2: Generic-dpi: add detect & read_edid support Tomi Valkeinen
2011-08-31 13:23 ` [PATCH 11/12] OMAP: Panda & Beagle: DVI: Add i2c_bus_num Tomi Valkeinen
2011-08-31 15:00 ` Andy Doan
2011-08-31 18:09 ` Tomi Valkeinen
2011-08-31 13:23 ` [PATCH 12/12] OMAPFB: find best mode from edid Tomi Valkeinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1314797003-17638-8-git-send-email-tomi.valkeinen@ti.com \
--to=tomi.valkeinen@ti.com \
--cc=archit@ti.com \
--cc=linux-fbdev@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=mythripk@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).