summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAnn Thornton <Ann.Thornton@freescale.com>2009-06-29 16:56:04 -0500
committerJustin Waters <justin.waters@timesys.com>2009-10-13 11:04:20 -0400
commitf5243685ec0dcd6aec33dce9377415b9a699958e (patch)
treecff6219b0f09543e845e9ef27b4cc738e389a02a /drivers
parent0f8b4c0b747e4cf2a103a46b7e9548d29a533b60 (diff)
ENGR00113055-1 Add ability to read and user EDID info
Added the ability to read the EDID information from a VGA or DVI monitor when it is present. Signed-off-by: Ann Thornton <Ann.Thornton@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/mxc/Kconfig1
-rw-r--r--drivers/video/mxc/Makefile3
-rw-r--r--drivers/video/mxc/mxc_edid.c90
3 files changed, 93 insertions, 1 deletions
diff --git a/drivers/video/mxc/Kconfig b/drivers/video/mxc/Kconfig
index 3ad4648c0f03..709cfcfc45f4 100644
--- a/drivers/video/mxc/Kconfig
+++ b/drivers/video/mxc/Kconfig
@@ -4,6 +4,7 @@ config FB_MXC
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
+ select FB_MODE_HELPERS
default y
help
This is a framebuffer device for the MXC LCD Controller.
diff --git a/drivers/video/mxc/Makefile b/drivers/video/mxc/Makefile
index 6b23fd225490..a1bd24b967a5 100644
--- a/drivers/video/mxc/Makefile
+++ b/drivers/video/mxc/Makefile
@@ -18,4 +18,5 @@ obj-$(CONFIG_FB_MXC_EPSON_VGA_SYNC_PANEL) += mxcfb_epson_vga.o
obj-$(CONFIG_FB_MXC_CLAA_WVGA_SYNC_PANEL) += mxcfb_claa_wvga.o
obj-$(CONFIG_FB_MXC_TVOUT_CH7024) += ch7024.o
obj-$(CONFIG_FB_MXC_TVOUT_TVE) += tve.o
-obj-$(CONFIG_FB_MXC_CH7026) += mxcfb_ch7026.o
+obj-$(CONFIG_FB_MXC_CH7026) += mxcfb_ch7026.o
+obj-$(CONFIG_FB_MODE_HELPERS) += mxc_edid.o
diff --git a/drivers/video/mxc/mxc_edid.c b/drivers/video/mxc/mxc_edid.c
new file mode 100644
index 000000000000..a6a87bd86f65
--- /dev/null
+++ b/drivers/video/mxc/mxc_edid.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2009 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @defgroup Framebuffer Framebuffer Driver for SDC and ADC.
+ */
+
+/*!
+ * @file mxc_edid.c
+ *
+ * @brief MXC EDID tools
+ *
+ * @ingroup Framebuffer
+ */
+
+/*!
+ * Include files
+ */
+#include <linux/fb.h>
+
+#define EDID_LENGTH 128
+
+static u8 edid[EDID_LENGTH];
+
+int read_edid(struct i2c_adapter *adp,
+ struct fb_var_screeninfo *einfo,
+ int *dvi)
+{
+ u8 buf0[2] = {0, 0};
+ int dat = 0;
+ u16 addr = 0x50;
+ struct i2c_msg msg[2] = {
+ {
+ .addr = addr,
+ .flags = 0,
+ .len = 1,
+ .buf = buf0,
+ }, {
+ .addr = addr,
+ .flags = I2C_M_RD,
+ .len = EDID_LENGTH,
+ .buf = edid,
+ },
+ };
+
+ if (adp == NULL || einfo == NULL)
+ return -EINVAL;
+
+ buf0[0] = 0x00;
+ memset(&edid, 0, sizeof(edid));
+ memset(einfo, 0, sizeof(struct fb_var_screeninfo));
+ dat = i2c_transfer(adp, msg, 2);
+
+ /* If 0x50 fails, try 0x37. */
+ if (edid[1] == 0x00) {
+ msg[0].addr = msg[1].addr = 0x37;
+ dat = i2c_transfer(adp, msg, 2);
+ }
+
+ if (edid[1] == 0x00)
+ return -ENOENT;
+
+ *dvi = 0;
+ if ((edid[20] == 0x80) || (edid[20] == 0x88) || (edid[20] == 0))
+ *dvi = 1;
+
+ dat = fb_parse_edid(edid, einfo);
+ if (dat)
+ return -dat;
+
+ /* This is valid for version 1.3 of the EDID */
+ if ((edid[18] == 1) && (edid[19] == 3)) {
+ einfo->height = edid[21] * 10;
+ einfo->width = edid[22] * 10;
+ }
+
+ return 0;
+}
+
+