summaryrefslogtreecommitdiff
path: root/sound/core/timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/core/timer.c')
-rw-r--r--sound/core/timer.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/sound/core/timer.c b/sound/core/timer.c
index f24c9fccf..dca817fc7 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -929,11 +929,6 @@ static int snd_timer_dev_register(struct snd_device *dev)
return 0;
}
-/* just for reference in snd_timer_dev_disconnect() below */
-static void snd_timer_user_ccallback(struct snd_timer_instance *timeri,
- int event, struct timespec *tstamp,
- unsigned long resolution);
-
static int snd_timer_dev_disconnect(struct snd_device *device)
{
struct snd_timer *timer = device->device_data;
@@ -943,13 +938,8 @@ static int snd_timer_dev_disconnect(struct snd_device *device)
list_del_init(&timer->device_list);
/* wake up pending sleepers */
list_for_each_entry(ti, &timer->open_list_head, open_list) {
- /* FIXME: better to have a ti.disconnect() op */
- if (ti->ccallback == snd_timer_user_ccallback) {
- struct snd_timer_user *tu = ti->callback_data;
-
- tu->disconnected = true;
- wake_up(&tu->qchange_sleep);
- }
+ if (ti->disconnect)
+ ti->disconnect(ti);
}
mutex_unlock(&register_mutex);
return 0;
@@ -1072,11 +1062,21 @@ static int snd_timer_s_stop(struct snd_timer * timer)
return 0;
}
+static int snd_timer_s_close(struct snd_timer *timer)
+{
+ struct snd_timer_system_private *priv;
+
+ priv = (struct snd_timer_system_private *)timer->private_data;
+ del_timer_sync(&priv->tlist);
+ return 0;
+}
+
static struct snd_timer_hardware snd_timer_system =
{
.flags = SNDRV_TIMER_HW_FIRST | SNDRV_TIMER_HW_TASKLET,
.resolution = 1000000000L / HZ,
.ticks = 10000000L,
+ .close = snd_timer_s_close,
.start = snd_timer_s_start,
.stop = snd_timer_s_stop
};
@@ -1257,6 +1257,14 @@ static void snd_timer_user_ccallback(struct snd_timer_instance *timeri,
wake_up(&tu->qchange_sleep);
}
+static void snd_timer_user_disconnect(struct snd_timer_instance *timeri)
+{
+ struct snd_timer_user *tu = timeri->callback_data;
+
+ tu->disconnected = true;
+ wake_up(&tu->qchange_sleep);
+}
+
static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri,
unsigned long resolution,
unsigned long ticks)
@@ -1630,6 +1638,7 @@ static int snd_timer_user_tselect(struct file *file,
? snd_timer_user_tinterrupt : snd_timer_user_interrupt;
tu->timeri->ccallback = snd_timer_user_ccallback;
tu->timeri->callback_data = (void *)tu;
+ tu->timeri->disconnect = snd_timer_user_disconnect;
}
__err: