]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
[ALSA] timers: add module refcounting for global timers
authorClemens Ladisch <clemens@ladisch.de>
Wed, 12 Oct 2005 15:12:31 +0000 (17:12 +0200)
committerJaroslav Kysela <perex@suse.cz>
Fri, 4 Nov 2005 12:18:43 +0000 (13:18 +0100)
Modules: RTC timer driver,Timer Midlevel

Add a module pointer to the timer structure and use it for refcounting
instead of the card's module pointer to prevent the global timer
modules (rtctimer and hpetimer) from being removed while in use.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
include/sound/timer.h
sound/core/rtctimer.c
sound/core/timer.c

index 1898511a0f389d53a61023d68d7ad2c2f0b8df9c..b55f38ae56e13ed3428f189a09a39a8ff4566cf0 100644 (file)
@@ -88,6 +88,7 @@ struct _snd_timer_hardware {
 struct _snd_timer {
        snd_timer_class_t tmr_class;
        snd_card_t *card;
+       struct module *module;
        int tmr_device;
        int tmr_subdevice;
        char id[64];
index 8762ff8938c22b0a5ea142b6dc3a250f99c063d7..c3c18568207e4f1a70bfd7bba7318dd69bb98660 100644 (file)
@@ -124,7 +124,8 @@ static int __init rtctimer_init(void)
 
        if (rtctimer_freq < 2 || rtctimer_freq > 8192 ||
            (rtctimer_freq & (rtctimer_freq - 1)) != 0) {
-               snd_printk(KERN_ERR "rtctimer: invalid frequency %d\n", rtctimer_freq);
+               snd_printk(KERN_ERR "rtctimer: invalid frequency %d\n",
+                          rtctimer_freq);
                return -EINVAL;
        }
 
@@ -133,6 +134,7 @@ static int __init rtctimer_init(void)
        if (err < 0)
                return err;
 
+       timer->module = THIS_MODULE;
        strcpy(timer->name, "RTC timer");
        timer->hw = rtc_hw;
        timer->hw.resolution = NANO_SEC / rtctimer_freq;
index b02681eaea75668883ee6fb7050d3ce9fcd7487b..c8496c7b8df8d58fdc41d5f211eb5427f400c94c 100644 (file)
@@ -113,7 +113,7 @@ static snd_timer_instance_t *snd_timer_instance_new(char *owner, snd_timer_t *ti
        INIT_LIST_HEAD(&timeri->slave_active_head);
 
        timeri->timer = timer;
-       if (timer && timer->card && !try_module_get(timer->card->module)) {
+       if (timer && !try_module_get(timer->module)) {
                kfree(timeri->owner);
                kfree(timeri);
                return NULL;
@@ -363,8 +363,8 @@ int snd_timer_close(snd_timer_instance_t * timeri)
                timeri->private_free(timeri);
        kfree(timeri->owner);
        kfree(timeri);
-       if (timer && timer->card)
-               module_put(timer->card->module);
+       if (timer)
+               module_put(timer->module);
        return 0;
 }
 
@@ -787,6 +787,7 @@ int snd_timer_new(snd_card_t *card, char *id, snd_timer_id_t *tid, snd_timer_t *
        spin_lock_init(&timer->lock);
        tasklet_init(&timer->task_queue, snd_timer_tasklet, (unsigned long)timer);
        if (card != NULL) {
+               timer->module = card->module;
                if ((err = snd_device_new(card, SNDRV_DEV_TIMER, timer, &ops)) < 0) {
                        snd_timer_free(timer);
                        return err;