Message ID | 20230607233849.239047-1-david.e.box@linux.intel.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | [V2,1/2] platform/x86/intel/pmc: Add resume callback | expand |
On Wed, 7 Jun 2023, 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@linux.intel.com> Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
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@linux.intel.com> > --- > > 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
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);
Add a resume callback to perform platform specific functions during resume from suspend. Signed-off-by: David E. Box <david.e.box@linux.intel.com> --- 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. drivers/platform/x86/intel/pmc/core.c | 14 ++++++++++++-- drivers/platform/x86/intel/pmc/core.h | 3 +++ 2 files changed, 15 insertions(+), 2 deletions(-) base-commit: 86f67fe2db439867f9476c9b78ea3ebd4a06a123