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