Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _LINUX_ALARMTIMER_H
0003 #define _LINUX_ALARMTIMER_H
0004 
0005 #include <linux/time.h>
0006 #include <linux/hrtimer.h>
0007 #include <linux/timerqueue.h>
0008 
0009 struct rtc_device;
0010 
0011 enum alarmtimer_type {
0012     ALARM_REALTIME,
0013     ALARM_BOOTTIME,
0014 
0015     /* Supported types end here */
0016     ALARM_NUMTYPE,
0017 
0018     /* Used for tracing information. No usable types. */
0019     ALARM_REALTIME_FREEZER,
0020     ALARM_BOOTTIME_FREEZER,
0021 };
0022 
0023 enum alarmtimer_restart {
0024     ALARMTIMER_NORESTART,
0025     ALARMTIMER_RESTART,
0026 };
0027 
0028 
0029 #define ALARMTIMER_STATE_INACTIVE   0x00
0030 #define ALARMTIMER_STATE_ENQUEUED   0x01
0031 
0032 /**
0033  * struct alarm - Alarm timer structure
0034  * @node:   timerqueue node for adding to the event list this value
0035  *      also includes the expiration time.
0036  * @timer:  hrtimer used to schedule events while running
0037  * @function:   Function pointer to be executed when the timer fires.
0038  * @type:   Alarm type (BOOTTIME/REALTIME).
0039  * @state:  Flag that represents if the alarm is set to fire or not.
0040  * @data:   Internal data value.
0041  */
0042 struct alarm {
0043     struct timerqueue_node  node;
0044     struct hrtimer      timer;
0045     enum alarmtimer_restart (*function)(struct alarm *, ktime_t now);
0046     enum alarmtimer_type    type;
0047     int         state;
0048     void            *data;
0049 };
0050 
0051 void alarm_init(struct alarm *alarm, enum alarmtimer_type type,
0052         enum alarmtimer_restart (*function)(struct alarm *, ktime_t));
0053 void alarm_start(struct alarm *alarm, ktime_t start);
0054 void alarm_start_relative(struct alarm *alarm, ktime_t start);
0055 void alarm_restart(struct alarm *alarm);
0056 int alarm_try_to_cancel(struct alarm *alarm);
0057 int alarm_cancel(struct alarm *alarm);
0058 
0059 u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval);
0060 u64 alarm_forward_now(struct alarm *alarm, ktime_t interval);
0061 ktime_t alarm_expires_remaining(const struct alarm *alarm);
0062 
0063 #ifdef CONFIG_RTC_CLASS
0064 /* Provide way to access the rtc device being used by alarmtimers */
0065 struct rtc_device *alarmtimer_get_rtcdev(void);
0066 #else
0067 static inline struct rtc_device *alarmtimer_get_rtcdev(void) { return NULL; }
0068 #endif
0069 
0070 #endif