Hi, On 8/12/24 8:41 PM, Marek Maslanka wrote: > Provides the capability to register an external callback for the ACPI PM > timer, which is called during the suspend and resume processes. > > Signed-off-by: Marek Maslanka <mmaslanka@xxxxxxxxxx> Daniel / Thomas I believe this series is ready for merging now, do you want to merge this through the tree for drivers/clocksource ? Or shall I merge this through the platform-drivers-x86 tree ? In case of the latter may I please have your Acked-by for patch 1/2 for ths ? Regards, Hans > > --- > Changes in v6: > - Add the acpi_pmtmr_unregister_suspend_resume_callback function to remove callback > - Add EXPORT_SYMBOL_GPL to the added functions > - Link to v5: https://lore.kernel.org/lkml/20240812043741.3434744-1-mmaslanka@xxxxxxxxxx/ > --- > --- > drivers/clocksource/acpi_pm.c | 32 ++++++++++++++++++++++++++++++++ > include/linux/acpi_pmtmr.h | 13 +++++++++++++ > 2 files changed, 45 insertions(+) > > diff --git a/drivers/clocksource/acpi_pm.c b/drivers/clocksource/acpi_pm.c > index 82338773602ca..b4330a01a566b 100644 > --- a/drivers/clocksource/acpi_pm.c > +++ b/drivers/clocksource/acpi_pm.c > @@ -25,6 +25,10 @@ > #include <asm/io.h> > #include <asm/time.h> > > +static void *suspend_resume_cb_data; > + > +static void (*suspend_resume_callback)(void *data, bool suspend); > + > /* > * The I/O port the PMTMR resides at. > * The location is detected during setup_arch(), > @@ -58,6 +62,32 @@ u32 acpi_pm_read_verified(void) > return v2; > } > > +void acpi_pmtmr_register_suspend_resume_callback(void (*cb)(void *data, bool suspend), void *data) > +{ > + suspend_resume_callback = cb; > + suspend_resume_cb_data = data; > +} > +EXPORT_SYMBOL_GPL(acpi_pmtmr_register_suspend_resume_callback); > + > +void acpi_pmtmr_unregister_suspend_resume_callback(void) > +{ > + suspend_resume_callback = NULL; > + suspend_resume_cb_data = NULL; > +} > +EXPORT_SYMBOL_GPL(acpi_pmtmr_unregister_suspend_resume_callback); > + > +static void acpi_pm_suspend(struct clocksource *cs) > +{ > + if (suspend_resume_callback) > + suspend_resume_callback(suspend_resume_cb_data, true); > +} > + > +static void acpi_pm_resume(struct clocksource *cs) > +{ > + if (suspend_resume_callback) > + suspend_resume_callback(suspend_resume_cb_data, false); > +} > + > static u64 acpi_pm_read(struct clocksource *cs) > { > return (u64)read_pmtmr(); > @@ -69,6 +99,8 @@ static struct clocksource clocksource_acpi_pm = { > .read = acpi_pm_read, > .mask = (u64)ACPI_PM_MASK, > .flags = CLOCK_SOURCE_IS_CONTINUOUS, > + .suspend = acpi_pm_suspend, > + .resume = acpi_pm_resume, > }; > > > diff --git a/include/linux/acpi_pmtmr.h b/include/linux/acpi_pmtmr.h > index 50d88bf1498d7..0ded9220d379c 100644 > --- a/include/linux/acpi_pmtmr.h > +++ b/include/linux/acpi_pmtmr.h > @@ -26,6 +26,19 @@ static inline u32 acpi_pm_read_early(void) > return acpi_pm_read_verified() & ACPI_PM_MASK; > } > > +/** > + * Register callback for suspend and resume event > + * > + * @cb Callback triggered on suspend and resume > + * @data Data passed with the callback > + */ > +void acpi_pmtmr_register_suspend_resume_callback(void (*cb)(void *data, bool suspend), void *data); > + > +/** > + * Remove registered callback for suspend and resume event > + */ > +void acpi_pmtmr_unregister_suspend_resume_callback(void); > + > #else > > static inline u32 acpi_pm_read_early(void)