In order to setup a table of low power mode requirements for Meteor Lake,
pmc_core_get_low_power_modes() will need to be run from platform init code
so that the enabled modes are known, allowing the use of the
pmc_for_each_mode helper. Make the function global and call it from the
platform init code.
Signed-off-by: Xi Pardee <xi.pardee@intel.com>
Signed-off-by: David E. Box <david.e.box@linux.intel.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20231129222132.2331261-12-david.e.box@linux.intel.com
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
 
        if (ret)
                return ret;
 
+       pmc_core_get_low_power_modes(pmcdev);
+
        /* Due to a hardware limitation, the GBE LTR blocks PC10
         * when a cable is attached. Tell the PMC to ignore it.
         */
 
        if (ret)
                return ret;
 
+       pmc_core_get_low_power_modes(pmcdev);
+
        /* Due to a hardware limitation, the GBE LTR blocks PC10
         * when a cable is attached. Tell the PMC to ignore it.
         */
 
        return true;
 }
 
-static void pmc_core_get_low_power_modes(struct platform_device *pdev)
+void pmc_core_get_low_power_modes(struct pmc_dev *pmcdev)
 {
-       struct pmc_dev *pmcdev = platform_get_drvdata(pdev);
        struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
        u8 pri_order[LPM_MAX_NUM_MODES] = LPM_DEFAULT_PRI;
        u8 mode_order[LPM_MAX_NUM_MODES];
                for (mode = 0; mode < LPM_MAX_NUM_MODES; mode++)
                        pri_order[mode_order[mode]] = mode;
        else
-               dev_warn(&pdev->dev, "Assuming a default substate order for this platform\n");
+               dev_warn(&pmcdev->pdev->dev,
+                        "Assuming a default substate order for this platform\n");
 
        /*
         * Loop through all modes from lowest to highest priority,
        }
 
        pmcdev->pmc_xram_read_bit = pmc_core_check_read_lock_bit(primary_pmc);
-       pmc_core_get_low_power_modes(pdev);
        pmc_core_do_dmi_quirks(primary_pmc);
 
        pmc_core_dbgfs_register(pmcdev);
 
 
 int pmc_core_resume_common(struct pmc_dev *pmcdev);
 int get_primary_reg_base(struct pmc *pmc);
+extern void pmc_core_get_low_power_modes(struct pmc_dev *pmcdev);
 
 extern void pmc_core_ssram_init(struct pmc_dev *pmcdev);
 
 
 int icl_core_init(struct pmc_dev *pmcdev)
 {
        struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
+       int ret;
 
        pmc->map = &icl_reg_map;
-       return get_primary_reg_base(pmc);
+
+       ret = get_primary_reg_base(pmc);
+       if (ret)
+               return ret;
+
+       pmc_core_get_low_power_modes(pmcdev);
+
+       return ret;
 }
 
 int mtl_core_init(struct pmc_dev *pmcdev)
 {
        struct pmc *pmc = pmcdev->pmcs[PMC_IDX_SOC];
-       int ret = 0;
+       int ret;
 
        mtl_d3_fixup();
 
                        return ret;
        }
 
+       pmc_core_get_low_power_modes(pmcdev);
+
        /* Due to a hardware limitation, the GBE LTR blocks PC10
         * when a cable is attached. Tell the PMC to ignore it.
         */
 
 int spt_core_init(struct pmc_dev *pmcdev)
 {
        struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
+       int ret;
 
        pmc->map = &spt_reg_map;
-       return get_primary_reg_base(pmc);
+
+       ret = get_primary_reg_base(pmc);
+       if (ret)
+               return ret;
+
+       pmc_core_get_low_power_modes(pmcdev);
+
+       return ret;
 }
 
        if (ret)
                return ret;
 
+       pmc_core_get_low_power_modes(pmcdev);
        pmc_core_get_tgl_lpm_reqs(pmcdev->pdev);
        /* Due to a hardware limitation, the GBE LTR blocks PC10
         * when a cable is attached. Tell the PMC to ignore it.