diff mbox

[U-Boot,1/3] edid: add function to convert edid to fb_videomode

Message ID 1410786366-26494-1-git-send-email-christian.gmeiner@gmail.com
State Deferred
Delegated to: Anatolij Gustschin
Headers show

Commit Message

Christian Gmeiner Sept. 15, 2014, 1:06 p.m. UTC
There may be some custom boards in the field which have
an seperate eeprom chip to store edid informations in it.
To make use of those edid information in the board code
this patch add a function to convert edid to fb_videomode.

Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
---
 common/edid.c  | 30 ++++++++++++++++++++++++++++++
 include/edid.h |  9 +++++++++
 2 files changed, 39 insertions(+)
diff mbox

Patch

diff --git a/common/edid.c b/common/edid.c
index e66108f..ea9419c 100644
--- a/common/edid.c
+++ b/common/edid.c
@@ -12,6 +12,7 @@ 
 
 #include <common.h>
 #include <edid.h>
+#include <linux/fb.h>
 #include <linux/ctype.h>
 #include <linux/string.h>
 
@@ -288,3 +289,32 @@  void edid_print_info(struct edid1_info *edid_info)
 	if (!have_timing)
 		printf("\tNone\n");
 }
+
+void edid_to_fb_videomode(struct edid1_info *edid, struct fb_videomode *mode)
+{
+	struct edid_monitor_descriptor *monitor =
+		&edid->monitor_details.descriptor[0];
+	struct edid_detailed_timing *timing =
+		(struct edid_detailed_timing *)monitor;
+
+	uint32_t pixclock = EDID_DETAILED_TIMING_PIXEL_CLOCK(*timing);
+	uint32_t h_blanking = EDID_DETAILED_TIMING_HORIZONTAL_BLANKING(*timing);
+	uint32_t h_active = EDID_DETAILED_TIMING_HORIZONTAL_ACTIVE(*timing);
+	uint32_t h_sync_offset = EDID_DETAILED_TIMING_HSYNC_OFFSET(*timing);
+	uint32_t h_sync_width = EDID_DETAILED_TIMING_HSYNC_PULSE_WIDTH(*timing);
+	uint32_t v_blanking = EDID_DETAILED_TIMING_VERTICAL_BLANKING(*timing);
+	uint32_t v_active = EDID_DETAILED_TIMING_VERTICAL_ACTIVE(*timing);
+	uint32_t v_sync_offset = EDID_DETAILED_TIMING_VSYNC_OFFSET(*timing);
+	uint32_t v_sync_width = EDID_DETAILED_TIMING_VSYNC_PULSE_WIDTH(*timing);
+
+	mode->name = "EDID";
+	mode->pixclock = KHZ2PICOS(pixclock/1000);
+	mode->yres = v_active;
+	mode->xres = h_active;
+	mode->left_margin = h_blanking - h_sync_offset - h_sync_width;
+	mode->right_margin = h_sync_offset;
+	mode->upper_margin = v_blanking - v_sync_offset - v_sync_width;
+	mode->lower_margin = v_sync_offset;
+	mode->hsync_len = h_sync_width;
+	mode->vsync_len = v_sync_width;
+}
diff --git a/include/edid.h b/include/edid.h
index 480a773..357d6d6 100644
--- a/include/edid.h
+++ b/include/edid.h
@@ -234,6 +234,15 @@  struct edid1_info {
 void edid_print_info(struct edid1_info *edid_info);
 
 /**
+ * Convert EDID info to struct fb_videomode
+ *
+ * @param edid		The EDID info to be converted
+ * @param mode		The destination fb_videomode to be filled
+ */
+struct fb_videomode;
+void edid_to_fb_videomode(struct edid1_info *edid, struct fb_videomode *mode);
+
+/**
  * Check the EDID info.
  *
  * @param info  The EDID info to be checked