diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/atombios_i2c.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/atombios_i2c.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 5 |
3 files changed, 22 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_i2c.c b/drivers/gpu/drm/amd/amdgpu/atombios_i2c.c index 13cdb01e9b45..bc56c8a181e6 100644 --- a/drivers/gpu/drm/amd/amdgpu/atombios_i2c.c +++ b/drivers/gpu/drm/amd/amdgpu/atombios_i2c.c | |||
@@ -156,3 +156,18 @@ u32 amdgpu_atombios_i2c_func(struct i2c_adapter *adap) | |||
156 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | 156 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; |
157 | } | 157 | } |
158 | 158 | ||
159 | void amdgpu_atombios_i2c_channel_trans(struct amdgpu_device* adev, u8 slave_addr, u8 line_number, u8 offset, u8 data) | ||
160 | { | ||
161 | PROCESS_I2C_CHANNEL_TRANSACTION_PS_ALLOCATION args; | ||
162 | int index = GetIndexIntoMasterTable(COMMAND, ProcessI2cChannelTransaction); | ||
163 | |||
164 | args.ucRegIndex = offset; | ||
165 | args.lpI2CDataOut = data; | ||
166 | args.ucFlag = 1; | ||
167 | args.ucI2CSpeed = TARGET_HW_I2C_CLOCK; | ||
168 | args.ucTransBytes = 1; | ||
169 | args.ucSlaveAddr = slave_addr; | ||
170 | args.ucLineNumber = line_number; | ||
171 | |||
172 | amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args); | ||
173 | } | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_i2c.h b/drivers/gpu/drm/amd/amdgpu/atombios_i2c.h index d6128d9de56e..251aaf41f65d 100644 --- a/drivers/gpu/drm/amd/amdgpu/atombios_i2c.h +++ b/drivers/gpu/drm/amd/amdgpu/atombios_i2c.h | |||
@@ -27,5 +27,7 @@ | |||
27 | int amdgpu_atombios_i2c_xfer(struct i2c_adapter *i2c_adap, | 27 | int amdgpu_atombios_i2c_xfer(struct i2c_adapter *i2c_adap, |
28 | struct i2c_msg *msgs, int num); | 28 | struct i2c_msg *msgs, int num); |
29 | u32 amdgpu_atombios_i2c_func(struct i2c_adapter *adap); | 29 | u32 amdgpu_atombios_i2c_func(struct i2c_adapter *adap); |
30 | void amdgpu_atombios_i2c_channel_trans(struct amdgpu_device* adev, | ||
31 | u8 slave_addr, u8 line_number, u8 offset, u8 data); | ||
30 | 32 | ||
31 | #endif | 33 | #endif |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 42e303151e61..c2ef94511f70 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include "vid.h" | 28 | #include "vid.h" |
29 | #include "amdgpu_ucode.h" | 29 | #include "amdgpu_ucode.h" |
30 | #include "amdgpu_atombios.h" | 30 | #include "amdgpu_atombios.h" |
31 | #include "atombios_i2c.h" | ||
31 | #include "clearstate_vi.h" | 32 | #include "clearstate_vi.h" |
32 | 33 | ||
33 | #include "gmc/gmc_8_2_d.h" | 34 | #include "gmc/gmc_8_2_d.h" |
@@ -698,6 +699,10 @@ static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev) | |||
698 | polaris10_golden_common_all, | 699 | polaris10_golden_common_all, |
699 | (const u32)ARRAY_SIZE(polaris10_golden_common_all)); | 700 | (const u32)ARRAY_SIZE(polaris10_golden_common_all)); |
700 | WREG32_SMC(ixCG_ACLK_CNTL, 0x0000001C); | 701 | WREG32_SMC(ixCG_ACLK_CNTL, 0x0000001C); |
702 | if (adev->pdev->revision == 0xc7) { | ||
703 | amdgpu_atombios_i2c_channel_trans(adev, 0x10, 0x96, 0x1E, 0xDD); | ||
704 | amdgpu_atombios_i2c_channel_trans(adev, 0x10, 0x96, 0x1F, 0xD0); | ||
705 | } | ||
701 | break; | 706 | break; |
702 | case CHIP_CARRIZO: | 707 | case CHIP_CARRIZO: |
703 | amdgpu_program_register_sequence(adev, | 708 | amdgpu_program_register_sequence(adev, |