2007-02-16 12:28:02 +03:00
/*
* tick internal variable and functions used by low / high res code
*/
2011-01-27 18:00:32 +03:00
# include <linux/hrtimer.h>
# include <linux/tick.h>
2008-09-22 20:46:37 +04:00
2014-07-17 01:04:02 +04:00
# include "timekeeping.h"
2013-02-22 02:51:36 +04:00
extern seqlock_t jiffies_lock ;
2013-05-28 11:28:02 +04:00
# define CS_NAME_LEN 32
2011-02-01 11:34:58 +03:00
# ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD
2008-09-22 20:46:37 +04:00
# define TICK_DO_TIMER_NONE -1
# define TICK_DO_TIMER_BOOT -2
2007-02-16 12:28:02 +03:00
DECLARE_PER_CPU ( struct tick_device , tick_cpu_device ) ;
extern ktime_t tick_next_period ;
extern ktime_t tick_period ;
2007-05-08 11:30:03 +04:00
extern int tick_do_timer_cpu __read_mostly ;
2007-02-16 12:28:02 +03:00
extern void tick_setup_periodic ( struct clock_event_device * dev , int broadcast ) ;
extern void tick_handle_periodic ( struct clock_event_device * dev ) ;
2013-04-26 00:31:47 +04:00
extern void tick_check_new_device ( struct clock_event_device * dev ) ;
2013-04-26 00:31:48 +04:00
extern void tick_handover_do_timer ( int * cpup ) ;
extern void tick_shutdown ( unsigned int * cpup ) ;
extern void tick_suspend ( void ) ;
extern void tick_resume ( void ) ;
2013-04-26 00:31:50 +04:00
extern bool tick_check_replacement ( struct clock_event_device * curdev ,
struct clock_event_device * newdev ) ;
extern void tick_install_replacement ( struct clock_event_device * dev ) ;
2007-02-16 12:28:02 +03:00
2008-09-16 22:32:50 +04:00
extern void clockevents_shutdown ( struct clock_event_device * dev ) ;
2013-10-11 21:11:55 +04:00
extern ssize_t sysfs_get_uname ( const char * buf , char * dst , size_t cnt ) ;
2013-04-26 00:31:50 +04:00
2007-02-16 12:28:03 +03:00
/*
* NO_HZ / high resolution timer shared code
*/
# ifdef CONFIG_TICK_ONESHOT
extern void tick_setup_oneshot ( struct clock_event_device * newdev ,
void ( * handler ) ( struct clock_event_device * ) ,
ktime_t nextevt ) ;
extern int tick_program_event ( ktime_t expires , int force ) ;
extern void tick_oneshot_notify ( void ) ;
extern int tick_switch_to_oneshot ( void ( * handler ) ( struct clock_event_device * ) ) ;
2007-03-17 02:25:52 +03:00
extern void tick_resume_oneshot ( void ) ;
2007-02-16 12:28:03 +03:00
# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
extern void tick_broadcast_setup_oneshot ( struct clock_event_device * bc ) ;
2014-02-07 12:06:06 +04:00
extern int tick_broadcast_oneshot_control ( unsigned long reason ) ;
2007-02-16 12:28:03 +03:00
extern void tick_broadcast_switch_to_oneshot ( void ) ;
extern void tick_shutdown_broadcast_oneshot ( unsigned int * cpup ) ;
2007-03-17 02:25:52 +03:00
extern int tick_resume_broadcast_oneshot ( struct clock_event_device * bc ) ;
2008-09-22 21:04:02 +04:00
extern int tick_broadcast_oneshot_active ( void ) ;
2013-08-08 00:28:01 +04:00
extern void tick_check_oneshot_broadcast_this_cpu ( void ) ;
2011-02-26 00:34:23 +03:00
bool tick_broadcast_oneshot_available ( void ) ;
2007-02-16 12:28:03 +03:00
# else /* BROADCAST */
static inline void tick_broadcast_setup_oneshot ( struct clock_event_device * bc )
{
BUG ( ) ;
}
2014-02-07 12:06:06 +04:00
static inline int tick_broadcast_oneshot_control ( unsigned long reason ) { return 0 ; }
2007-02-16 12:28:03 +03:00
static inline void tick_broadcast_switch_to_oneshot ( void ) { }
static inline void tick_shutdown_broadcast_oneshot ( unsigned int * cpup ) { }
2008-09-22 21:04:02 +04:00
static inline int tick_broadcast_oneshot_active ( void ) { return 0 ; }
2013-08-08 00:28:01 +04:00
static inline void tick_check_oneshot_broadcast_this_cpu ( void ) { }
2011-02-26 00:34:23 +03:00
static inline bool tick_broadcast_oneshot_available ( void ) { return true ; }
2007-02-16 12:28:03 +03:00
# endif /* !BROADCAST */
# else /* !ONESHOT */
static inline
void tick_setup_oneshot ( struct clock_event_device * newdev ,
void ( * handler ) ( struct clock_event_device * ) ,
ktime_t nextevt )
{
BUG ( ) ;
}
2007-03-17 02:25:52 +03:00
static inline void tick_resume_oneshot ( void )
{
BUG ( ) ;
}
2007-02-16 12:28:03 +03:00
static inline int tick_program_event ( ktime_t expires , int force )
{
return 0 ;
}
static inline void tick_oneshot_notify ( void ) { }
static inline void tick_broadcast_setup_oneshot ( struct clock_event_device * bc )
{
BUG ( ) ;
}
2014-02-07 12:06:06 +04:00
static inline int tick_broadcast_oneshot_control ( unsigned long reason ) { return 0 ; }
2007-02-16 12:28:03 +03:00
static inline void tick_shutdown_broadcast_oneshot ( unsigned int * cpup ) { }
2007-03-17 02:25:52 +03:00
static inline int tick_resume_broadcast_oneshot ( struct clock_event_device * bc )
{
return 0 ;
}
2008-09-23 15:00:57 +04:00
static inline int tick_broadcast_oneshot_active ( void ) { return 0 ; }
2011-02-26 00:34:23 +03:00
static inline bool tick_broadcast_oneshot_available ( void ) { return false ; }
2007-02-16 12:28:03 +03:00
# endif /* !TICK_ONESHOT */
2014-08-16 19:47:18 +04:00
/* NO_HZ_FULL internal */
# ifdef CONFIG_NO_HZ_FULL
extern void tick_nohz_init ( void ) ;
# else
static inline void tick_nohz_init ( void ) { }
# endif
2007-02-16 12:28:02 +03:00
/*
* Broadcasting support
*/
# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
extern int tick_device_uses_broadcast ( struct clock_event_device * dev , int cpu ) ;
2013-04-26 00:31:47 +04:00
extern void tick_install_broadcast_device ( struct clock_event_device * dev ) ;
2007-02-16 12:28:02 +03:00
extern int tick_is_broadcast_device ( struct clock_event_device * dev ) ;
extern void tick_broadcast_on_off ( unsigned long reason , int * oncpu ) ;
extern void tick_shutdown_broadcast ( unsigned int * cpup ) ;
2007-03-06 10:25:42 +03:00
extern void tick_suspend_broadcast ( void ) ;
extern int tick_resume_broadcast ( void ) ;
2013-03-05 17:25:32 +04:00
extern void tick_broadcast_init ( void ) ;
2007-02-16 12:28:02 +03:00
extern void
tick_set_periodic_handler ( struct clock_event_device * dev , int broadcast ) ;
2014-02-04 02:34:31 +04:00
int tick_broadcast_update_freq ( struct clock_event_device * dev , u32 freq ) ;
2007-02-16 12:28:02 +03:00
# else /* !BROADCAST */
2013-04-26 00:31:47 +04:00
static inline void tick_install_broadcast_device ( struct clock_event_device * dev )
2007-02-16 12:28:02 +03:00
{
}
static inline int tick_is_broadcast_device ( struct clock_event_device * dev )
{
return 0 ;
}
static inline int tick_device_uses_broadcast ( struct clock_event_device * dev ,
int cpu )
{
return 0 ;
}
static inline void tick_do_periodic_broadcast ( struct clock_event_device * d ) { }
static inline void tick_broadcast_on_off ( unsigned long reason , int * oncpu ) { }
static inline void tick_shutdown_broadcast ( unsigned int * cpup ) { }
2007-03-06 10:25:42 +03:00
static inline void tick_suspend_broadcast ( void ) { }
static inline int tick_resume_broadcast ( void ) { return 0 ; }
2013-03-05 17:25:32 +04:00
static inline void tick_broadcast_init ( void ) { }
2014-02-04 02:34:31 +04:00
static inline int tick_broadcast_update_freq ( struct clock_event_device * dev ,
u32 freq ) { return - ENODEV ; }
2007-02-16 12:28:02 +03:00
/*
* Set the periodic handler in non broadcast mode
*/
static inline void tick_set_periodic_handler ( struct clock_event_device * dev ,
int broadcast )
{
dev - > event_handler = tick_handle_periodic ;
}
# endif /* !BROADCAST */
/*
* Check , if the device is functional or a dummy for broadcast
*/
static inline int tick_device_is_functional ( struct clock_event_device * dev )
{
return ! ( dev - > features & CLOCK_EVT_FEAT_DUMMY ) ;
}
2011-01-27 18:00:32 +03:00
2014-02-07 19:00:46 +04:00
int __clockevents_update_freq ( struct clock_event_device * dev , u32 freq ) ;
2011-02-01 11:34:58 +03:00
# endif
2011-01-27 18:00:32 +03:00
extern void do_timer ( unsigned long ticks ) ;
2013-12-13 01:10:55 +04:00
extern void update_wall_time ( void ) ;