]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86:intel/pmc: Move error handling to init function
authorXi Pardee <xi.pardee@linux.intel.com>
Fri, 25 Apr 2025 19:52:32 +0000 (12:52 -0700)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 8 May 2025 13:03:43 +0000 (16:03 +0300)
Move error handling code to generic_core_init() function. The previous
implementation is that init function called for "full cleanup" function
when error occurs which is error prone. The init function should handle
the error path itself to improve code maintainability.

Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
Link: https://lore.kernel.org/r/20250425195237.493129-5-xi.pardee@linux.intel.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/intel/pmc/core.c

index db3fccca06fb76959340117b30a90a1f14c94535..93a335b0ea633c04ceae2899f103de0dc4131d6d 100644 (file)
@@ -1583,10 +1583,26 @@ int generic_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
        if (pmc_dev_info->dmu_guid)
                pmc_core_punit_pmt_init(pmcdev, pmc_dev_info->dmu_guid);
 
-       if (ssram)
-               return pmc_core_ssram_get_lpm_reqs(pmcdev, pmc_dev_info->pci_func);
+       if (ssram) {
+               ret = pmc_core_ssram_get_lpm_reqs(pmcdev, pmc_dev_info->pci_func);
+               if (ret)
+                       goto unmap_regbase;
+       }
 
        return 0;
+
+unmap_regbase:
+       for (unsigned int i = 0; i < ARRAY_SIZE(pmcdev->pmcs); ++i) {
+               struct pmc *pmc = pmcdev->pmcs[i];
+
+               if (pmc && pmc->regbase)
+                       iounmap(pmc->regbase);
+       }
+
+       if (pmcdev->punit_ep)
+               pmt_telem_unregister_endpoint(pmcdev->punit_ep);
+
+       return ret;
 }
 
 static const struct x86_cpu_id intel_pmc_core_ids[] = {
@@ -1735,7 +1751,7 @@ static int pmc_core_probe(struct platform_device *pdev)
                ret = generic_core_init(pmcdev, pmc_dev_info);
 
        if (ret) {
-               pmc_core_clean_structure(pdev);
+               platform_set_drvdata(pdev, NULL);
                return ret;
        }