Commit 56bd72e9 authored by Marek Maslanka's avatar Marek Maslanka Committed by Daniel Lezcano
Browse files

clocksource: acpi_pm: Add external callback for suspend/resume



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: default avatarMarek Maslanka <mmaslanka@google.com>
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20240812184150.1079924-1-mmaslanka@google.com


Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
parent a7456d7d
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -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,
};


+13 −0
Original line number Diff line number Diff line
@@ -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)