diff options
Diffstat (limited to 'sound/core/timer.c')
-rw-r--r-- | sound/core/timer.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/sound/core/timer.c b/sound/core/timer.c index a44235555896..490b489d713d 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c | |||
@@ -1940,6 +1940,17 @@ static const struct file_operations snd_timer_f_ops = | |||
1940 | .fasync = snd_timer_user_fasync, | 1940 | .fasync = snd_timer_user_fasync, |
1941 | }; | 1941 | }; |
1942 | 1942 | ||
1943 | /* unregister the system timer */ | ||
1944 | static void snd_timer_free_all(void) | ||
1945 | { | ||
1946 | struct snd_timer *timer, *n; | ||
1947 | |||
1948 | list_for_each_entry_safe(timer, n, &snd_timer_list, device_list) | ||
1949 | snd_timer_free(timer); | ||
1950 | } | ||
1951 | |||
1952 | static struct device timer_dev; | ||
1953 | |||
1943 | /* | 1954 | /* |
1944 | * ENTRY functions | 1955 | * ENTRY functions |
1945 | */ | 1956 | */ |
@@ -1948,30 +1959,39 @@ static int __init alsa_timer_init(void) | |||
1948 | { | 1959 | { |
1949 | int err; | 1960 | int err; |
1950 | 1961 | ||
1962 | snd_device_initialize(&timer_dev, NULL); | ||
1963 | dev_set_name(&timer_dev, "timer"); | ||
1964 | |||
1951 | #ifdef SNDRV_OSS_INFO_DEV_TIMERS | 1965 | #ifdef SNDRV_OSS_INFO_DEV_TIMERS |
1952 | snd_oss_info_register(SNDRV_OSS_INFO_DEV_TIMERS, SNDRV_CARDS - 1, | 1966 | snd_oss_info_register(SNDRV_OSS_INFO_DEV_TIMERS, SNDRV_CARDS - 1, |
1953 | "system timer"); | 1967 | "system timer"); |
1954 | #endif | 1968 | #endif |
1955 | 1969 | ||
1956 | if ((err = snd_timer_register_system()) < 0) | 1970 | err = snd_timer_register_system(); |
1971 | if (err < 0) { | ||
1957 | pr_err("ALSA: unable to register system timer (%i)\n", err); | 1972 | pr_err("ALSA: unable to register system timer (%i)\n", err); |
1958 | if ((err = snd_register_device(SNDRV_DEVICE_TYPE_TIMER, NULL, 0, | 1973 | put_device(&timer_dev); |
1959 | &snd_timer_f_ops, NULL, "timer")) < 0) | 1974 | return err; |
1975 | } | ||
1976 | |||
1977 | err = snd_register_device(SNDRV_DEVICE_TYPE_TIMER, NULL, 0, | ||
1978 | &snd_timer_f_ops, NULL, &timer_dev); | ||
1979 | if (err < 0) { | ||
1960 | pr_err("ALSA: unable to register timer device (%i)\n", err); | 1980 | pr_err("ALSA: unable to register timer device (%i)\n", err); |
1981 | snd_timer_free_all(); | ||
1982 | put_device(&timer_dev); | ||
1983 | return err; | ||
1984 | } | ||
1985 | |||
1961 | snd_timer_proc_init(); | 1986 | snd_timer_proc_init(); |
1962 | return 0; | 1987 | return 0; |
1963 | } | 1988 | } |
1964 | 1989 | ||
1965 | static void __exit alsa_timer_exit(void) | 1990 | static void __exit alsa_timer_exit(void) |
1966 | { | 1991 | { |
1967 | struct list_head *p, *n; | 1992 | snd_unregister_device(&timer_dev); |
1968 | 1993 | snd_timer_free_all(); | |
1969 | snd_unregister_device(SNDRV_DEVICE_TYPE_TIMER, NULL, 0); | 1994 | put_device(&timer_dev); |
1970 | /* unregister the system timer */ | ||
1971 | list_for_each_safe(p, n, &snd_timer_list) { | ||
1972 | struct snd_timer *timer = list_entry(p, struct snd_timer, device_list); | ||
1973 | snd_timer_free(timer); | ||
1974 | } | ||
1975 | snd_timer_proc_done(); | 1995 | snd_timer_proc_done(); |
1976 | #ifdef SNDRV_OSS_INFO_DEV_TIMERS | 1996 | #ifdef SNDRV_OSS_INFO_DEV_TIMERS |
1977 | snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_TIMERS, SNDRV_CARDS - 1); | 1997 | snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_TIMERS, SNDRV_CARDS - 1); |