mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 15:07:13 -04:00
drm/amd/pm: Use devm_i2c_add_adapter() in the Navi10 smu
The I2C init for Navi10 uses i2c_add_adapter() and i2c_del_adapter(), this commit replaces the use of these two functions with devm_i2c_add_adapter(). Notice that Navi10 init initializes multiple I2C buses in a loop; if something goes wrong, the previous adapters are removed, and the amdgpu load is interrupted. Since I2C init is required for the correct load of amdgpu, it is safe to rely on devm_i2c_add_adapter() to handle any previously initialized I2C adapter. Signed-off-by: Rodrigo Siqueira <siqueira@igalia.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
439158c475
commit
9058cb7775
@@ -3145,10 +3145,10 @@ static int navi10_i2c_control_init(struct smu_context *smu)
|
||||
control->quirks = &navi10_i2c_control_quirks;
|
||||
i2c_set_adapdata(control, smu_i2c);
|
||||
|
||||
res = i2c_add_adapter(control);
|
||||
res = devm_i2c_add_adapter(adev->dev, control);
|
||||
if (res) {
|
||||
DRM_ERROR("Failed to register hw i2c, err: %d\n", res);
|
||||
goto Out_err;
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3156,27 +3156,12 @@ static int navi10_i2c_control_init(struct smu_context *smu)
|
||||
adev->pm.fru_eeprom_i2c_bus = &adev->pm.smu_i2c[1].adapter;
|
||||
|
||||
return 0;
|
||||
Out_err:
|
||||
for ( ; i >= 0; i--) {
|
||||
struct amdgpu_smu_i2c_bus *smu_i2c = &adev->pm.smu_i2c[i];
|
||||
struct i2c_adapter *control = &smu_i2c->adapter;
|
||||
|
||||
i2c_del_adapter(control);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static void navi10_i2c_control_fini(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_SMU_I2C_BUSES; i++) {
|
||||
struct amdgpu_smu_i2c_bus *smu_i2c = &adev->pm.smu_i2c[i];
|
||||
struct i2c_adapter *control = &smu_i2c->adapter;
|
||||
|
||||
i2c_del_adapter(control);
|
||||
}
|
||||
adev->pm.ras_eeprom_i2c_bus = NULL;
|
||||
adev->pm.fru_eeprom_i2c_bus = NULL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user