2007-02-16 12:28:02 +03:00
/*
* tick internal variable and functions used by low / high res code
*/
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 ) ;
2008-09-16 22:32:50 +04:00
extern void clockevents_shutdown ( struct clock_event_device * dev ) ;
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 ) ;
2008-09-04 01:37:14 +04:00
extern int tick_dev_program_event ( struct clock_event_device * dev ,
ktime_t expires , int force ) ;
2007-02-16 12:28:03 +03:00
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 ) ;
extern void tick_broadcast_oneshot_control ( unsigned long reason ) ;
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 ) ;
2008-10-17 12:01:23 +04:00
extern void tick_check_oneshot_broadcast ( int cpu ) ;
2007-02-16 12:28:03 +03:00
# else /* BROADCAST */
static inline void tick_broadcast_setup_oneshot ( struct clock_event_device * bc )
{
BUG ( ) ;
}
static inline void tick_broadcast_oneshot_control ( unsigned long reason ) { }
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 ; }
2008-10-17 12:01:23 +04:00
static inline void tick_check_oneshot_broadcast ( int cpu ) { }
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 ( ) ;
}
static inline void tick_broadcast_oneshot_control ( unsigned long reason ) { }
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 ; }
2007-02-16 12:28:03 +03:00
# endif /* !TICK_ONESHOT */
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 ) ;
extern int tick_check_broadcast_device ( struct clock_event_device * dev ) ;
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 ) ;
2007-02-16 12:28:02 +03:00
extern void
tick_set_periodic_handler ( struct clock_event_device * dev , int broadcast ) ;
# else /* !BROADCAST */
static inline int tick_check_broadcast_device ( struct clock_event_device * dev )
{
return 0 ;
}
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 ; }
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 ) ;
}