summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordumbbell <dumbbell@FreeBSD.org>2013-08-25 09:46:03 +0000
committerdumbbell <dumbbell@FreeBSD.org>2013-08-25 09:46:03 +0000
commitee46ac3f404a74d762db72562e591a7095d58f07 (patch)
tree1247c8e3fa92e2ca1a4c80274b5da0cc2aae2b66
parentc4e489b014b9a53522cefa67b971e9126a837315 (diff)
downloadFreeBSD-src-ee46ac3f404a74d762db72562e591a7095d58f07.zip
FreeBSD-src-ee46ac3f404a74d762db72562e591a7095d58f07.tar.gz
drm: Import Linux commit cd004b3f4cd4169815c82bf9e424fda06978898a
Author: Shirish S <s.shirish@samsung.com> Date: Thu Aug 30 07:04:06 2012 +0000 drm: edid: add support for E-DDC The current logic for probing ddc is limited to 2 blocks (256 bytes), this patch adds support for the 4 block (512) data. To do this, a single 8-bit segment index is passed to the display via the I2C address 30h. Data from the selected segment is then immediately read via the regular DDC2 address using a repeated I2C 'START' signal. Signed-off-by: Shirish S <s.shirish@samsung.com> Reviewed-by: Jean Delvare <jdelvare@suse.de> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Ville Syrjala <ville.syrjala@linux.intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--sys/dev/drm2/drm_edid.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/sys/dev/drm2/drm_edid.c b/sys/dev/drm2/drm_edid.c
index 827677d..86306b9 100644
--- a/sys/dev/drm2/drm_edid.c
+++ b/sys/dev/drm2/drm_edid.c
@@ -253,6 +253,8 @@ drm_do_probe_ddc_edid(device_t adapter, unsigned char *buf,
int block, int len)
{
unsigned char start = block * EDID_LENGTH;
+ unsigned char segment = block >> 1;
+ unsigned char xfers = segment ? 3 : 2;
int ret, retries = 5;
/* The core i2c driver will automatically retry the transfer if the
@@ -264,6 +266,11 @@ drm_do_probe_ddc_edid(device_t adapter, unsigned char *buf,
do {
struct iic_msg msgs[] = {
{
+ .slave = DDC_SEGMENT_ADDR << 1,
+ .flags = 0,
+ .len = 1,
+ .buf = &segment,
+ }, {
.slave = DDC_ADDR << 1,
.flags = IIC_M_WR,
.len = 1,
@@ -275,7 +282,13 @@ drm_do_probe_ddc_edid(device_t adapter, unsigned char *buf,
.buf = buf,
}
};
- ret = iicbus_transfer(adapter, msgs, 2);
+
+ /*
+ * Avoid sending the segment addr to not upset non-compliant ddc
+ * monitors.
+ */
+ ret = iicbus_transfer(adapter, &msgs[3 - xfers], xfers);
+
if (ret != 0)
DRM_DEBUG_KMS("iicbus_transfer countdown %d error %d\n",
retries, ret);
OpenPOWER on IntegriCloud