25
25
#include <asm/io.h>
26
26
#include <asm/time.h>
27
27
28
+ static void * suspend_resume_cb_data ;
29
+
30
+ static void (* suspend_resume_callback )(void * data , bool suspend );
31
+
28
32
/*
29
33
* The I/O port the PMTMR resides at.
30
34
* The location is detected during setup_arch(),
@@ -58,6 +62,32 @@ u32 acpi_pm_read_verified(void)
58
62
return v2 ;
59
63
}
60
64
65
+ void acpi_pmtmr_register_suspend_resume_callback (void (* cb )(void * data , bool suspend ), void * data )
66
+ {
67
+ suspend_resume_callback = cb ;
68
+ suspend_resume_cb_data = data ;
69
+ }
70
+ EXPORT_SYMBOL_GPL (acpi_pmtmr_register_suspend_resume_callback );
71
+
72
+ void acpi_pmtmr_unregister_suspend_resume_callback (void )
73
+ {
74
+ suspend_resume_callback = NULL ;
75
+ suspend_resume_cb_data = NULL ;
76
+ }
77
+ EXPORT_SYMBOL_GPL (acpi_pmtmr_unregister_suspend_resume_callback );
78
+
79
+ static void acpi_pm_suspend (struct clocksource * cs )
80
+ {
81
+ if (suspend_resume_callback )
82
+ suspend_resume_callback (suspend_resume_cb_data , true);
83
+ }
84
+
85
+ static void acpi_pm_resume (struct clocksource * cs )
86
+ {
87
+ if (suspend_resume_callback )
88
+ suspend_resume_callback (suspend_resume_cb_data , false);
89
+ }
90
+
61
91
static u64 acpi_pm_read (struct clocksource * cs )
62
92
{
63
93
return (u64 )read_pmtmr ();
@@ -69,6 +99,8 @@ static struct clocksource clocksource_acpi_pm = {
69
99
.read = acpi_pm_read ,
70
100
.mask = (u64 )ACPI_PM_MASK ,
71
101
.flags = CLOCK_SOURCE_IS_CONTINUOUS ,
102
+ .suspend = acpi_pm_suspend ,
103
+ .resume = acpi_pm_resume ,
72
104
};
73
105
74
106
0 commit comments