From cbc596d6bfeefe8339ad7c90a5e6c9fb920e5bcc Mon Sep 17 00:00:00 2001 From: Oleksandr Tymoshenko Date: Wed, 10 Jun 2020 21:38:35 +0000 Subject: [PATCH] Fix reading EDID on TVs/monitors without E-DCC support Writing segment id to I2C device 0x30 only required if the segment is non-zero. On the devices without E-DCC support writing to that address fails and whole transaction then fails too. To avoid this do not attempt write to the segment selection device unless required. MFC after: 2 weeks --- sys/dev/hdmi/dwc_hdmi.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sys/dev/hdmi/dwc_hdmi.c b/sys/dev/hdmi/dwc_hdmi.c index b4fd5261019e..0f1388874292 100644 --- a/sys/dev/hdmi/dwc_hdmi.c +++ b/sys/dev/hdmi/dwc_hdmi.c @@ -658,6 +658,11 @@ hdmi_edid_read(struct dwc_hdmi_softc *sc, int block, uint8_t **edid, int result; uint8_t addr = block & 1 ? EDID_LENGTH : 0; uint8_t segment = block >> 1; + /* + * Some devices do not support E-DDC so attempt + * writing segment address only if it's neccessary + */ + unsigned char xfers = segment ? 3 : 2; struct iic_msg msg[] = { { I2C_DDC_SEGADDR, IIC_M_WR, 1, &segment }, { I2C_DDC_ADDR, IIC_M_WR, 1, &addr }, @@ -687,7 +692,7 @@ hdmi_edid_read(struct dwc_hdmi_softc *sc, int block, uint8_t **edid, return (result); } - result = iicbus_transfer(i2c_dev, msg, 3); + result = iicbus_transfer(i2c_dev, &msg[3 - xfers], xfers); iicbus_release_bus(i2c_dev, sc->sc_dev); if (result) {