To avoid possible memory leak.
Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
                return ret;
        }
 
+       smu_fini_microcode(smu);
+
        return 0;
 }
 
 
        .get_unique_id = arcturus_get_unique_id,
        .init_microcode = smu_v11_0_init_microcode,
        .load_microcode = smu_v11_0_load_microcode,
+       .fini_microcode = smu_v11_0_fini_microcode,
        .init_smc_tables = smu_v11_0_init_smc_tables,
        .fini_smc_tables = smu_v11_0_fini_smc_tables,
        .init_power = smu_v11_0_init_power,
 
        int (*get_dpm_clock_table)(struct smu_context *smu, struct dpm_clocks *clock_table);
        int (*init_microcode)(struct smu_context *smu);
        int (*load_microcode)(struct smu_context *smu);
+       void (*fini_microcode)(struct smu_context *smu);
        int (*init_smc_tables)(struct smu_context *smu);
        int (*fini_smc_tables)(struct smu_context *smu);
        int (*init_power)(struct smu_context *smu);
 
 
 int smu_v11_0_init_microcode(struct smu_context *smu);
 
+void smu_v11_0_fini_microcode(struct smu_context *smu);
+
 int smu_v11_0_load_microcode(struct smu_context *smu);
 
 int smu_v11_0_init_smc_tables(struct smu_context *smu);
 
        .update_pcie_parameters = navi10_update_pcie_parameters,
        .init_microcode = smu_v11_0_init_microcode,
        .load_microcode = smu_v11_0_load_microcode,
+       .fini_microcode = smu_v11_0_fini_microcode,
        .init_smc_tables = smu_v11_0_init_smc_tables,
        .fini_smc_tables = smu_v11_0_fini_smc_tables,
        .init_power = smu_v11_0_init_power,
 
 
 #define smu_init_microcode(smu) \
        ((smu)->ppt_funcs->init_microcode ? (smu)->ppt_funcs->init_microcode((smu)) : 0)
+#define smu_fini_microcode(smu) \
+       ((smu)->ppt_funcs->fini_microcode ? (smu)->ppt_funcs->fini_microcode((smu)) : 0)
 #define smu_init_smc_tables(smu) \
        ((smu)->ppt_funcs->init_smc_tables ? (smu)->ppt_funcs->init_smc_tables((smu)) : 0)
 #define smu_fini_smc_tables(smu) \
 
        return err;
 }
 
+void smu_v11_0_fini_microcode(struct smu_context *smu)
+{
+       struct amdgpu_device *adev = smu->adev;
+
+       release_firmware(adev->pm.fw);
+       adev->pm.fw = NULL;
+       adev->pm.fw_version = 0;
+}
+
 int smu_v11_0_load_microcode(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;