Hi, On 6/8/23 01:38, David E. Box wrote: > Add a resume callback to perform platform specific functions during resume > from suspend. > > Signed-off-by: David E. Box <david.e.box@xxxxxxxxxxxxxxx> > --- > > V2 - Change resume_fixup to just resume and use it a a replacement for > the regular resume flow (now called pmc_core_resume_common) if it > exist. Suggested by Ilpo. Thank you for your patch-series, I've applied the series to my review-hans branch: https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans Note it will show up in my review-hans branch once I've pushed my local branch there, which might take a while. Once I've run some tests on this branch the patches there will be added to the platform-drivers-x86/for-next branch and eventually will be included in the pdx86 pull-request to Linus for the next merge-window. Regards, Hans > drivers/platform/x86/intel/pmc/core.c | 14 ++++++++++++-- > drivers/platform/x86/intel/pmc/core.h | 3 +++ > 2 files changed, 15 insertions(+), 2 deletions(-) > > diff --git a/drivers/platform/x86/intel/pmc/core.c b/drivers/platform/x86/intel/pmc/core.c > index da6e7206d38b..bb2f11251f73 100644 > --- a/drivers/platform/x86/intel/pmc/core.c > +++ b/drivers/platform/x86/intel/pmc/core.c > @@ -1223,11 +1223,11 @@ static inline bool pmc_core_is_s0ix_failed(struct pmc_dev *pmcdev) > return false; > } > > -static __maybe_unused int pmc_core_resume(struct device *dev) > +int pmc_core_resume_common(struct pmc_dev *pmcdev) > { > - struct pmc_dev *pmcdev = dev_get_drvdata(dev); > const struct pmc_bit_map **maps = pmcdev->map->lpm_sts; > int offset = pmcdev->map->lpm_status_offset; > + struct device *dev = &pmcdev->pdev->dev; > > /* Check if the syspend used S0ix */ > if (pm_suspend_via_firmware()) > @@ -1257,6 +1257,16 @@ static __maybe_unused int pmc_core_resume(struct device *dev) > return 0; > } > > +static __maybe_unused int pmc_core_resume(struct device *dev) > +{ > + struct pmc_dev *pmcdev = dev_get_drvdata(dev); > + > + if (pmcdev->resume) > + return pmcdev->resume(pmcdev); > + > + return pmc_core_resume_common(pmcdev); > +} > + > static const struct dev_pm_ops pmc_core_pm_ops = { > SET_LATE_SYSTEM_SLEEP_PM_OPS(pmc_core_suspend, pmc_core_resume) > }; > diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h > index 9ca9b9746719..7c95586e742b 100644 > --- a/drivers/platform/x86/intel/pmc/core.h > +++ b/drivers/platform/x86/intel/pmc/core.h > @@ -327,6 +327,7 @@ struct pmc_reg_map { > * @lpm_en_modes: Array of enabled modes from lowest to highest priority > * @lpm_req_regs: List of substate requirements > * @core_configure: Function pointer to configure the platform > + * @resume: Function to perform platform specific resume > * > * pmc_dev contains info about power management controller device. > */ > @@ -345,6 +346,7 @@ struct pmc_dev { > int lpm_en_modes[LPM_MAX_NUM_MODES]; > u32 *lpm_req_regs; > void (*core_configure)(struct pmc_dev *pmcdev); > + int (*resume)(struct pmc_dev *pmcdev); > }; > > extern const struct pmc_bit_map msr_map[]; > @@ -398,6 +400,7 @@ extern const struct pmc_reg_map mtl_reg_map; > extern void pmc_core_get_tgl_lpm_reqs(struct platform_device *pdev); > extern int pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value); > > +int pmc_core_resume_common(struct pmc_dev *pmcdev); > void spt_core_init(struct pmc_dev *pmcdev); > void cnp_core_init(struct pmc_dev *pmcdev); > void icl_core_init(struct pmc_dev *pmcdev); > > base-commit: 86f67fe2db439867f9476c9b78ea3ebd4a06a123