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
This commit is contained in:
parent
9b6b2f8608
commit
cbc596d6bf
@ -658,6 +658,11 @@ hdmi_edid_read(struct dwc_hdmi_softc *sc, int block, uint8_t **edid,
|
|||||||
int result;
|
int result;
|
||||||
uint8_t addr = block & 1 ? EDID_LENGTH : 0;
|
uint8_t addr = block & 1 ? EDID_LENGTH : 0;
|
||||||
uint8_t segment = block >> 1;
|
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[] = {
|
struct iic_msg msg[] = {
|
||||||
{ I2C_DDC_SEGADDR, IIC_M_WR, 1, &segment },
|
{ I2C_DDC_SEGADDR, IIC_M_WR, 1, &segment },
|
||||||
{ I2C_DDC_ADDR, IIC_M_WR, 1, &addr },
|
{ 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);
|
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);
|
iicbus_release_bus(i2c_dev, sc->sc_dev);
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user