|
@@ -899,11 +899,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;
|
|
@@ -913,13 +908,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(®ister_mutex);
|
|
|
return 0;
|
|
@@ -1227,6 +1217,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)
|
|
@@ -1600,6 +1598,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:
|