summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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