diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index d15fa5e..a039468 100644 --- a/drivers/gpu/drm/radeon/radeon_i2c.c +++ b/drivers/gpu/drm/radeon/radeon_i2c.c @@ -399,6 +399,18 @@ static int r100_hw_i2c_xfer(struct i2c_adapter *i2c_adap, goto done; break; } + + WREG32(i2c_cntl_0, RADEON_SW_WANTS_TO_USE_DVI_I2C); + for (i = 0; i < 50; i++) { + udelay(1); + if (RREG32(i2c_cntl_0) & RADEON_SW_CAN_USE_DVI_I2C) + break; + } + if (i == 50) { + DRM_ERROR("failed to get i2c bus\n"); + ret = -EBUSY; + goto done; + } } /* check for bus probe */ @@ -502,6 +514,9 @@ done: RADEON_I2C_HALT | RADEON_I2C_SOFT_RST)); + if (!rec->mm_i2c) + WREG32(i2c_cntl_0, RADEON_SW_DONE_USING_DVI_I2C); + if (rdev->is_atom_bios) { tmp = RREG32(RADEON_BIOS_6_SCRATCH); tmp &= ~ATOM_S6_HW_I2C_BUSY_STATE;