1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Timers abstract layer 4 * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 5 */ 6 7 #include <linux/delay.h> 8 #include <linux/init.h> 9 #include <linux/slab.h> 10 #include <linux/time.h> 11 #include <linux/mutex.h> 12 #include <linux/device.h> 13 #include <linux/module.h> 14 #include <linux/string.h> 15 #include <linux/sched/signal.h> 16 #include <sound/core.h> 17 #include <sound/timer.h> 18 #include <sound/control.h> 19 #include <sound/info.h> 20 #include <sound/minors.h> 21 #include <sound/initval.h> 22 #include <linux/kmod.h> 23 24 /* internal flags */ 25 #define SNDRV_TIMER_IFLG_PAUSED 0x00010000 26 #define SNDRV_TIMER_IFLG_DEAD 0x00020000 27 28 #if IS_ENABLED(CONFIG_SND_HRTIMER) 29 #define DEFAULT_TIMER_LIMIT 4 30 #else 31 #define DEFAULT_TIMER_LIMIT 1 32 #endif 33 34 static int timer_limit = DEFAULT_TIMER_LIMIT; 35 static int timer_tstamp_monotonic = 1; 36 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.de>"); 37 MODULE_DESCRIPTION("ALSA timer interface"); 38 MODULE_LICENSE("GPL"); 39 module_param(timer_limit, int, 0444); 40 MODULE_PARM_DESC(timer_limit, "Maximum global timers in system."); 41 module_param(timer_tstamp_monotonic, int, 0444); 42 MODULE_PARM_DESC(timer_tstamp_monotonic, "Use posix monotonic clock source for timestamps (default)."); 43 44 MODULE_ALIAS_CHARDEV(CONFIG_SND_MAJOR, SNDRV_MINOR_TIMER); 45 MODULE_ALIAS("devname:snd/timer"); 46 47 struct snd_timer_user { 48 struct snd_timer_instance *timeri; 49 int tread; /* enhanced read with timestamps and events */ 50 unsigned long ticks; 51 unsigned long overrun; 52 int qhead; 53 int qtail; 54 int qused; 55 int queue_size; 56 bool disconnected; 57 struct snd_timer_read *queue; 58 struct snd_timer_tread *tqueue; 59 spinlock_t qlock; 60 unsigned long last_resolution; 61 unsigned int filter; 62 struct timespec tstamp; /* trigger tstamp */ 63 wait_queue_head_t qchange_sleep; 64 struct snd_fasync *fasync; 65 struct mutex ioctl_lock; 66 }; 67 68 /* list of timers */ 69 static LIST_HEAD(snd_timer_list); 70 71 /* list of slave instances */ 72 static LIST_HEAD(snd_timer_slave_list); 73 74 /* lock for slave active lists */ 75 static DEFINE_SPINLOCK(slave_active_lock); 76 77 #define MAX_SLAVE_INSTANCES 1000 78 static int num_slaves; 79 80 static DEFINE_MUTEX(register_mutex); 81 82 static int snd_timer_free(struct snd_timer *timer); 83 static int snd_timer_dev_free(struct snd_device *device); 84 static int snd_timer_dev_register(struct snd_device *device); 85 static int snd_timer_dev_disconnect(struct snd_device *device); 86 87 static void snd_timer_reschedule(struct snd_timer * timer, unsigned long ticks_left); 88 89 /* 90 * create a timer instance with the given owner string. 91 * when timer is not NULL, increments the module counter 92 */ snd_timer_instance_new(char * owner,struct snd_timer * timer)93 static struct snd_timer_instance *snd_timer_instance_new(char *owner, 94 struct snd_timer *timer) 95 { 96 struct snd_timer_instance *timeri; 97 timeri = kzalloc(sizeof(*timeri), GFP_KERNEL); 98 if (timeri == NULL) 99 return NULL; 100 timeri->owner = kstrdup(owner, GFP_KERNEL); 101 if (! timeri->owner) { 102 kfree(timeri); 103 return NULL; 104 } 105 INIT_LIST_HEAD(&timeri->open_list); 106 INIT_LIST_HEAD(&timeri->active_list); 107 INIT_LIST_HEAD(&timeri->ack_list); 108 INIT_LIST_HEAD(&timeri->slave_list_head); 109 INIT_LIST_HEAD(&timeri->slave_active_head); 110 111 timeri->timer = timer; 112 if (timer && !try_module_get(timer->module)) { 113 kfree(timeri->owner); 114 kfree(timeri); 115 return NULL; 116 } 117 118 return timeri; 119 } 120 121 /* 122 * find a timer instance from the given timer id 123 */ snd_timer_find(struct snd_timer_id * tid)124 static struct snd_timer *snd_timer_find(struct snd_timer_id *tid) 125 { 126 struct snd_timer *timer = NULL; 127 128 list_for_each_entry(timer, &snd_timer_list, device_list) { 129 if (timer->tmr_class != tid->dev_class) 130 continue; 131 if ((timer->tmr_class == SNDRV_TIMER_CLASS_CARD || 132 timer->tmr_class == SNDRV_TIMER_CLASS_PCM) && 133 (timer->card == NULL || 134 timer->card->number != tid->card)) 135 continue; 136 if (timer->tmr_device != tid->device) 137 continue; 138 if (timer->tmr_subdevice != tid->subdevice) 139 continue; 140 return timer; 141 } 142 return NULL; 143 } 144 145 #ifdef CONFIG_MODULES 146 snd_timer_request(struct snd_timer_id * tid)147 static void snd_timer_request(struct snd_timer_id *tid) 148 { 149 switch (tid->dev_class) { 150 case SNDRV_TIMER_CLASS_GLOBAL: 151 if (tid->device < timer_limit) 152 request_module("snd-timer-%i", tid->device); 153 break; 154 case SNDRV_TIMER_CLASS_CARD: 155 case SNDRV_TIMER_CLASS_PCM: 156 if (tid->card < snd_ecards_limit) 157 request_module("snd-card-%i", tid->card); 158 break; 159 default: 160 break; 161 } 162 } 163 164 #endif 165 166 /* 167 * look for a master instance matching with the slave id of the given slave. 168 * when found, relink the open_link of the slave. 169 * 170 * call this with register_mutex down. 171 */ snd_timer_check_slave(struct snd_timer_instance * slave)172 static int snd_timer_check_slave(struct snd_timer_instance *slave) 173 { 174 struct snd_timer *timer; 175 struct snd_timer_instance *master; 176 177 /* FIXME: it's really dumb to look up all entries.. */ 178 list_for_each_entry(timer, &snd_timer_list, device_list) { 179 list_for_each_entry(master, &timer->open_list_head, open_list) { 180 if (slave->slave_class == master->slave_class && 181 slave->slave_id == master->slave_id) { 182 if (master->timer->num_instances >= 183 master->timer->max_instances) 184 return -EBUSY; 185 list_move_tail(&slave->open_list, 186 &master->slave_list_head); 187 master->timer->num_instances++; 188 spin_lock_irq(&slave_active_lock); 189 slave->master = master; 190 slave->timer = master->timer; 191 spin_unlock_irq(&slave_active_lock); 192 return 0; 193 } 194 } 195 } 196 return 0; 197 } 198 199 /* 200 * look for slave instances matching with the slave id of the given master. 201 * when found, relink the open_link of slaves. 202 * 203 * call this with register_mutex down. 204 */ snd_timer_check_master(struct snd_timer_instance * master)205 static int snd_timer_check_master(struct snd_timer_instance *master) 206 { 207 struct snd_timer_instance *slave, *tmp; 208 209 /* check all pending slaves */ 210 list_for_each_entry_safe(slave, tmp, &snd_timer_slave_list, open_list) { 211 if (slave->slave_class == master->slave_class && 212 slave->slave_id == master->slave_id) { 213 if (master->timer->num_instances >= 214 master->timer->max_instances) 215 return -EBUSY; 216 list_move_tail(&slave->open_list, &master->slave_list_head); 217 master->timer->num_instances++; 218 spin_lock_irq(&slave_active_lock); 219 spin_lock(&master->timer->lock); 220 slave->master = master; 221 slave->timer = master->timer; 222 if (slave->flags & SNDRV_TIMER_IFLG_RUNNING) 223 list_add_tail(&slave->active_list, 224 &master->slave_active_head); 225 spin_unlock(&master->timer->lock); 226 spin_unlock_irq(&slave_active_lock); 227 } 228 } 229 return 0; 230 } 231 232 static int snd_timer_close_locked(struct snd_timer_instance *timeri, 233 struct device **card_devp_to_put); 234 235 /* 236 * open a timer instance 237 * when opening a master, the slave id must be here given. 238 */ snd_timer_open(struct snd_timer_instance ** ti,char * owner,struct snd_timer_id * tid,unsigned int slave_id)239 int snd_timer_open(struct snd_timer_instance **ti, 240 char *owner, struct snd_timer_id *tid, 241 unsigned int slave_id) 242 { 243 struct snd_timer *timer; 244 struct snd_timer_instance *timeri = NULL; 245 struct device *card_dev_to_put = NULL; 246 int err; 247 248 mutex_lock(®ister_mutex); 249 if (tid->dev_class == SNDRV_TIMER_CLASS_SLAVE) { 250 /* open a slave instance */ 251 if (tid->dev_sclass <= SNDRV_TIMER_SCLASS_NONE || 252 tid->dev_sclass > SNDRV_TIMER_SCLASS_OSS_SEQUENCER) { 253 pr_debug("ALSA: timer: invalid slave class %i\n", 254 tid->dev_sclass); 255 err = -EINVAL; 256 goto unlock; 257 } 258 if (num_slaves >= MAX_SLAVE_INSTANCES) { 259 err = -EBUSY; 260 goto unlock; 261 } 262 timeri = snd_timer_instance_new(owner, NULL); 263 if (!timeri) { 264 err = -ENOMEM; 265 goto unlock; 266 } 267 timeri->slave_class = tid->dev_sclass; 268 timeri->slave_id = tid->device; 269 timeri->flags |= SNDRV_TIMER_IFLG_SLAVE; 270 list_add_tail(&timeri->open_list, &snd_timer_slave_list); 271 num_slaves++; 272 err = snd_timer_check_slave(timeri); 273 if (err < 0) { 274 snd_timer_close_locked(timeri, &card_dev_to_put); 275 timeri = NULL; 276 } 277 goto unlock; 278 } 279 280 /* open a master instance */ 281 timer = snd_timer_find(tid); 282 #ifdef CONFIG_MODULES 283 if (!timer) { 284 mutex_unlock(®ister_mutex); 285 snd_timer_request(tid); 286 mutex_lock(®ister_mutex); 287 timer = snd_timer_find(tid); 288 } 289 #endif 290 if (!timer) { 291 err = -ENODEV; 292 goto unlock; 293 } 294 if (!list_empty(&timer->open_list_head)) { 295 struct snd_timer_instance *t = 296 list_entry(timer->open_list_head.next, 297 struct snd_timer_instance, open_list); 298 if (t->flags & SNDRV_TIMER_IFLG_EXCLUSIVE) { 299 err = -EBUSY; 300 goto unlock; 301 } 302 } 303 if (timer->num_instances >= timer->max_instances) { 304 err = -EBUSY; 305 goto unlock; 306 } 307 timeri = snd_timer_instance_new(owner, timer); 308 if (!timeri) { 309 err = -ENOMEM; 310 goto unlock; 311 } 312 /* take a card refcount for safe disconnection */ 313 if (timer->card) 314 get_device(&timer->card->card_dev); 315 timeri->slave_class = tid->dev_sclass; 316 timeri->slave_id = slave_id; 317 318 if (list_empty(&timer->open_list_head) && timer->hw.open) { 319 err = timer->hw.open(timer); 320 if (err) { 321 kfree(timeri->owner); 322 kfree(timeri); 323 timeri = NULL; 324 325 if (timer->card) 326 card_dev_to_put = &timer->card->card_dev; 327 module_put(timer->module); 328 goto unlock; 329 } 330 } 331 332 list_add_tail(&timeri->open_list, &timer->open_list_head); 333 timer->num_instances++; 334 err = snd_timer_check_master(timeri); 335 if (err < 0) { 336 snd_timer_close_locked(timeri, &card_dev_to_put); 337 timeri = NULL; 338 } 339 340 unlock: 341 mutex_unlock(®ister_mutex); 342 /* put_device() is called after unlock for avoiding deadlock */ 343 if (card_dev_to_put) 344 put_device(card_dev_to_put); 345 *ti = timeri; 346 return err; 347 } 348 EXPORT_SYMBOL(snd_timer_open); 349 350 /* 351 * close a timer instance 352 * call this with register_mutex down. 353 */ snd_timer_close_locked(struct snd_timer_instance * timeri,struct device ** card_devp_to_put)354 static int snd_timer_close_locked(struct snd_timer_instance *timeri, 355 struct device **card_devp_to_put) 356 { 357 struct snd_timer *timer = timeri->timer; 358 struct snd_timer_instance *slave, *tmp; 359 360 if (timer) { 361 spin_lock_irq(&timer->lock); 362 timeri->flags |= SNDRV_TIMER_IFLG_DEAD; 363 spin_unlock_irq(&timer->lock); 364 } 365 366 list_del(&timeri->open_list); 367 if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) 368 num_slaves--; 369 370 /* force to stop the timer */ 371 snd_timer_stop(timeri); 372 373 if (timer) { 374 timer->num_instances--; 375 /* wait, until the active callback is finished */ 376 spin_lock_irq(&timer->lock); 377 while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) { 378 spin_unlock_irq(&timer->lock); 379 udelay(10); 380 spin_lock_irq(&timer->lock); 381 } 382 spin_unlock_irq(&timer->lock); 383 384 /* remove slave links */ 385 spin_lock_irq(&slave_active_lock); 386 spin_lock(&timer->lock); 387 list_for_each_entry_safe(slave, tmp, &timeri->slave_list_head, 388 open_list) { 389 list_move_tail(&slave->open_list, &snd_timer_slave_list); 390 timer->num_instances--; 391 slave->master = NULL; 392 slave->timer = NULL; 393 list_del_init(&slave->ack_list); 394 list_del_init(&slave->active_list); 395 } 396 spin_unlock(&timer->lock); 397 spin_unlock_irq(&slave_active_lock); 398 399 /* slave doesn't need to release timer resources below */ 400 if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) 401 timer = NULL; 402 } 403 404 if (timeri->private_free) 405 timeri->private_free(timeri); 406 kfree(timeri->owner); 407 kfree(timeri); 408 409 if (timer) { 410 if (list_empty(&timer->open_list_head) && timer->hw.close) 411 timer->hw.close(timer); 412 /* release a card refcount for safe disconnection */ 413 if (timer->card) 414 *card_devp_to_put = &timer->card->card_dev; 415 module_put(timer->module); 416 } 417 418 return 0; 419 } 420 421 /* 422 * close a timer instance 423 */ snd_timer_close(struct snd_timer_instance * timeri)424 int snd_timer_close(struct snd_timer_instance *timeri) 425 { 426 struct device *card_dev_to_put = NULL; 427 int err; 428 429 if (snd_BUG_ON(!timeri)) 430 return -ENXIO; 431 432 mutex_lock(®ister_mutex); 433 err = snd_timer_close_locked(timeri, &card_dev_to_put); 434 mutex_unlock(®ister_mutex); 435 /* put_device() is called after unlock for avoiding deadlock */ 436 if (card_dev_to_put) 437 put_device(card_dev_to_put); 438 return err; 439 } 440 EXPORT_SYMBOL(snd_timer_close); 441 snd_timer_hw_resolution(struct snd_timer * timer)442 static unsigned long snd_timer_hw_resolution(struct snd_timer *timer) 443 { 444 if (timer->hw.c_resolution) 445 return timer->hw.c_resolution(timer); 446 else 447 return timer->hw.resolution; 448 } 449 snd_timer_resolution(struct snd_timer_instance * timeri)450 unsigned long snd_timer_resolution(struct snd_timer_instance *timeri) 451 { 452 struct snd_timer * timer; 453 unsigned long ret = 0; 454 unsigned long flags; 455 456 if (timeri == NULL) 457 return 0; 458 timer = timeri->timer; 459 if (timer) { 460 spin_lock_irqsave(&timer->lock, flags); 461 ret = snd_timer_hw_resolution(timer); 462 spin_unlock_irqrestore(&timer->lock, flags); 463 } 464 return ret; 465 } 466 EXPORT_SYMBOL(snd_timer_resolution); 467 snd_timer_notify1(struct snd_timer_instance * ti,int event)468 static void snd_timer_notify1(struct snd_timer_instance *ti, int event) 469 { 470 struct snd_timer *timer = ti->timer; 471 unsigned long resolution = 0; 472 struct snd_timer_instance *ts; 473 struct timespec tstamp; 474 475 if (timer_tstamp_monotonic) 476 ktime_get_ts(&tstamp); 477 else 478 getnstimeofday(&tstamp); 479 if (snd_BUG_ON(event < SNDRV_TIMER_EVENT_START || 480 event > SNDRV_TIMER_EVENT_PAUSE)) 481 return; 482 if (timer && 483 (event == SNDRV_TIMER_EVENT_START || 484 event == SNDRV_TIMER_EVENT_CONTINUE)) 485 resolution = snd_timer_hw_resolution(timer); 486 if (ti->ccallback) 487 ti->ccallback(ti, event, &tstamp, resolution); 488 if (ti->flags & SNDRV_TIMER_IFLG_SLAVE) 489 return; 490 if (timer == NULL) 491 return; 492 if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) 493 return; 494 event += 10; /* convert to SNDRV_TIMER_EVENT_MXXX */ 495 list_for_each_entry(ts, &ti->slave_active_head, active_list) 496 if (ts->ccallback) 497 ts->ccallback(ts, event, &tstamp, resolution); 498 } 499 500 /* start/continue a master timer */ snd_timer_start1(struct snd_timer_instance * timeri,bool start,unsigned long ticks)501 static int snd_timer_start1(struct snd_timer_instance *timeri, 502 bool start, unsigned long ticks) 503 { 504 struct snd_timer *timer; 505 int result; 506 unsigned long flags; 507 508 timer = timeri->timer; 509 if (!timer) 510 return -EINVAL; 511 512 spin_lock_irqsave(&timer->lock, flags); 513 if (timeri->flags & SNDRV_TIMER_IFLG_DEAD) { 514 result = -EINVAL; 515 goto unlock; 516 } 517 if (timer->card && timer->card->shutdown) { 518 result = -ENODEV; 519 goto unlock; 520 } 521 if (timeri->flags & (SNDRV_TIMER_IFLG_RUNNING | 522 SNDRV_TIMER_IFLG_START)) { 523 result = -EBUSY; 524 goto unlock; 525 } 526 527 if (start) 528 timeri->ticks = timeri->cticks = ticks; 529 else if (!timeri->cticks) 530 timeri->cticks = 1; 531 timeri->pticks = 0; 532 533 list_move_tail(&timeri->active_list, &timer->active_list_head); 534 if (timer->running) { 535 if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) 536 goto __start_now; 537 timer->flags |= SNDRV_TIMER_FLG_RESCHED; 538 timeri->flags |= SNDRV_TIMER_IFLG_START; 539 result = 1; /* delayed start */ 540 } else { 541 if (start) 542 timer->sticks = ticks; 543 timer->hw.start(timer); 544 __start_now: 545 timer->running++; 546 timeri->flags |= SNDRV_TIMER_IFLG_RUNNING; 547 result = 0; 548 } 549 snd_timer_notify1(timeri, start ? SNDRV_TIMER_EVENT_START : 550 SNDRV_TIMER_EVENT_CONTINUE); 551 unlock: 552 spin_unlock_irqrestore(&timer->lock, flags); 553 return result; 554 } 555 556 /* start/continue a slave timer */ snd_timer_start_slave(struct snd_timer_instance * timeri,bool start)557 static int snd_timer_start_slave(struct snd_timer_instance *timeri, 558 bool start) 559 { 560 unsigned long flags; 561 int err; 562 563 spin_lock_irqsave(&slave_active_lock, flags); 564 if (timeri->flags & SNDRV_TIMER_IFLG_DEAD) { 565 err = -EINVAL; 566 goto unlock; 567 } 568 if (timeri->flags & SNDRV_TIMER_IFLG_RUNNING) { 569 err = -EBUSY; 570 goto unlock; 571 } 572 timeri->flags |= SNDRV_TIMER_IFLG_RUNNING; 573 if (timeri->master && timeri->timer) { 574 spin_lock(&timeri->timer->lock); 575 list_add_tail(&timeri->active_list, 576 &timeri->master->slave_active_head); 577 snd_timer_notify1(timeri, start ? SNDRV_TIMER_EVENT_START : 578 SNDRV_TIMER_EVENT_CONTINUE); 579 spin_unlock(&timeri->timer->lock); 580 } 581 err = 1; /* delayed start */ 582 unlock: 583 spin_unlock_irqrestore(&slave_active_lock, flags); 584 return err; 585 } 586 587 /* stop/pause a master timer */ snd_timer_stop1(struct snd_timer_instance * timeri,bool stop)588 static int snd_timer_stop1(struct snd_timer_instance *timeri, bool stop) 589 { 590 struct snd_timer *timer; 591 int result = 0; 592 unsigned long flags; 593 594 timer = timeri->timer; 595 if (!timer) 596 return -EINVAL; 597 spin_lock_irqsave(&timer->lock, flags); 598 list_del_init(&timeri->ack_list); 599 list_del_init(&timeri->active_list); 600 if (!(timeri->flags & (SNDRV_TIMER_IFLG_RUNNING | 601 SNDRV_TIMER_IFLG_START))) { 602 result = -EBUSY; 603 goto unlock; 604 } 605 if (timer->card && timer->card->shutdown) 606 goto unlock; 607 if (stop) { 608 timeri->cticks = timeri->ticks; 609 timeri->pticks = 0; 610 } 611 if ((timeri->flags & SNDRV_TIMER_IFLG_RUNNING) && 612 !(--timer->running)) { 613 timer->hw.stop(timer); 614 if (timer->flags & SNDRV_TIMER_FLG_RESCHED) { 615 timer->flags &= ~SNDRV_TIMER_FLG_RESCHED; 616 snd_timer_reschedule(timer, 0); 617 if (timer->flags & SNDRV_TIMER_FLG_CHANGE) { 618 timer->flags &= ~SNDRV_TIMER_FLG_CHANGE; 619 timer->hw.start(timer); 620 } 621 } 622 } 623 timeri->flags &= ~(SNDRV_TIMER_IFLG_RUNNING | SNDRV_TIMER_IFLG_START); 624 if (stop) 625 timeri->flags &= ~SNDRV_TIMER_IFLG_PAUSED; 626 else 627 timeri->flags |= SNDRV_TIMER_IFLG_PAUSED; 628 snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP : 629 SNDRV_TIMER_EVENT_PAUSE); 630 unlock: 631 spin_unlock_irqrestore(&timer->lock, flags); 632 return result; 633 } 634 635 /* stop/pause a slave timer */ snd_timer_stop_slave(struct snd_timer_instance * timeri,bool stop)636 static int snd_timer_stop_slave(struct snd_timer_instance *timeri, bool stop) 637 { 638 unsigned long flags; 639 bool running; 640 641 spin_lock_irqsave(&slave_active_lock, flags); 642 running = timeri->flags & SNDRV_TIMER_IFLG_RUNNING; 643 timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING; 644 if (timeri->timer) { 645 spin_lock(&timeri->timer->lock); 646 list_del_init(&timeri->ack_list); 647 list_del_init(&timeri->active_list); 648 if (running) 649 snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP : 650 SNDRV_TIMER_EVENT_PAUSE); 651 spin_unlock(&timeri->timer->lock); 652 } 653 spin_unlock_irqrestore(&slave_active_lock, flags); 654 return running ? 0 : -EBUSY; 655 } 656 657 /* 658 * start the timer instance 659 */ snd_timer_start(struct snd_timer_instance * timeri,unsigned int ticks)660 int snd_timer_start(struct snd_timer_instance *timeri, unsigned int ticks) 661 { 662 if (timeri == NULL || ticks < 1) 663 return -EINVAL; 664 if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) 665 return snd_timer_start_slave(timeri, true); 666 else 667 return snd_timer_start1(timeri, true, ticks); 668 } 669 EXPORT_SYMBOL(snd_timer_start); 670 671 /* 672 * stop the timer instance. 673 * 674 * do not call this from the timer callback! 675 */ snd_timer_stop(struct snd_timer_instance * timeri)676 int snd_timer_stop(struct snd_timer_instance *timeri) 677 { 678 if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) 679 return snd_timer_stop_slave(timeri, true); 680 else 681 return snd_timer_stop1(timeri, true); 682 } 683 EXPORT_SYMBOL(snd_timer_stop); 684 685 /* 686 * start again.. the tick is kept. 687 */ snd_timer_continue(struct snd_timer_instance * timeri)688 int snd_timer_continue(struct snd_timer_instance *timeri) 689 { 690 /* timer can continue only after pause */ 691 if (!(timeri->flags & SNDRV_TIMER_IFLG_PAUSED)) 692 return -EINVAL; 693 694 if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) 695 return snd_timer_start_slave(timeri, false); 696 else 697 return snd_timer_start1(timeri, false, 0); 698 } 699 EXPORT_SYMBOL(snd_timer_continue); 700 701 /* 702 * pause.. remember the ticks left 703 */ snd_timer_pause(struct snd_timer_instance * timeri)704 int snd_timer_pause(struct snd_timer_instance * timeri) 705 { 706 if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) 707 return snd_timer_stop_slave(timeri, false); 708 else 709 return snd_timer_stop1(timeri, false); 710 } 711 EXPORT_SYMBOL(snd_timer_pause); 712 713 /* 714 * reschedule the timer 715 * 716 * start pending instances and check the scheduling ticks. 717 * when the scheduling ticks is changed set CHANGE flag to reprogram the timer. 718 */ snd_timer_reschedule(struct snd_timer * timer,unsigned long ticks_left)719 static void snd_timer_reschedule(struct snd_timer * timer, unsigned long ticks_left) 720 { 721 struct snd_timer_instance *ti; 722 unsigned long ticks = ~0UL; 723 724 list_for_each_entry(ti, &timer->active_list_head, active_list) { 725 if (ti->flags & SNDRV_TIMER_IFLG_START) { 726 ti->flags &= ~SNDRV_TIMER_IFLG_START; 727 ti->flags |= SNDRV_TIMER_IFLG_RUNNING; 728 timer->running++; 729 } 730 if (ti->flags & SNDRV_TIMER_IFLG_RUNNING) { 731 if (ticks > ti->cticks) 732 ticks = ti->cticks; 733 } 734 } 735 if (ticks == ~0UL) { 736 timer->flags &= ~SNDRV_TIMER_FLG_RESCHED; 737 return; 738 } 739 if (ticks > timer->hw.ticks) 740 ticks = timer->hw.ticks; 741 if (ticks_left != ticks) 742 timer->flags |= SNDRV_TIMER_FLG_CHANGE; 743 timer->sticks = ticks; 744 } 745 746 /* call callbacks in timer ack list */ snd_timer_process_callbacks(struct snd_timer * timer,struct list_head * head)747 static void snd_timer_process_callbacks(struct snd_timer *timer, 748 struct list_head *head) 749 { 750 struct snd_timer_instance *ti; 751 unsigned long resolution, ticks; 752 753 while (!list_empty(head)) { 754 ti = list_first_entry(head, struct snd_timer_instance, 755 ack_list); 756 757 /* remove from ack_list and make empty */ 758 list_del_init(&ti->ack_list); 759 760 if (!(ti->flags & SNDRV_TIMER_IFLG_DEAD)) { 761 ticks = ti->pticks; 762 ti->pticks = 0; 763 resolution = ti->resolution; 764 ti->flags |= SNDRV_TIMER_IFLG_CALLBACK; 765 spin_unlock(&timer->lock); 766 if (ti->callback) 767 ti->callback(ti, resolution, ticks); 768 spin_lock(&timer->lock); 769 ti->flags &= ~SNDRV_TIMER_IFLG_CALLBACK; 770 } 771 } 772 } 773 774 /* clear pending instances from ack list */ snd_timer_clear_callbacks(struct snd_timer * timer,struct list_head * head)775 static void snd_timer_clear_callbacks(struct snd_timer *timer, 776 struct list_head *head) 777 { 778 unsigned long flags; 779 780 spin_lock_irqsave(&timer->lock, flags); 781 while (!list_empty(head)) 782 list_del_init(head->next); 783 spin_unlock_irqrestore(&timer->lock, flags); 784 } 785 786 /* 787 * timer tasklet 788 * 789 */ snd_timer_tasklet(unsigned long arg)790 static void snd_timer_tasklet(unsigned long arg) 791 { 792 struct snd_timer *timer = (struct snd_timer *) arg; 793 unsigned long flags; 794 795 if (timer->card && timer->card->shutdown) { 796 snd_timer_clear_callbacks(timer, &timer->sack_list_head); 797 return; 798 } 799 800 spin_lock_irqsave(&timer->lock, flags); 801 snd_timer_process_callbacks(timer, &timer->sack_list_head); 802 spin_unlock_irqrestore(&timer->lock, flags); 803 } 804 805 /* 806 * timer interrupt 807 * 808 * ticks_left is usually equal to timer->sticks. 809 * 810 */ snd_timer_interrupt(struct snd_timer * timer,unsigned long ticks_left)811 void snd_timer_interrupt(struct snd_timer * timer, unsigned long ticks_left) 812 { 813 struct snd_timer_instance *ti, *ts, *tmp; 814 unsigned long resolution; 815 struct list_head *ack_list_head; 816 unsigned long flags; 817 int use_tasklet = 0; 818 819 if (timer == NULL) 820 return; 821 822 if (timer->card && timer->card->shutdown) { 823 snd_timer_clear_callbacks(timer, &timer->ack_list_head); 824 return; 825 } 826 827 spin_lock_irqsave(&timer->lock, flags); 828 829 /* remember the current resolution */ 830 resolution = snd_timer_hw_resolution(timer); 831 832 /* loop for all active instances 833 * Here we cannot use list_for_each_entry because the active_list of a 834 * processed instance is relinked to done_list_head before the callback 835 * is called. 836 */ 837 list_for_each_entry_safe(ti, tmp, &timer->active_list_head, 838 active_list) { 839 if (ti->flags & SNDRV_TIMER_IFLG_DEAD) 840 continue; 841 if (!(ti->flags & SNDRV_TIMER_IFLG_RUNNING)) 842 continue; 843 ti->pticks += ticks_left; 844 ti->resolution = resolution; 845 if (ti->cticks < ticks_left) 846 ti->cticks = 0; 847 else 848 ti->cticks -= ticks_left; 849 if (ti->cticks) /* not expired */ 850 continue; 851 if (ti->flags & SNDRV_TIMER_IFLG_AUTO) { 852 ti->cticks = ti->ticks; 853 } else { 854 ti->flags &= ~SNDRV_TIMER_IFLG_RUNNING; 855 --timer->running; 856 list_del_init(&ti->active_list); 857 } 858 if ((timer->hw.flags & SNDRV_TIMER_HW_TASKLET) || 859 (ti->flags & SNDRV_TIMER_IFLG_FAST)) 860 ack_list_head = &timer->ack_list_head; 861 else 862 ack_list_head = &timer->sack_list_head; 863 if (list_empty(&ti->ack_list)) 864 list_add_tail(&ti->ack_list, ack_list_head); 865 list_for_each_entry(ts, &ti->slave_active_head, active_list) { 866 ts->pticks = ti->pticks; 867 ts->resolution = resolution; 868 if (list_empty(&ts->ack_list)) 869 list_add_tail(&ts->ack_list, ack_list_head); 870 } 871 } 872 if (timer->flags & SNDRV_TIMER_FLG_RESCHED) 873 snd_timer_reschedule(timer, timer->sticks); 874 if (timer->running) { 875 if (timer->hw.flags & SNDRV_TIMER_HW_STOP) { 876 timer->hw.stop(timer); 877 timer->flags |= SNDRV_TIMER_FLG_CHANGE; 878 } 879 if (!(timer->hw.flags & SNDRV_TIMER_HW_AUTO) || 880 (timer->flags & SNDRV_TIMER_FLG_CHANGE)) { 881 /* restart timer */ 882 timer->flags &= ~SNDRV_TIMER_FLG_CHANGE; 883 timer->hw.start(timer); 884 } 885 } else { 886 timer->hw.stop(timer); 887 } 888 889 /* now process all fast callbacks */ 890 snd_timer_process_callbacks(timer, &timer->ack_list_head); 891 892 /* do we have any slow callbacks? */ 893 use_tasklet = !list_empty(&timer->sack_list_head); 894 spin_unlock_irqrestore(&timer->lock, flags); 895 896 if (use_tasklet) 897 tasklet_schedule(&timer->task_queue); 898 } 899 EXPORT_SYMBOL(snd_timer_interrupt); 900 901 /* 902 903 */ 904 snd_timer_new(struct snd_card * card,char * id,struct snd_timer_id * tid,struct snd_timer ** rtimer)905 int snd_timer_new(struct snd_card *card, char *id, struct snd_timer_id *tid, 906 struct snd_timer **rtimer) 907 { 908 struct snd_timer *timer; 909 int err; 910 static struct snd_device_ops ops = { 911 .dev_free = snd_timer_dev_free, 912 .dev_register = snd_timer_dev_register, 913 .dev_disconnect = snd_timer_dev_disconnect, 914 }; 915 916 if (snd_BUG_ON(!tid)) 917 return -EINVAL; 918 if (tid->dev_class == SNDRV_TIMER_CLASS_CARD || 919 tid->dev_class == SNDRV_TIMER_CLASS_PCM) { 920 if (WARN_ON(!card)) 921 return -EINVAL; 922 } 923 if (rtimer) 924 *rtimer = NULL; 925 timer = kzalloc(sizeof(*timer), GFP_KERNEL); 926 if (!timer) 927 return -ENOMEM; 928 timer->tmr_class = tid->dev_class; 929 timer->card = card; 930 timer->tmr_device = tid->device; 931 timer->tmr_subdevice = tid->subdevice; 932 if (id) 933 strlcpy(timer->id, id, sizeof(timer->id)); 934 timer->sticks = 1; 935 INIT_LIST_HEAD(&timer->device_list); 936 INIT_LIST_HEAD(&timer->open_list_head); 937 INIT_LIST_HEAD(&timer->active_list_head); 938 INIT_LIST_HEAD(&timer->ack_list_head); 939 INIT_LIST_HEAD(&timer->sack_list_head); 940 spin_lock_init(&timer->lock); 941 tasklet_init(&timer->task_queue, snd_timer_tasklet, 942 (unsigned long)timer); 943 timer->max_instances = 1000; /* default limit per timer */ 944 if (card != NULL) { 945 timer->module = card->module; 946 err = snd_device_new(card, SNDRV_DEV_TIMER, timer, &ops); 947 if (err < 0) { 948 snd_timer_free(timer); 949 return err; 950 } 951 } 952 if (rtimer) 953 *rtimer = timer; 954 return 0; 955 } 956 EXPORT_SYMBOL(snd_timer_new); 957 snd_timer_free(struct snd_timer * timer)958 static int snd_timer_free(struct snd_timer *timer) 959 { 960 if (!timer) 961 return 0; 962 963 mutex_lock(®ister_mutex); 964 if (! list_empty(&timer->open_list_head)) { 965 struct list_head *p, *n; 966 struct snd_timer_instance *ti; 967 pr_warn("ALSA: timer %p is busy?\n", timer); 968 list_for_each_safe(p, n, &timer->open_list_head) { 969 list_del_init(p); 970 ti = list_entry(p, struct snd_timer_instance, open_list); 971 ti->timer = NULL; 972 } 973 } 974 list_del(&timer->device_list); 975 mutex_unlock(®ister_mutex); 976 977 if (timer->private_free) 978 timer->private_free(timer); 979 kfree(timer); 980 return 0; 981 } 982 snd_timer_dev_free(struct snd_device * device)983 static int snd_timer_dev_free(struct snd_device *device) 984 { 985 struct snd_timer *timer = device->device_data; 986 return snd_timer_free(timer); 987 } 988 snd_timer_dev_register(struct snd_device * dev)989 static int snd_timer_dev_register(struct snd_device *dev) 990 { 991 struct snd_timer *timer = dev->device_data; 992 struct snd_timer *timer1; 993 994 if (snd_BUG_ON(!timer || !timer->hw.start || !timer->hw.stop)) 995 return -ENXIO; 996 if (!(timer->hw.flags & SNDRV_TIMER_HW_SLAVE) && 997 !timer->hw.resolution && timer->hw.c_resolution == NULL) 998 return -EINVAL; 999 1000 mutex_lock(®ister_mutex); 1001 list_for_each_entry(timer1, &snd_timer_list, device_list) { 1002 if (timer1->tmr_class > timer->tmr_class) 1003 break; 1004 if (timer1->tmr_class < timer->tmr_class) 1005 continue; 1006 if (timer1->card && timer->card) { 1007 if (timer1->card->number > timer->card->number) 1008 break; 1009 if (timer1->card->number < timer->card->number) 1010 continue; 1011 } 1012 if (timer1->tmr_device > timer->tmr_device) 1013 break; 1014 if (timer1->tmr_device < timer->tmr_device) 1015 continue; 1016 if (timer1->tmr_subdevice > timer->tmr_subdevice) 1017 break; 1018 if (timer1->tmr_subdevice < timer->tmr_subdevice) 1019 continue; 1020 /* conflicts.. */ 1021 mutex_unlock(®ister_mutex); 1022 return -EBUSY; 1023 } 1024 list_add_tail(&timer->device_list, &timer1->device_list); 1025 mutex_unlock(®ister_mutex); 1026 return 0; 1027 } 1028 snd_timer_dev_disconnect(struct snd_device * device)1029 static int snd_timer_dev_disconnect(struct snd_device *device) 1030 { 1031 struct snd_timer *timer = device->device_data; 1032 struct snd_timer_instance *ti; 1033 1034 mutex_lock(®ister_mutex); 1035 list_del_init(&timer->device_list); 1036 /* wake up pending sleepers */ 1037 list_for_each_entry(ti, &timer->open_list_head, open_list) { 1038 if (ti->disconnect) 1039 ti->disconnect(ti); 1040 } 1041 mutex_unlock(®ister_mutex); 1042 return 0; 1043 } 1044 snd_timer_notify(struct snd_timer * timer,int event,struct timespec * tstamp)1045 void snd_timer_notify(struct snd_timer *timer, int event, struct timespec *tstamp) 1046 { 1047 unsigned long flags; 1048 unsigned long resolution = 0; 1049 struct snd_timer_instance *ti, *ts; 1050 1051 if (timer->card && timer->card->shutdown) 1052 return; 1053 if (! (timer->hw.flags & SNDRV_TIMER_HW_SLAVE)) 1054 return; 1055 if (snd_BUG_ON(event < SNDRV_TIMER_EVENT_MSTART || 1056 event > SNDRV_TIMER_EVENT_MRESUME)) 1057 return; 1058 spin_lock_irqsave(&timer->lock, flags); 1059 if (event == SNDRV_TIMER_EVENT_MSTART || 1060 event == SNDRV_TIMER_EVENT_MCONTINUE || 1061 event == SNDRV_TIMER_EVENT_MRESUME) 1062 resolution = snd_timer_hw_resolution(timer); 1063 list_for_each_entry(ti, &timer->active_list_head, active_list) { 1064 if (ti->ccallback) 1065 ti->ccallback(ti, event, tstamp, resolution); 1066 list_for_each_entry(ts, &ti->slave_active_head, active_list) 1067 if (ts->ccallback) 1068 ts->ccallback(ts, event, tstamp, resolution); 1069 } 1070 spin_unlock_irqrestore(&timer->lock, flags); 1071 } 1072 EXPORT_SYMBOL(snd_timer_notify); 1073 1074 /* 1075 * exported functions for global timers 1076 */ snd_timer_global_new(char * id,int device,struct snd_timer ** rtimer)1077 int snd_timer_global_new(char *id, int device, struct snd_timer **rtimer) 1078 { 1079 struct snd_timer_id tid; 1080 1081 tid.dev_class = SNDRV_TIMER_CLASS_GLOBAL; 1082 tid.dev_sclass = SNDRV_TIMER_SCLASS_NONE; 1083 tid.card = -1; 1084 tid.device = device; 1085 tid.subdevice = 0; 1086 return snd_timer_new(NULL, id, &tid, rtimer); 1087 } 1088 EXPORT_SYMBOL(snd_timer_global_new); 1089 snd_timer_global_free(struct snd_timer * timer)1090 int snd_timer_global_free(struct snd_timer *timer) 1091 { 1092 return snd_timer_free(timer); 1093 } 1094 EXPORT_SYMBOL(snd_timer_global_free); 1095 snd_timer_global_register(struct snd_timer * timer)1096 int snd_timer_global_register(struct snd_timer *timer) 1097 { 1098 struct snd_device dev; 1099 1100 memset(&dev, 0, sizeof(dev)); 1101 dev.device_data = timer; 1102 return snd_timer_dev_register(&dev); 1103 } 1104 EXPORT_SYMBOL(snd_timer_global_register); 1105 1106 /* 1107 * System timer 1108 */ 1109 1110 struct snd_timer_system_private { 1111 struct timer_list tlist; 1112 struct snd_timer *snd_timer; 1113 unsigned long last_expires; 1114 unsigned long last_jiffies; 1115 unsigned long correction; 1116 }; 1117 snd_timer_s_function(struct timer_list * t)1118 static void snd_timer_s_function(struct timer_list *t) 1119 { 1120 struct snd_timer_system_private *priv = from_timer(priv, t, 1121 tlist); 1122 struct snd_timer *timer = priv->snd_timer; 1123 unsigned long jiff = jiffies; 1124 if (time_after(jiff, priv->last_expires)) 1125 priv->correction += (long)jiff - (long)priv->last_expires; 1126 snd_timer_interrupt(timer, (long)jiff - (long)priv->last_jiffies); 1127 } 1128 snd_timer_s_start(struct snd_timer * timer)1129 static int snd_timer_s_start(struct snd_timer * timer) 1130 { 1131 struct snd_timer_system_private *priv; 1132 unsigned long njiff; 1133 1134 priv = (struct snd_timer_system_private *) timer->private_data; 1135 njiff = (priv->last_jiffies = jiffies); 1136 if (priv->correction > timer->sticks - 1) { 1137 priv->correction -= timer->sticks - 1; 1138 njiff++; 1139 } else { 1140 njiff += timer->sticks - priv->correction; 1141 priv->correction = 0; 1142 } 1143 priv->last_expires = njiff; 1144 mod_timer(&priv->tlist, njiff); 1145 return 0; 1146 } 1147 snd_timer_s_stop(struct snd_timer * timer)1148 static int snd_timer_s_stop(struct snd_timer * timer) 1149 { 1150 struct snd_timer_system_private *priv; 1151 unsigned long jiff; 1152 1153 priv = (struct snd_timer_system_private *) timer->private_data; 1154 del_timer(&priv->tlist); 1155 jiff = jiffies; 1156 if (time_before(jiff, priv->last_expires)) 1157 timer->sticks = priv->last_expires - jiff; 1158 else 1159 timer->sticks = 1; 1160 priv->correction = 0; 1161 return 0; 1162 } 1163 snd_timer_s_close(struct snd_timer * timer)1164 static int snd_timer_s_close(struct snd_timer *timer) 1165 { 1166 struct snd_timer_system_private *priv; 1167 1168 priv = (struct snd_timer_system_private *)timer->private_data; 1169 del_timer_sync(&priv->tlist); 1170 return 0; 1171 } 1172 1173 static struct snd_timer_hardware snd_timer_system = 1174 { 1175 .flags = SNDRV_TIMER_HW_FIRST | SNDRV_TIMER_HW_TASKLET, 1176 .resolution = 1000000000L / HZ, 1177 .ticks = 10000000L, 1178 .close = snd_timer_s_close, 1179 .start = snd_timer_s_start, 1180 .stop = snd_timer_s_stop 1181 }; 1182 snd_timer_free_system(struct snd_timer * timer)1183 static void snd_timer_free_system(struct snd_timer *timer) 1184 { 1185 kfree(timer->private_data); 1186 } 1187 snd_timer_register_system(void)1188 static int snd_timer_register_system(void) 1189 { 1190 struct snd_timer *timer; 1191 struct snd_timer_system_private *priv; 1192 int err; 1193 1194 err = snd_timer_global_new("system", SNDRV_TIMER_GLOBAL_SYSTEM, &timer); 1195 if (err < 0) 1196 return err; 1197 strcpy(timer->name, "system timer"); 1198 timer->hw = snd_timer_system; 1199 priv = kzalloc(sizeof(*priv), GFP_KERNEL); 1200 if (priv == NULL) { 1201 snd_timer_free(timer); 1202 return -ENOMEM; 1203 } 1204 priv->snd_timer = timer; 1205 timer_setup(&priv->tlist, snd_timer_s_function, 0); 1206 timer->private_data = priv; 1207 timer->private_free = snd_timer_free_system; 1208 return snd_timer_global_register(timer); 1209 } 1210 1211 #ifdef CONFIG_SND_PROC_FS 1212 /* 1213 * Info interface 1214 */ 1215 snd_timer_proc_read(struct snd_info_entry * entry,struct snd_info_buffer * buffer)1216 static void snd_timer_proc_read(struct snd_info_entry *entry, 1217 struct snd_info_buffer *buffer) 1218 { 1219 struct snd_timer *timer; 1220 struct snd_timer_instance *ti; 1221 1222 mutex_lock(®ister_mutex); 1223 list_for_each_entry(timer, &snd_timer_list, device_list) { 1224 if (timer->card && timer->card->shutdown) 1225 continue; 1226 switch (timer->tmr_class) { 1227 case SNDRV_TIMER_CLASS_GLOBAL: 1228 snd_iprintf(buffer, "G%i: ", timer->tmr_device); 1229 break; 1230 case SNDRV_TIMER_CLASS_CARD: 1231 snd_iprintf(buffer, "C%i-%i: ", 1232 timer->card->number, timer->tmr_device); 1233 break; 1234 case SNDRV_TIMER_CLASS_PCM: 1235 snd_iprintf(buffer, "P%i-%i-%i: ", timer->card->number, 1236 timer->tmr_device, timer->tmr_subdevice); 1237 break; 1238 default: 1239 snd_iprintf(buffer, "?%i-%i-%i-%i: ", timer->tmr_class, 1240 timer->card ? timer->card->number : -1, 1241 timer->tmr_device, timer->tmr_subdevice); 1242 } 1243 snd_iprintf(buffer, "%s :", timer->name); 1244 if (timer->hw.resolution) 1245 snd_iprintf(buffer, " %lu.%03luus (%lu ticks)", 1246 timer->hw.resolution / 1000, 1247 timer->hw.resolution % 1000, 1248 timer->hw.ticks); 1249 if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) 1250 snd_iprintf(buffer, " SLAVE"); 1251 snd_iprintf(buffer, "\n"); 1252 list_for_each_entry(ti, &timer->open_list_head, open_list) 1253 snd_iprintf(buffer, " Client %s : %s\n", 1254 ti->owner ? ti->owner : "unknown", 1255 ti->flags & (SNDRV_TIMER_IFLG_START | 1256 SNDRV_TIMER_IFLG_RUNNING) 1257 ? "running" : "stopped"); 1258 } 1259 mutex_unlock(®ister_mutex); 1260 } 1261 1262 static struct snd_info_entry *snd_timer_proc_entry; 1263 snd_timer_proc_init(void)1264 static void __init snd_timer_proc_init(void) 1265 { 1266 struct snd_info_entry *entry; 1267 1268 entry = snd_info_create_module_entry(THIS_MODULE, "timers", NULL); 1269 if (entry != NULL) { 1270 entry->c.text.read = snd_timer_proc_read; 1271 if (snd_info_register(entry) < 0) { 1272 snd_info_free_entry(entry); 1273 entry = NULL; 1274 } 1275 } 1276 snd_timer_proc_entry = entry; 1277 } 1278 snd_timer_proc_done(void)1279 static void __exit snd_timer_proc_done(void) 1280 { 1281 snd_info_free_entry(snd_timer_proc_entry); 1282 } 1283 #else /* !CONFIG_SND_PROC_FS */ 1284 #define snd_timer_proc_init() 1285 #define snd_timer_proc_done() 1286 #endif 1287 1288 /* 1289 * USER SPACE interface 1290 */ 1291 snd_timer_user_interrupt(struct snd_timer_instance * timeri,unsigned long resolution,unsigned long ticks)1292 static void snd_timer_user_interrupt(struct snd_timer_instance *timeri, 1293 unsigned long resolution, 1294 unsigned long ticks) 1295 { 1296 struct snd_timer_user *tu = timeri->callback_data; 1297 struct snd_timer_read *r; 1298 int prev; 1299 1300 spin_lock(&tu->qlock); 1301 if (tu->qused > 0) { 1302 prev = tu->qtail == 0 ? tu->queue_size - 1 : tu->qtail - 1; 1303 r = &tu->queue[prev]; 1304 if (r->resolution == resolution) { 1305 r->ticks += ticks; 1306 goto __wake; 1307 } 1308 } 1309 if (tu->qused >= tu->queue_size) { 1310 tu->overrun++; 1311 } else { 1312 r = &tu->queue[tu->qtail++]; 1313 tu->qtail %= tu->queue_size; 1314 r->resolution = resolution; 1315 r->ticks = ticks; 1316 tu->qused++; 1317 } 1318 __wake: 1319 spin_unlock(&tu->qlock); 1320 snd_kill_fasync(tu->fasync, SIGIO, POLL_IN); 1321 wake_up(&tu->qchange_sleep); 1322 } 1323 snd_timer_user_append_to_tqueue(struct snd_timer_user * tu,struct snd_timer_tread * tread)1324 static void snd_timer_user_append_to_tqueue(struct snd_timer_user *tu, 1325 struct snd_timer_tread *tread) 1326 { 1327 if (tu->qused >= tu->queue_size) { 1328 tu->overrun++; 1329 } else { 1330 memcpy(&tu->tqueue[tu->qtail++], tread, sizeof(*tread)); 1331 tu->qtail %= tu->queue_size; 1332 tu->qused++; 1333 } 1334 } 1335 snd_timer_user_ccallback(struct snd_timer_instance * timeri,int event,struct timespec * tstamp,unsigned long resolution)1336 static void snd_timer_user_ccallback(struct snd_timer_instance *timeri, 1337 int event, 1338 struct timespec *tstamp, 1339 unsigned long resolution) 1340 { 1341 struct snd_timer_user *tu = timeri->callback_data; 1342 struct snd_timer_tread r1; 1343 unsigned long flags; 1344 1345 if (event >= SNDRV_TIMER_EVENT_START && 1346 event <= SNDRV_TIMER_EVENT_PAUSE) 1347 tu->tstamp = *tstamp; 1348 if ((tu->filter & (1 << event)) == 0 || !tu->tread) 1349 return; 1350 memset(&r1, 0, sizeof(r1)); 1351 r1.event = event; 1352 r1.tstamp = *tstamp; 1353 r1.val = resolution; 1354 spin_lock_irqsave(&tu->qlock, flags); 1355 snd_timer_user_append_to_tqueue(tu, &r1); 1356 spin_unlock_irqrestore(&tu->qlock, flags); 1357 snd_kill_fasync(tu->fasync, SIGIO, POLL_IN); 1358 wake_up(&tu->qchange_sleep); 1359 } 1360 snd_timer_user_disconnect(struct snd_timer_instance * timeri)1361 static void snd_timer_user_disconnect(struct snd_timer_instance *timeri) 1362 { 1363 struct snd_timer_user *tu = timeri->callback_data; 1364 1365 tu->disconnected = true; 1366 wake_up(&tu->qchange_sleep); 1367 } 1368 snd_timer_user_tinterrupt(struct snd_timer_instance * timeri,unsigned long resolution,unsigned long ticks)1369 static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri, 1370 unsigned long resolution, 1371 unsigned long ticks) 1372 { 1373 struct snd_timer_user *tu = timeri->callback_data; 1374 struct snd_timer_tread *r, r1; 1375 struct timespec tstamp; 1376 int prev, append = 0; 1377 1378 memset(&r1, 0, sizeof(r1)); 1379 memset(&tstamp, 0, sizeof(tstamp)); 1380 spin_lock(&tu->qlock); 1381 if ((tu->filter & ((1 << SNDRV_TIMER_EVENT_RESOLUTION) | 1382 (1 << SNDRV_TIMER_EVENT_TICK))) == 0) { 1383 spin_unlock(&tu->qlock); 1384 return; 1385 } 1386 if (tu->last_resolution != resolution || ticks > 0) { 1387 if (timer_tstamp_monotonic) 1388 ktime_get_ts(&tstamp); 1389 else 1390 getnstimeofday(&tstamp); 1391 } 1392 if ((tu->filter & (1 << SNDRV_TIMER_EVENT_RESOLUTION)) && 1393 tu->last_resolution != resolution) { 1394 r1.event = SNDRV_TIMER_EVENT_RESOLUTION; 1395 r1.tstamp = tstamp; 1396 r1.val = resolution; 1397 snd_timer_user_append_to_tqueue(tu, &r1); 1398 tu->last_resolution = resolution; 1399 append++; 1400 } 1401 if ((tu->filter & (1 << SNDRV_TIMER_EVENT_TICK)) == 0) 1402 goto __wake; 1403 if (ticks == 0) 1404 goto __wake; 1405 if (tu->qused > 0) { 1406 prev = tu->qtail == 0 ? tu->queue_size - 1 : tu->qtail - 1; 1407 r = &tu->tqueue[prev]; 1408 if (r->event == SNDRV_TIMER_EVENT_TICK) { 1409 r->tstamp = tstamp; 1410 r->val += ticks; 1411 append++; 1412 goto __wake; 1413 } 1414 } 1415 r1.event = SNDRV_TIMER_EVENT_TICK; 1416 r1.tstamp = tstamp; 1417 r1.val = ticks; 1418 snd_timer_user_append_to_tqueue(tu, &r1); 1419 append++; 1420 __wake: 1421 spin_unlock(&tu->qlock); 1422 if (append == 0) 1423 return; 1424 snd_kill_fasync(tu->fasync, SIGIO, POLL_IN); 1425 wake_up(&tu->qchange_sleep); 1426 } 1427 realloc_user_queue(struct snd_timer_user * tu,int size)1428 static int realloc_user_queue(struct snd_timer_user *tu, int size) 1429 { 1430 struct snd_timer_read *queue = NULL; 1431 struct snd_timer_tread *tqueue = NULL; 1432 1433 if (tu->tread) { 1434 tqueue = kcalloc(size, sizeof(*tqueue), GFP_KERNEL); 1435 if (!tqueue) 1436 return -ENOMEM; 1437 } else { 1438 queue = kcalloc(size, sizeof(*queue), GFP_KERNEL); 1439 if (!queue) 1440 return -ENOMEM; 1441 } 1442 1443 spin_lock_irq(&tu->qlock); 1444 kfree(tu->queue); 1445 kfree(tu->tqueue); 1446 tu->queue_size = size; 1447 tu->queue = queue; 1448 tu->tqueue = tqueue; 1449 tu->qhead = tu->qtail = tu->qused = 0; 1450 spin_unlock_irq(&tu->qlock); 1451 1452 return 0; 1453 } 1454 snd_timer_user_open(struct inode * inode,struct file * file)1455 static int snd_timer_user_open(struct inode *inode, struct file *file) 1456 { 1457 struct snd_timer_user *tu; 1458 int err; 1459 1460 err = stream_open(inode, file); 1461 if (err < 0) 1462 return err; 1463 1464 tu = kzalloc(sizeof(*tu), GFP_KERNEL); 1465 if (tu == NULL) 1466 return -ENOMEM; 1467 spin_lock_init(&tu->qlock); 1468 init_waitqueue_head(&tu->qchange_sleep); 1469 mutex_init(&tu->ioctl_lock); 1470 tu->ticks = 1; 1471 if (realloc_user_queue(tu, 128) < 0) { 1472 kfree(tu); 1473 return -ENOMEM; 1474 } 1475 file->private_data = tu; 1476 return 0; 1477 } 1478 snd_timer_user_release(struct inode * inode,struct file * file)1479 static int snd_timer_user_release(struct inode *inode, struct file *file) 1480 { 1481 struct snd_timer_user *tu; 1482 1483 if (file->private_data) { 1484 tu = file->private_data; 1485 file->private_data = NULL; 1486 mutex_lock(&tu->ioctl_lock); 1487 if (tu->timeri) 1488 snd_timer_close(tu->timeri); 1489 mutex_unlock(&tu->ioctl_lock); 1490 snd_fasync_free(tu->fasync); 1491 kfree(tu->queue); 1492 kfree(tu->tqueue); 1493 kfree(tu); 1494 } 1495 return 0; 1496 } 1497 snd_timer_user_zero_id(struct snd_timer_id * id)1498 static void snd_timer_user_zero_id(struct snd_timer_id *id) 1499 { 1500 id->dev_class = SNDRV_TIMER_CLASS_NONE; 1501 id->dev_sclass = SNDRV_TIMER_SCLASS_NONE; 1502 id->card = -1; 1503 id->device = -1; 1504 id->subdevice = -1; 1505 } 1506 snd_timer_user_copy_id(struct snd_timer_id * id,struct snd_timer * timer)1507 static void snd_timer_user_copy_id(struct snd_timer_id *id, struct snd_timer *timer) 1508 { 1509 id->dev_class = timer->tmr_class; 1510 id->dev_sclass = SNDRV_TIMER_SCLASS_NONE; 1511 id->card = timer->card ? timer->card->number : -1; 1512 id->device = timer->tmr_device; 1513 id->subdevice = timer->tmr_subdevice; 1514 } 1515 snd_timer_user_next_device(struct snd_timer_id __user * _tid)1516 static int snd_timer_user_next_device(struct snd_timer_id __user *_tid) 1517 { 1518 struct snd_timer_id id; 1519 struct snd_timer *timer; 1520 struct list_head *p; 1521 1522 if (copy_from_user(&id, _tid, sizeof(id))) 1523 return -EFAULT; 1524 mutex_lock(®ister_mutex); 1525 if (id.dev_class < 0) { /* first item */ 1526 if (list_empty(&snd_timer_list)) 1527 snd_timer_user_zero_id(&id); 1528 else { 1529 timer = list_entry(snd_timer_list.next, 1530 struct snd_timer, device_list); 1531 snd_timer_user_copy_id(&id, timer); 1532 } 1533 } else { 1534 switch (id.dev_class) { 1535 case SNDRV_TIMER_CLASS_GLOBAL: 1536 id.device = id.device < 0 ? 0 : id.device + 1; 1537 list_for_each(p, &snd_timer_list) { 1538 timer = list_entry(p, struct snd_timer, device_list); 1539 if (timer->tmr_class > SNDRV_TIMER_CLASS_GLOBAL) { 1540 snd_timer_user_copy_id(&id, timer); 1541 break; 1542 } 1543 if (timer->tmr_device >= id.device) { 1544 snd_timer_user_copy_id(&id, timer); 1545 break; 1546 } 1547 } 1548 if (p == &snd_timer_list) 1549 snd_timer_user_zero_id(&id); 1550 break; 1551 case SNDRV_TIMER_CLASS_CARD: 1552 case SNDRV_TIMER_CLASS_PCM: 1553 if (id.card < 0) { 1554 id.card = 0; 1555 } else { 1556 if (id.device < 0) { 1557 id.device = 0; 1558 } else { 1559 if (id.subdevice < 0) 1560 id.subdevice = 0; 1561 else if (id.subdevice < INT_MAX) 1562 id.subdevice++; 1563 } 1564 } 1565 list_for_each(p, &snd_timer_list) { 1566 timer = list_entry(p, struct snd_timer, device_list); 1567 if (timer->tmr_class > id.dev_class) { 1568 snd_timer_user_copy_id(&id, timer); 1569 break; 1570 } 1571 if (timer->tmr_class < id.dev_class) 1572 continue; 1573 if (timer->card->number > id.card) { 1574 snd_timer_user_copy_id(&id, timer); 1575 break; 1576 } 1577 if (timer->card->number < id.card) 1578 continue; 1579 if (timer->tmr_device > id.device) { 1580 snd_timer_user_copy_id(&id, timer); 1581 break; 1582 } 1583 if (timer->tmr_device < id.device) 1584 continue; 1585 if (timer->tmr_subdevice > id.subdevice) { 1586 snd_timer_user_copy_id(&id, timer); 1587 break; 1588 } 1589 if (timer->tmr_subdevice < id.subdevice) 1590 continue; 1591 snd_timer_user_copy_id(&id, timer); 1592 break; 1593 } 1594 if (p == &snd_timer_list) 1595 snd_timer_user_zero_id(&id); 1596 break; 1597 default: 1598 snd_timer_user_zero_id(&id); 1599 } 1600 } 1601 mutex_unlock(®ister_mutex); 1602 if (copy_to_user(_tid, &id, sizeof(*_tid))) 1603 return -EFAULT; 1604 return 0; 1605 } 1606 snd_timer_user_ginfo(struct file * file,struct snd_timer_ginfo __user * _ginfo)1607 static int snd_timer_user_ginfo(struct file *file, 1608 struct snd_timer_ginfo __user *_ginfo) 1609 { 1610 struct snd_timer_ginfo *ginfo; 1611 struct snd_timer_id tid; 1612 struct snd_timer *t; 1613 struct list_head *p; 1614 int err = 0; 1615 1616 ginfo = memdup_user(_ginfo, sizeof(*ginfo)); 1617 if (IS_ERR(ginfo)) 1618 return PTR_ERR(ginfo); 1619 1620 tid = ginfo->tid; 1621 memset(ginfo, 0, sizeof(*ginfo)); 1622 ginfo->tid = tid; 1623 mutex_lock(®ister_mutex); 1624 t = snd_timer_find(&tid); 1625 if (t != NULL) { 1626 ginfo->card = t->card ? t->card->number : -1; 1627 if (t->hw.flags & SNDRV_TIMER_HW_SLAVE) 1628 ginfo->flags |= SNDRV_TIMER_FLG_SLAVE; 1629 strlcpy(ginfo->id, t->id, sizeof(ginfo->id)); 1630 strlcpy(ginfo->name, t->name, sizeof(ginfo->name)); 1631 ginfo->resolution = t->hw.resolution; 1632 if (t->hw.resolution_min > 0) { 1633 ginfo->resolution_min = t->hw.resolution_min; 1634 ginfo->resolution_max = t->hw.resolution_max; 1635 } 1636 list_for_each(p, &t->open_list_head) { 1637 ginfo->clients++; 1638 } 1639 } else { 1640 err = -ENODEV; 1641 } 1642 mutex_unlock(®ister_mutex); 1643 if (err >= 0 && copy_to_user(_ginfo, ginfo, sizeof(*ginfo))) 1644 err = -EFAULT; 1645 kfree(ginfo); 1646 return err; 1647 } 1648 timer_set_gparams(struct snd_timer_gparams * gparams)1649 static int timer_set_gparams(struct snd_timer_gparams *gparams) 1650 { 1651 struct snd_timer *t; 1652 int err; 1653 1654 mutex_lock(®ister_mutex); 1655 t = snd_timer_find(&gparams->tid); 1656 if (!t) { 1657 err = -ENODEV; 1658 goto _error; 1659 } 1660 if (!list_empty(&t->open_list_head)) { 1661 err = -EBUSY; 1662 goto _error; 1663 } 1664 if (!t->hw.set_period) { 1665 err = -ENOSYS; 1666 goto _error; 1667 } 1668 err = t->hw.set_period(t, gparams->period_num, gparams->period_den); 1669 _error: 1670 mutex_unlock(®ister_mutex); 1671 return err; 1672 } 1673 snd_timer_user_gparams(struct file * file,struct snd_timer_gparams __user * _gparams)1674 static int snd_timer_user_gparams(struct file *file, 1675 struct snd_timer_gparams __user *_gparams) 1676 { 1677 struct snd_timer_gparams gparams; 1678 1679 if (copy_from_user(&gparams, _gparams, sizeof(gparams))) 1680 return -EFAULT; 1681 return timer_set_gparams(&gparams); 1682 } 1683 snd_timer_user_gstatus(struct file * file,struct snd_timer_gstatus __user * _gstatus)1684 static int snd_timer_user_gstatus(struct file *file, 1685 struct snd_timer_gstatus __user *_gstatus) 1686 { 1687 struct snd_timer_gstatus gstatus; 1688 struct snd_timer_id tid; 1689 struct snd_timer *t; 1690 int err = 0; 1691 1692 if (copy_from_user(&gstatus, _gstatus, sizeof(gstatus))) 1693 return -EFAULT; 1694 tid = gstatus.tid; 1695 memset(&gstatus, 0, sizeof(gstatus)); 1696 gstatus.tid = tid; 1697 mutex_lock(®ister_mutex); 1698 t = snd_timer_find(&tid); 1699 if (t != NULL) { 1700 spin_lock_irq(&t->lock); 1701 gstatus.resolution = snd_timer_hw_resolution(t); 1702 if (t->hw.precise_resolution) { 1703 t->hw.precise_resolution(t, &gstatus.resolution_num, 1704 &gstatus.resolution_den); 1705 } else { 1706 gstatus.resolution_num = gstatus.resolution; 1707 gstatus.resolution_den = 1000000000uL; 1708 } 1709 spin_unlock_irq(&t->lock); 1710 } else { 1711 err = -ENODEV; 1712 } 1713 mutex_unlock(®ister_mutex); 1714 if (err >= 0 && copy_to_user(_gstatus, &gstatus, sizeof(gstatus))) 1715 err = -EFAULT; 1716 return err; 1717 } 1718 snd_timer_user_tselect(struct file * file,struct snd_timer_select __user * _tselect)1719 static int snd_timer_user_tselect(struct file *file, 1720 struct snd_timer_select __user *_tselect) 1721 { 1722 struct snd_timer_user *tu; 1723 struct snd_timer_select tselect; 1724 char str[32]; 1725 int err = 0; 1726 1727 tu = file->private_data; 1728 if (tu->timeri) { 1729 snd_timer_close(tu->timeri); 1730 tu->timeri = NULL; 1731 } 1732 if (copy_from_user(&tselect, _tselect, sizeof(tselect))) { 1733 err = -EFAULT; 1734 goto __err; 1735 } 1736 sprintf(str, "application %i", current->pid); 1737 if (tselect.id.dev_class != SNDRV_TIMER_CLASS_SLAVE) 1738 tselect.id.dev_sclass = SNDRV_TIMER_SCLASS_APPLICATION; 1739 err = snd_timer_open(&tu->timeri, str, &tselect.id, current->pid); 1740 if (err < 0) 1741 goto __err; 1742 1743 tu->timeri->flags |= SNDRV_TIMER_IFLG_FAST; 1744 tu->timeri->callback = tu->tread 1745 ? snd_timer_user_tinterrupt : snd_timer_user_interrupt; 1746 tu->timeri->ccallback = snd_timer_user_ccallback; 1747 tu->timeri->callback_data = (void *)tu; 1748 tu->timeri->disconnect = snd_timer_user_disconnect; 1749 1750 __err: 1751 return err; 1752 } 1753 snd_timer_user_info(struct file * file,struct snd_timer_info __user * _info)1754 static int snd_timer_user_info(struct file *file, 1755 struct snd_timer_info __user *_info) 1756 { 1757 struct snd_timer_user *tu; 1758 struct snd_timer_info *info; 1759 struct snd_timer *t; 1760 int err = 0; 1761 1762 tu = file->private_data; 1763 if (!tu->timeri) 1764 return -EBADFD; 1765 t = tu->timeri->timer; 1766 if (!t) 1767 return -EBADFD; 1768 1769 info = kzalloc(sizeof(*info), GFP_KERNEL); 1770 if (! info) 1771 return -ENOMEM; 1772 info->card = t->card ? t->card->number : -1; 1773 if (t->hw.flags & SNDRV_TIMER_HW_SLAVE) 1774 info->flags |= SNDRV_TIMER_FLG_SLAVE; 1775 strlcpy(info->id, t->id, sizeof(info->id)); 1776 strlcpy(info->name, t->name, sizeof(info->name)); 1777 info->resolution = t->hw.resolution; 1778 if (copy_to_user(_info, info, sizeof(*_info))) 1779 err = -EFAULT; 1780 kfree(info); 1781 return err; 1782 } 1783 snd_timer_user_params(struct file * file,struct snd_timer_params __user * _params)1784 static int snd_timer_user_params(struct file *file, 1785 struct snd_timer_params __user *_params) 1786 { 1787 struct snd_timer_user *tu; 1788 struct snd_timer_params params; 1789 struct snd_timer *t; 1790 int err; 1791 1792 tu = file->private_data; 1793 if (!tu->timeri) 1794 return -EBADFD; 1795 t = tu->timeri->timer; 1796 if (!t) 1797 return -EBADFD; 1798 if (copy_from_user(¶ms, _params, sizeof(params))) 1799 return -EFAULT; 1800 if (!(t->hw.flags & SNDRV_TIMER_HW_SLAVE)) { 1801 u64 resolution; 1802 1803 if (params.ticks < 1) { 1804 err = -EINVAL; 1805 goto _end; 1806 } 1807 1808 /* Don't allow resolution less than 1ms */ 1809 resolution = snd_timer_resolution(tu->timeri); 1810 resolution *= params.ticks; 1811 if (resolution < 1000000) { 1812 err = -EINVAL; 1813 goto _end; 1814 } 1815 } 1816 if (params.queue_size > 0 && 1817 (params.queue_size < 32 || params.queue_size > 1024)) { 1818 err = -EINVAL; 1819 goto _end; 1820 } 1821 if (params.filter & ~((1<<SNDRV_TIMER_EVENT_RESOLUTION)| 1822 (1<<SNDRV_TIMER_EVENT_TICK)| 1823 (1<<SNDRV_TIMER_EVENT_START)| 1824 (1<<SNDRV_TIMER_EVENT_STOP)| 1825 (1<<SNDRV_TIMER_EVENT_CONTINUE)| 1826 (1<<SNDRV_TIMER_EVENT_PAUSE)| 1827 (1<<SNDRV_TIMER_EVENT_SUSPEND)| 1828 (1<<SNDRV_TIMER_EVENT_RESUME)| 1829 (1<<SNDRV_TIMER_EVENT_MSTART)| 1830 (1<<SNDRV_TIMER_EVENT_MSTOP)| 1831 (1<<SNDRV_TIMER_EVENT_MCONTINUE)| 1832 (1<<SNDRV_TIMER_EVENT_MPAUSE)| 1833 (1<<SNDRV_TIMER_EVENT_MSUSPEND)| 1834 (1<<SNDRV_TIMER_EVENT_MRESUME))) { 1835 err = -EINVAL; 1836 goto _end; 1837 } 1838 snd_timer_stop(tu->timeri); 1839 spin_lock_irq(&t->lock); 1840 tu->timeri->flags &= ~(SNDRV_TIMER_IFLG_AUTO| 1841 SNDRV_TIMER_IFLG_EXCLUSIVE| 1842 SNDRV_TIMER_IFLG_EARLY_EVENT); 1843 if (params.flags & SNDRV_TIMER_PSFLG_AUTO) 1844 tu->timeri->flags |= SNDRV_TIMER_IFLG_AUTO; 1845 if (params.flags & SNDRV_TIMER_PSFLG_EXCLUSIVE) 1846 tu->timeri->flags |= SNDRV_TIMER_IFLG_EXCLUSIVE; 1847 if (params.flags & SNDRV_TIMER_PSFLG_EARLY_EVENT) 1848 tu->timeri->flags |= SNDRV_TIMER_IFLG_EARLY_EVENT; 1849 spin_unlock_irq(&t->lock); 1850 if (params.queue_size > 0 && 1851 (unsigned int)tu->queue_size != params.queue_size) { 1852 err = realloc_user_queue(tu, params.queue_size); 1853 if (err < 0) 1854 goto _end; 1855 } 1856 spin_lock_irq(&tu->qlock); 1857 tu->qhead = tu->qtail = tu->qused = 0; 1858 if (tu->timeri->flags & SNDRV_TIMER_IFLG_EARLY_EVENT) { 1859 if (tu->tread) { 1860 struct snd_timer_tread tread; 1861 memset(&tread, 0, sizeof(tread)); 1862 tread.event = SNDRV_TIMER_EVENT_EARLY; 1863 tread.tstamp.tv_sec = 0; 1864 tread.tstamp.tv_nsec = 0; 1865 tread.val = 0; 1866 snd_timer_user_append_to_tqueue(tu, &tread); 1867 } else { 1868 struct snd_timer_read *r = &tu->queue[0]; 1869 r->resolution = 0; 1870 r->ticks = 0; 1871 tu->qused++; 1872 tu->qtail++; 1873 } 1874 } 1875 tu->filter = params.filter; 1876 tu->ticks = params.ticks; 1877 spin_unlock_irq(&tu->qlock); 1878 err = 0; 1879 _end: 1880 if (copy_to_user(_params, ¶ms, sizeof(params))) 1881 return -EFAULT; 1882 return err; 1883 } 1884 snd_timer_user_status(struct file * file,struct snd_timer_status __user * _status)1885 static int snd_timer_user_status(struct file *file, 1886 struct snd_timer_status __user *_status) 1887 { 1888 struct snd_timer_user *tu; 1889 struct snd_timer_status status; 1890 1891 tu = file->private_data; 1892 if (!tu->timeri) 1893 return -EBADFD; 1894 memset(&status, 0, sizeof(status)); 1895 status.tstamp = tu->tstamp; 1896 status.resolution = snd_timer_resolution(tu->timeri); 1897 status.lost = tu->timeri->lost; 1898 status.overrun = tu->overrun; 1899 spin_lock_irq(&tu->qlock); 1900 status.queue = tu->qused; 1901 spin_unlock_irq(&tu->qlock); 1902 if (copy_to_user(_status, &status, sizeof(status))) 1903 return -EFAULT; 1904 return 0; 1905 } 1906 snd_timer_user_start(struct file * file)1907 static int snd_timer_user_start(struct file *file) 1908 { 1909 int err; 1910 struct snd_timer_user *tu; 1911 1912 tu = file->private_data; 1913 if (!tu->timeri) 1914 return -EBADFD; 1915 snd_timer_stop(tu->timeri); 1916 tu->timeri->lost = 0; 1917 tu->last_resolution = 0; 1918 err = snd_timer_start(tu->timeri, tu->ticks); 1919 if (err < 0) 1920 return err; 1921 return 0; 1922 } 1923 snd_timer_user_stop(struct file * file)1924 static int snd_timer_user_stop(struct file *file) 1925 { 1926 int err; 1927 struct snd_timer_user *tu; 1928 1929 tu = file->private_data; 1930 if (!tu->timeri) 1931 return -EBADFD; 1932 err = snd_timer_stop(tu->timeri); 1933 if (err < 0) 1934 return err; 1935 return 0; 1936 } 1937 snd_timer_user_continue(struct file * file)1938 static int snd_timer_user_continue(struct file *file) 1939 { 1940 int err; 1941 struct snd_timer_user *tu; 1942 1943 tu = file->private_data; 1944 if (!tu->timeri) 1945 return -EBADFD; 1946 /* start timer instead of continue if it's not used before */ 1947 if (!(tu->timeri->flags & SNDRV_TIMER_IFLG_PAUSED)) 1948 return snd_timer_user_start(file); 1949 tu->timeri->lost = 0; 1950 err = snd_timer_continue(tu->timeri); 1951 if (err < 0) 1952 return err; 1953 return 0; 1954 } 1955 snd_timer_user_pause(struct file * file)1956 static int snd_timer_user_pause(struct file *file) 1957 { 1958 int err; 1959 struct snd_timer_user *tu; 1960 1961 tu = file->private_data; 1962 if (!tu->timeri) 1963 return -EBADFD; 1964 err = snd_timer_pause(tu->timeri); 1965 if (err < 0) 1966 return err; 1967 return 0; 1968 } 1969 1970 enum { 1971 SNDRV_TIMER_IOCTL_START_OLD = _IO('T', 0x20), 1972 SNDRV_TIMER_IOCTL_STOP_OLD = _IO('T', 0x21), 1973 SNDRV_TIMER_IOCTL_CONTINUE_OLD = _IO('T', 0x22), 1974 SNDRV_TIMER_IOCTL_PAUSE_OLD = _IO('T', 0x23), 1975 }; 1976 __snd_timer_user_ioctl(struct file * file,unsigned int cmd,unsigned long arg)1977 static long __snd_timer_user_ioctl(struct file *file, unsigned int cmd, 1978 unsigned long arg) 1979 { 1980 struct snd_timer_user *tu; 1981 void __user *argp = (void __user *)arg; 1982 int __user *p = argp; 1983 1984 tu = file->private_data; 1985 switch (cmd) { 1986 case SNDRV_TIMER_IOCTL_PVERSION: 1987 return put_user(SNDRV_TIMER_VERSION, p) ? -EFAULT : 0; 1988 case SNDRV_TIMER_IOCTL_NEXT_DEVICE: 1989 return snd_timer_user_next_device(argp); 1990 case SNDRV_TIMER_IOCTL_TREAD: 1991 { 1992 int xarg, old_tread; 1993 1994 if (tu->timeri) /* too late */ 1995 return -EBUSY; 1996 if (get_user(xarg, p)) 1997 return -EFAULT; 1998 old_tread = tu->tread; 1999 tu->tread = xarg ? 1 : 0; 2000 if (tu->tread != old_tread && 2001 realloc_user_queue(tu, tu->queue_size) < 0) { 2002 tu->tread = old_tread; 2003 return -ENOMEM; 2004 } 2005 return 0; 2006 } 2007 case SNDRV_TIMER_IOCTL_GINFO: 2008 return snd_timer_user_ginfo(file, argp); 2009 case SNDRV_TIMER_IOCTL_GPARAMS: 2010 return snd_timer_user_gparams(file, argp); 2011 case SNDRV_TIMER_IOCTL_GSTATUS: 2012 return snd_timer_user_gstatus(file, argp); 2013 case SNDRV_TIMER_IOCTL_SELECT: 2014 return snd_timer_user_tselect(file, argp); 2015 case SNDRV_TIMER_IOCTL_INFO: 2016 return snd_timer_user_info(file, argp); 2017 case SNDRV_TIMER_IOCTL_PARAMS: 2018 return snd_timer_user_params(file, argp); 2019 case SNDRV_TIMER_IOCTL_STATUS: 2020 return snd_timer_user_status(file, argp); 2021 case SNDRV_TIMER_IOCTL_START: 2022 case SNDRV_TIMER_IOCTL_START_OLD: 2023 return snd_timer_user_start(file); 2024 case SNDRV_TIMER_IOCTL_STOP: 2025 case SNDRV_TIMER_IOCTL_STOP_OLD: 2026 return snd_timer_user_stop(file); 2027 case SNDRV_TIMER_IOCTL_CONTINUE: 2028 case SNDRV_TIMER_IOCTL_CONTINUE_OLD: 2029 return snd_timer_user_continue(file); 2030 case SNDRV_TIMER_IOCTL_PAUSE: 2031 case SNDRV_TIMER_IOCTL_PAUSE_OLD: 2032 return snd_timer_user_pause(file); 2033 } 2034 return -ENOTTY; 2035 } 2036 snd_timer_user_ioctl(struct file * file,unsigned int cmd,unsigned long arg)2037 static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, 2038 unsigned long arg) 2039 { 2040 struct snd_timer_user *tu = file->private_data; 2041 long ret; 2042 2043 mutex_lock(&tu->ioctl_lock); 2044 ret = __snd_timer_user_ioctl(file, cmd, arg); 2045 mutex_unlock(&tu->ioctl_lock); 2046 return ret; 2047 } 2048 snd_timer_user_fasync(int fd,struct file * file,int on)2049 static int snd_timer_user_fasync(int fd, struct file * file, int on) 2050 { 2051 struct snd_timer_user *tu; 2052 2053 tu = file->private_data; 2054 return snd_fasync_helper(fd, file, on, &tu->fasync); 2055 } 2056 snd_timer_user_read(struct file * file,char __user * buffer,size_t count,loff_t * offset)2057 static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, 2058 size_t count, loff_t *offset) 2059 { 2060 struct snd_timer_user *tu; 2061 long result = 0, unit; 2062 int qhead; 2063 int err = 0; 2064 2065 tu = file->private_data; 2066 unit = tu->tread ? sizeof(struct snd_timer_tread) : sizeof(struct snd_timer_read); 2067 mutex_lock(&tu->ioctl_lock); 2068 spin_lock_irq(&tu->qlock); 2069 while ((long)count - result >= unit) { 2070 while (!tu->qused) { 2071 wait_queue_entry_t wait; 2072 2073 if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) { 2074 err = -EAGAIN; 2075 goto _error; 2076 } 2077 2078 set_current_state(TASK_INTERRUPTIBLE); 2079 init_waitqueue_entry(&wait, current); 2080 add_wait_queue(&tu->qchange_sleep, &wait); 2081 2082 spin_unlock_irq(&tu->qlock); 2083 mutex_unlock(&tu->ioctl_lock); 2084 schedule(); 2085 mutex_lock(&tu->ioctl_lock); 2086 spin_lock_irq(&tu->qlock); 2087 2088 remove_wait_queue(&tu->qchange_sleep, &wait); 2089 2090 if (tu->disconnected) { 2091 err = -ENODEV; 2092 goto _error; 2093 } 2094 if (signal_pending(current)) { 2095 err = -ERESTARTSYS; 2096 goto _error; 2097 } 2098 } 2099 2100 qhead = tu->qhead++; 2101 tu->qhead %= tu->queue_size; 2102 tu->qused--; 2103 spin_unlock_irq(&tu->qlock); 2104 2105 if (tu->tread) { 2106 if (copy_to_user(buffer, &tu->tqueue[qhead], 2107 sizeof(struct snd_timer_tread))) 2108 err = -EFAULT; 2109 } else { 2110 if (copy_to_user(buffer, &tu->queue[qhead], 2111 sizeof(struct snd_timer_read))) 2112 err = -EFAULT; 2113 } 2114 2115 spin_lock_irq(&tu->qlock); 2116 if (err < 0) 2117 goto _error; 2118 result += unit; 2119 buffer += unit; 2120 } 2121 _error: 2122 spin_unlock_irq(&tu->qlock); 2123 mutex_unlock(&tu->ioctl_lock); 2124 return result > 0 ? result : err; 2125 } 2126 snd_timer_user_poll(struct file * file,poll_table * wait)2127 static __poll_t snd_timer_user_poll(struct file *file, poll_table * wait) 2128 { 2129 __poll_t mask; 2130 struct snd_timer_user *tu; 2131 2132 tu = file->private_data; 2133 2134 poll_wait(file, &tu->qchange_sleep, wait); 2135 2136 mask = 0; 2137 spin_lock_irq(&tu->qlock); 2138 if (tu->qused) 2139 mask |= EPOLLIN | EPOLLRDNORM; 2140 if (tu->disconnected) 2141 mask |= EPOLLERR; 2142 spin_unlock_irq(&tu->qlock); 2143 2144 return mask; 2145 } 2146 2147 #ifdef CONFIG_COMPAT 2148 #include "timer_compat.c" 2149 #else 2150 #define snd_timer_user_ioctl_compat NULL 2151 #endif 2152 2153 static const struct file_operations snd_timer_f_ops = 2154 { 2155 .owner = THIS_MODULE, 2156 .read = snd_timer_user_read, 2157 .open = snd_timer_user_open, 2158 .release = snd_timer_user_release, 2159 .llseek = no_llseek, 2160 .poll = snd_timer_user_poll, 2161 .unlocked_ioctl = snd_timer_user_ioctl, 2162 .compat_ioctl = snd_timer_user_ioctl_compat, 2163 .fasync = snd_timer_user_fasync, 2164 }; 2165 2166 /* unregister the system timer */ snd_timer_free_all(void)2167 static void snd_timer_free_all(void) 2168 { 2169 struct snd_timer *timer, *n; 2170 2171 list_for_each_entry_safe(timer, n, &snd_timer_list, device_list) 2172 snd_timer_free(timer); 2173 } 2174 2175 static struct device timer_dev; 2176 2177 /* 2178 * ENTRY functions 2179 */ 2180 alsa_timer_init(void)2181 static int __init alsa_timer_init(void) 2182 { 2183 int err; 2184 2185 snd_device_initialize(&timer_dev, NULL); 2186 dev_set_name(&timer_dev, "timer"); 2187 2188 #ifdef SNDRV_OSS_INFO_DEV_TIMERS 2189 snd_oss_info_register(SNDRV_OSS_INFO_DEV_TIMERS, SNDRV_CARDS - 1, 2190 "system timer"); 2191 #endif 2192 2193 err = snd_timer_register_system(); 2194 if (err < 0) { 2195 pr_err("ALSA: unable to register system timer (%i)\n", err); 2196 goto put_timer; 2197 } 2198 2199 err = snd_register_device(SNDRV_DEVICE_TYPE_TIMER, NULL, 0, 2200 &snd_timer_f_ops, NULL, &timer_dev); 2201 if (err < 0) { 2202 pr_err("ALSA: unable to register timer device (%i)\n", err); 2203 snd_timer_free_all(); 2204 goto put_timer; 2205 } 2206 2207 snd_timer_proc_init(); 2208 return 0; 2209 2210 put_timer: 2211 put_device(&timer_dev); 2212 return err; 2213 } 2214 alsa_timer_exit(void)2215 static void __exit alsa_timer_exit(void) 2216 { 2217 snd_unregister_device(&timer_dev); 2218 snd_timer_free_all(); 2219 put_device(&timer_dev); 2220 snd_timer_proc_done(); 2221 #ifdef SNDRV_OSS_INFO_DEV_TIMERS 2222 snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_TIMERS, SNDRV_CARDS - 1); 2223 #endif 2224 } 2225 2226 module_init(alsa_timer_init) 2227 module_exit(alsa_timer_exit) 2228