2019-05-27 09:55:05 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2005-04-17 02:20:36 +04:00
# ifndef __SOUND_TIMER_H
# define __SOUND_TIMER_H
/*
* Timer abstract layer
2007-10-15 11:50:19 +04:00
* Copyright ( c ) by Jaroslav Kysela < perex @ perex . cz > ,
2005-04-17 02:20:36 +04:00
* Abramo Bagnara < abramo @ alsa - project . org >
*/
# include <sound/asound.h>
# include <linux/interrupt.h>
# define snd_timer_chip(timer) ((timer)->private_data)
# define SNDRV_TIMER_DEVICES 16
# define SNDRV_TIMER_DEV_FLG_PCM 0x10000000
# define SNDRV_TIMER_HW_AUTO 0x00000001 /* auto trigger is supported */
# define SNDRV_TIMER_HW_STOP 0x00000002 /* call stop before start */
# define SNDRV_TIMER_HW_SLAVE 0x00000004 /* only slave timer (variable resolution) */
# define SNDRV_TIMER_HW_FIRST 0x00000008 /* first tick can be incomplete */
2020-09-03 13:41:22 +03:00
# define SNDRV_TIMER_HW_WORK 0x00000010 /* timer is called from work */
2005-04-17 02:20:36 +04:00
# define SNDRV_TIMER_IFLG_SLAVE 0x00000001
# define SNDRV_TIMER_IFLG_RUNNING 0x00000002
# define SNDRV_TIMER_IFLG_START 0x00000004
# define SNDRV_TIMER_IFLG_AUTO 0x00000008 /* auto restart */
2020-09-03 13:41:22 +03:00
# define SNDRV_TIMER_IFLG_FAST 0x00000010 /* fast callback (do not use work) */
2005-04-17 02:20:36 +04:00
# define SNDRV_TIMER_IFLG_CALLBACK 0x00000020 /* timer callback is active */
# define SNDRV_TIMER_IFLG_EXCLUSIVE 0x00000040 /* exclusive owner - no more instances */
# define SNDRV_TIMER_IFLG_EARLY_EVENT 0x00000080 /* write early event to the poll queue */
# define SNDRV_TIMER_FLG_CHANGE 0x00000001
# define SNDRV_TIMER_FLG_RESCHED 0x00000002 /* need reschedule */
2005-11-17 15:56:05 +03:00
struct snd_timer ;
2005-04-17 02:20:36 +04:00
2005-11-17 15:56:05 +03:00
struct snd_timer_hardware {
2005-04-17 02:20:36 +04:00
/* -- must be filled with low-level driver */
unsigned int flags ; /* various flags */
unsigned long resolution ; /* average timer resolution for one tick in nsec */
unsigned long resolution_min ; /* minimal resolution */
unsigned long resolution_max ; /* maximal resolution */
unsigned long ticks ; /* max timer ticks per interrupt */
/* -- low-level functions -- */
2005-11-17 15:56:05 +03:00
int ( * open ) ( struct snd_timer * timer ) ;
int ( * close ) ( struct snd_timer * timer ) ;
unsigned long ( * c_resolution ) ( struct snd_timer * timer ) ;
int ( * start ) ( struct snd_timer * timer ) ;
int ( * stop ) ( struct snd_timer * timer ) ;
int ( * set_period ) ( struct snd_timer * timer , unsigned long period_num , unsigned long period_den ) ;
int ( * precise_resolution ) ( struct snd_timer * timer , unsigned long * num , unsigned long * den ) ;
2005-04-17 02:20:36 +04:00
} ;
2005-11-17 15:56:05 +03:00
struct snd_timer {
int tmr_class ;
struct snd_card * card ;
2005-10-12 19:12:31 +04:00
struct module * module ;
2005-04-17 02:20:36 +04:00
int tmr_device ;
int tmr_subdevice ;
char id [ 64 ] ;
char name [ 80 ] ;
unsigned int flags ;
int running ; /* running instances */
unsigned long sticks ; /* schedule ticks */
void * private_data ;
2005-11-17 15:56:05 +03:00
void ( * private_free ) ( struct snd_timer * timer ) ;
struct snd_timer_hardware hw ;
2005-04-17 02:20:36 +04:00
spinlock_t lock ;
struct list_head device_list ;
struct list_head open_list_head ;
struct list_head active_list_head ;
struct list_head ack_list_head ;
struct list_head sack_list_head ; /* slow ack list head */
2020-09-03 13:41:22 +03:00
struct work_struct task_work ;
2017-11-05 12:07:43 +03:00
int max_instances ; /* upper limit of timer instances */
int num_instances ; /* current number of timer instances */
2005-04-17 02:20:36 +04:00
} ;
2005-11-17 15:56:05 +03:00
struct snd_timer_instance {
struct snd_timer * timer ;
2005-04-17 02:20:36 +04:00
char * owner ;
unsigned int flags ;
void * private_data ;
2005-11-17 15:56:05 +03:00
void ( * private_free ) ( struct snd_timer_instance * ti ) ;
void ( * callback ) ( struct snd_timer_instance * timeri ,
unsigned long ticks , unsigned long resolution ) ;
void ( * ccallback ) ( struct snd_timer_instance * timeri ,
int event ,
2018-04-24 15:06:08 +03:00
struct timespec64 * tstamp ,
2005-11-17 15:56:05 +03:00
unsigned long resolution ) ;
2016-01-21 19:43:08 +03:00
void ( * disconnect ) ( struct snd_timer_instance * timeri ) ;
2005-04-17 02:20:36 +04:00
void * callback_data ;
unsigned long ticks ; /* auto-load ticks when expired */
unsigned long cticks ; /* current ticks */
unsigned long pticks ; /* accumulated ticks for callback */
2020-09-03 13:41:22 +03:00
unsigned long resolution ; /* current resolution for work */
2005-04-17 02:20:36 +04:00
unsigned long lost ; /* lost ticks */
2005-11-17 15:56:05 +03:00
int slave_class ;
2005-04-17 02:20:36 +04:00
unsigned int slave_id ;
struct list_head open_list ;
struct list_head active_list ;
struct list_head ack_list ;
struct list_head slave_list_head ;
struct list_head slave_active_head ;
2005-11-17 15:56:05 +03:00
struct snd_timer_instance * master ;
2005-04-17 02:20:36 +04:00
} ;
/*
* Registering
*/
2005-11-17 15:56:05 +03:00
int snd_timer_new ( struct snd_card * card , char * id , struct snd_timer_id * tid , struct snd_timer * * rtimer ) ;
2018-04-24 15:06:08 +03:00
void snd_timer_notify ( struct snd_timer * timer , int event , struct timespec64 * tstamp ) ;
2005-11-17 15:56:05 +03:00
int snd_timer_global_new ( char * id , int device , struct snd_timer * * rtimer ) ;
int snd_timer_global_free ( struct snd_timer * timer ) ;
int snd_timer_global_register ( struct snd_timer * timer ) ;
2019-11-07 22:20:08 +03:00
struct snd_timer_instance * snd_timer_instance_new ( const char * owner ) ;
void snd_timer_instance_free ( struct snd_timer_instance * timeri ) ;
int snd_timer_open ( struct snd_timer_instance * timeri , struct snd_timer_id * tid , unsigned int slave_id ) ;
2019-11-07 22:20:07 +03:00
void snd_timer_close ( struct snd_timer_instance * timeri ) ;
2005-11-17 15:56:05 +03:00
unsigned long snd_timer_resolution ( struct snd_timer_instance * timeri ) ;
int snd_timer_start ( struct snd_timer_instance * timeri , unsigned int ticks ) ;
int snd_timer_stop ( struct snd_timer_instance * timeri ) ;
int snd_timer_continue ( struct snd_timer_instance * timeri ) ;
int snd_timer_pause ( struct snd_timer_instance * timeri ) ;
void snd_timer_interrupt ( struct snd_timer * timer , unsigned long ticks_left ) ;
2005-04-17 02:20:36 +04:00
# endif /* __SOUND_TIMER_H */