]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amd/pm: Use devm_i2c_add_adapter() in the V13 smu
authorRodrigo Siqueira <siqueira@igalia.com>
Wed, 10 Sep 2025 17:39:41 +0000 (11:39 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 16 Sep 2025 21:47:38 +0000 (17:47 -0400)
The I2C init for SMU_V13 uses i2c_add_adapter() and i2c_del_adapter(),
this commit replaces the use of these two functions with
devm_i2c_add_adapter(). Notice that SMU_V13 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>
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c

index e084ed99ec0e913934674ccb55f0345b003a74b1..c1062e5f03936777fc83d0f44519c195e9d7bb4e 100644 (file)
@@ -2825,10 +2825,10 @@ static int smu_v13_0_0_i2c_control_init(struct smu_context *smu)
                control->quirks = &smu_v13_0_0_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;
                }
        }
 
@@ -2838,27 +2838,12 @@ static int smu_v13_0_0_i2c_control_init(struct smu_context *smu)
        adev->pm.fru_eeprom_i2c_bus = &adev->pm.smu_i2c[0].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 smu_v13_0_0_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;
 }