summaryrefslogtreecommitdiff
path: root/sys/dev/videomode
diff options
context:
space:
mode:
authormacallan <macallan@NetBSD.org>2007-03-07 19:56:40 +0000
committermacallan <macallan@NetBSD.org>2007-03-07 19:56:40 +0000
commitf658e972f249abdf943f27eff185526a90bb960a (patch)
tree5ac84a17adf7a66d75d491c77d2258b07667f18a /sys/dev/videomode
parent6b01cea87b74e60cb43bf7d45dffeefd71e927db (diff)
correct the maximum supported dotclock on monitors that report one value
but claim to support modes which need something higher, while there also initialize the edid_preferred_mode pointer before using it
Diffstat (limited to 'sys/dev/videomode')
-rw-r--r--sys/dev/videomode/edid.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/sys/dev/videomode/edid.c b/sys/dev/videomode/edid.c
index 66b62c42279..271ae48a551 100644
--- a/sys/dev/videomode/edid.c
+++ b/sys/dev/videomode/edid.c
@@ -1,4 +1,4 @@
-/* $NetBSD: edid.c,v 1.4 2007/03/07 18:49:31 macallan Exp $ */
+/* $NetBSD: edid.c,v 1.5 2007/03/07 19:56:40 macallan Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: edid.c,v 1.4 2007/03/07 18:49:31 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: edid.c,v 1.5 2007/03/07 19:56:40 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -482,6 +482,8 @@ edid_parse(uint8_t *data, struct edid_info *edid)
const struct videomode *vmp;
int i;
const char *name;
+ int max_dotclock = 0;
+ int mhz;
if (edid_is_valid(data) != 0)
return -1;
@@ -538,6 +540,7 @@ edid_parse(uint8_t *data, struct edid_info *edid)
/* lookup established modes */
edid->edid_nmodes = 0;
+ edid->edid_preferred_mode = NULL;
estmodes = EDID_EST_TIMING(data);
for (i = 0; i < 16; i++) {
if (estmodes & (1 << i)) {
@@ -546,6 +549,11 @@ edid_parse(uint8_t *data, struct edid_info *edid)
edid->edid_modes[edid->edid_nmodes] = *vmp;
edid->edid_nmodes++;
}
+#ifdef DIAGNOSTIC
+ else
+ printf("no data for est. mode %s\n",
+ _edid_modes[i]);
+#endif
}
}
@@ -570,6 +578,30 @@ edid_parse(uint8_t *data, struct edid_info *edid)
edid_strchomp(edid->edid_serial);
edid_strchomp(edid->edid_comment);
+ /*
+ * XXX
+ * some monitors lie about their maximum supported dot clock
+ * by claiming to support modes which need a higher dot clock
+ * than the stated maximum.
+ * For sanity's sake we bump it to the highest dot clock we find
+ * in the list of supported modes
+ */
+ for (i = 0; i < edid->edid_nmodes; i++)
+ if (edid->edid_modes[i].dot_clock > max_dotclock)
+ max_dotclock = edid->edid_modes[i].dot_clock;
+
+ aprint_verbose("max_dotclock according to supported modes: %d\n",
+ max_dotclock);
+
+ mhz = (max_dotclock + 999) / 1000;
+
+ if (edid->edid_have_range) {
+
+ if (mhz > edid->edid_range.er_max_clock)
+ edid->edid_range.er_max_clock = mhz;
+ } else
+ edid->edid_range.er_max_clock = mhz;
+
return 0;
}