diff options
Diffstat (limited to 'sound/core/timer.c')
| -rw-r--r-- | sound/core/timer.c | 42 | 
1 files changed, 24 insertions, 18 deletions
diff --git a/sound/core/timer.c b/sound/core/timer.c index 13afb60999b..777a45e08e5 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -24,7 +24,8 @@  #include <linux/slab.h>  #include <linux/time.h>  #include <linux/mutex.h> -#include <linux/moduleparam.h> +#include <linux/device.h> +#include <linux/module.h>  #include <linux/string.h>  #include <sound/core.h>  #include <sound/timer.h> @@ -34,9 +35,9 @@  #include <sound/initval.h>  #include <linux/kmod.h> -#if defined(CONFIG_SND_HPET) || defined(CONFIG_SND_HPET_MODULE) -#define DEFAULT_TIMER_LIMIT 3 -#elif defined(CONFIG_SND_RTCTIMER) || defined(CONFIG_SND_RTCTIMER_MODULE) +#if IS_ENABLED(CONFIG_SND_HRTIMER) +#define DEFAULT_TIMER_LIMIT 4 +#elif IS_ENABLED(CONFIG_SND_RTCTIMER)  #define DEFAULT_TIMER_LIMIT 2  #else  #define DEFAULT_TIMER_LIMIT 1 @@ -52,6 +53,9 @@ MODULE_PARM_DESC(timer_limit, "Maximum global timers in system.");  module_param(timer_tstamp_monotonic, int, 0444);  MODULE_PARM_DESC(timer_tstamp_monotonic, "Use posix monotonic clock source for timestamps (default)."); +MODULE_ALIAS_CHARDEV(CONFIG_SND_MAJOR, SNDRV_MINOR_TIMER); +MODULE_ALIAS("devname:snd/timer"); +  struct snd_timer_user {  	struct snd_timer_instance *timeri;  	int tread;		/* enhanced read with timestamps and events */ @@ -183,9 +187,8 @@ static void snd_timer_check_slave(struct snd_timer_instance *slave)  		list_for_each_entry(master, &timer->open_list_head, open_list) {  			if (slave->slave_class == master->slave_class &&  			    slave->slave_id == master->slave_id) { -				list_del(&slave->open_list); -				list_add_tail(&slave->open_list, -					      &master->slave_list_head); +				list_move_tail(&slave->open_list, +					       &master->slave_list_head);  				spin_lock_irq(&slave_active_lock);  				slave->master = master;  				slave->timer = master->timer; @@ -237,7 +240,8 @@ int snd_timer_open(struct snd_timer_instance **ti,  		/* open a slave instance */  		if (tid->dev_sclass <= SNDRV_TIMER_SCLASS_NONE ||  		    tid->dev_sclass > SNDRV_TIMER_SCLASS_OSS_SEQUENCER) { -			snd_printd("invalid slave class %i\n", tid->dev_sclass); +			pr_debug("ALSA: timer: invalid slave class %i\n", +				 tid->dev_sclass);  			return -EINVAL;  		}  		mutex_lock(®ister_mutex); @@ -326,6 +330,8 @@ int snd_timer_close(struct snd_timer_instance *timeri)  		mutex_unlock(®ister_mutex);  	} else {  		timer = timeri->timer; +		if (snd_BUG_ON(!timer)) +			goto out;  		/* wait, until the active callback is finished */  		spin_lock_irq(&timer->lock);  		while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) { @@ -351,6 +357,7 @@ int snd_timer_close(struct snd_timer_instance *timeri)  		}  		mutex_unlock(®ister_mutex);  	} + out:  	if (timeri->private_free)  		timeri->private_free(timeri);  	kfree(timeri->owner); @@ -383,7 +390,7 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event)  	struct timespec tstamp;  	if (timer_tstamp_monotonic) -		do_posix_clock_monotonic_gettime(&tstamp); +		ktime_get_ts(&tstamp);  	else  		getnstimeofday(&tstamp);  	if (snd_BUG_ON(event < SNDRV_TIMER_EVENT_START || @@ -411,8 +418,7 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event)  static int snd_timer_start1(struct snd_timer *timer, struct snd_timer_instance *timeri,  			    unsigned long sticks)  { -	list_del(&timeri->active_list); -	list_add_tail(&timeri->active_list, &timer->active_list_head); +	list_move_tail(&timeri->active_list, &timer->active_list_head);  	if (timer->running) {  		if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE)  			goto __start_now; @@ -530,6 +536,8 @@ int snd_timer_stop(struct snd_timer_instance *timeri)  	if (err < 0)  		return err;  	timer = timeri->timer; +	if (!timer) +		return -EINVAL;  	spin_lock_irqsave(&timer->lock, flags);  	timeri->cticks = timeri->ticks;  	timeri->pticks = 0; @@ -767,7 +775,7 @@ int snd_timer_new(struct snd_card *card, char *id, struct snd_timer_id *tid,  		*rtimer = NULL;  	timer = kzalloc(sizeof(*timer), GFP_KERNEL);  	if (timer == NULL) { -		snd_printk(KERN_ERR "timer: cannot allocate\n"); +		pr_err("ALSA: timer: cannot allocate\n");  		return -ENOMEM;  	}  	timer->tmr_class = tid->dev_class; @@ -806,7 +814,7 @@ static int snd_timer_free(struct snd_timer *timer)  	if (! list_empty(&timer->open_list_head)) {  		struct list_head *p, *n;  		struct snd_timer_instance *ti; -		snd_printk(KERN_WARNING "timer %p is busy?\n", timer); +		pr_warn("ALSA: timer %p is busy?\n", timer);  		list_for_each_safe(p, n, &timer->open_list_head) {  			list_del_init(p);  			ti = list_entry(p, struct snd_timer_instance, open_list); @@ -1195,7 +1203,7 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri,  	}  	if (tu->last_resolution != resolution || ticks > 0) {  		if (timer_tstamp_monotonic) -			do_posix_clock_monotonic_gettime(&tstamp); +			ktime_get_ts(&tstamp);  		else  			getnstimeofday(&tstamp);  	} @@ -1948,12 +1956,10 @@ static int __init alsa_timer_init(void)  #endif  	if ((err = snd_timer_register_system()) < 0) -		snd_printk(KERN_ERR "unable to register system timer (%i)\n", -			   err); +		pr_err("ALSA: unable to register system timer (%i)\n", err);  	if ((err = snd_register_device(SNDRV_DEVICE_TYPE_TIMER, NULL, 0,  				       &snd_timer_f_ops, NULL, "timer")) < 0) -		snd_printk(KERN_ERR "unable to register timer device (%i)\n", -			   err); +		pr_err("ALSA: unable to register timer device (%i)\n", err);  	snd_timer_proc_init();  	return 0;  }  | 
