xref: /OK3568_Linux_fs/kernel/sound/core/seq/seq.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  ALSA sequencer main module
4*4882a593Smuzhiyun  *  Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/init.h>
8*4882a593Smuzhiyun #include <linux/module.h>
9*4882a593Smuzhiyun #include <linux/device.h>
10*4882a593Smuzhiyun #include <sound/core.h>
11*4882a593Smuzhiyun #include <sound/initval.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <sound/seq_kernel.h>
14*4882a593Smuzhiyun #include "seq_clientmgr.h"
15*4882a593Smuzhiyun #include "seq_memory.h"
16*4882a593Smuzhiyun #include "seq_queue.h"
17*4882a593Smuzhiyun #include "seq_lock.h"
18*4882a593Smuzhiyun #include "seq_timer.h"
19*4882a593Smuzhiyun #include "seq_system.h"
20*4882a593Smuzhiyun #include "seq_info.h"
21*4882a593Smuzhiyun #include <sound/minors.h>
22*4882a593Smuzhiyun #include <sound/seq_device.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #if defined(CONFIG_SND_SEQ_DUMMY_MODULE)
25*4882a593Smuzhiyun int seq_client_load[15] = {[0] = SNDRV_SEQ_CLIENT_DUMMY, [1 ... 14] = -1};
26*4882a593Smuzhiyun #else
27*4882a593Smuzhiyun int seq_client_load[15] = {[0 ... 14] = -1};
28*4882a593Smuzhiyun #endif
29*4882a593Smuzhiyun int seq_default_timer_class = SNDRV_TIMER_CLASS_GLOBAL;
30*4882a593Smuzhiyun int seq_default_timer_sclass = SNDRV_TIMER_SCLASS_NONE;
31*4882a593Smuzhiyun int seq_default_timer_card = -1;
32*4882a593Smuzhiyun int seq_default_timer_device =
33*4882a593Smuzhiyun #ifdef CONFIG_SND_SEQ_HRTIMER_DEFAULT
34*4882a593Smuzhiyun 	SNDRV_TIMER_GLOBAL_HRTIMER
35*4882a593Smuzhiyun #else
36*4882a593Smuzhiyun 	SNDRV_TIMER_GLOBAL_SYSTEM
37*4882a593Smuzhiyun #endif
38*4882a593Smuzhiyun 	;
39*4882a593Smuzhiyun int seq_default_timer_subdevice = 0;
40*4882a593Smuzhiyun int seq_default_timer_resolution = 0;	/* Hz */
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun MODULE_AUTHOR("Frank van de Pol <fvdpol@coil.demon.nl>, Jaroslav Kysela <perex@perex.cz>");
43*4882a593Smuzhiyun MODULE_DESCRIPTION("Advanced Linux Sound Architecture sequencer.");
44*4882a593Smuzhiyun MODULE_LICENSE("GPL");
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun module_param_array(seq_client_load, int, NULL, 0444);
47*4882a593Smuzhiyun MODULE_PARM_DESC(seq_client_load, "The numbers of global (system) clients to load through kmod.");
48*4882a593Smuzhiyun module_param(seq_default_timer_class, int, 0644);
49*4882a593Smuzhiyun MODULE_PARM_DESC(seq_default_timer_class, "The default timer class.");
50*4882a593Smuzhiyun module_param(seq_default_timer_sclass, int, 0644);
51*4882a593Smuzhiyun MODULE_PARM_DESC(seq_default_timer_sclass, "The default timer slave class.");
52*4882a593Smuzhiyun module_param(seq_default_timer_card, int, 0644);
53*4882a593Smuzhiyun MODULE_PARM_DESC(seq_default_timer_card, "The default timer card number.");
54*4882a593Smuzhiyun module_param(seq_default_timer_device, int, 0644);
55*4882a593Smuzhiyun MODULE_PARM_DESC(seq_default_timer_device, "The default timer device number.");
56*4882a593Smuzhiyun module_param(seq_default_timer_subdevice, int, 0644);
57*4882a593Smuzhiyun MODULE_PARM_DESC(seq_default_timer_subdevice, "The default timer subdevice number.");
58*4882a593Smuzhiyun module_param(seq_default_timer_resolution, int, 0644);
59*4882a593Smuzhiyun MODULE_PARM_DESC(seq_default_timer_resolution, "The default timer resolution in Hz.");
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun MODULE_ALIAS_CHARDEV(CONFIG_SND_MAJOR, SNDRV_MINOR_SEQUENCER);
62*4882a593Smuzhiyun MODULE_ALIAS("devname:snd/seq");
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /*
65*4882a593Smuzhiyun  *  INIT PART
66*4882a593Smuzhiyun  */
67*4882a593Smuzhiyun 
alsa_seq_init(void)68*4882a593Smuzhiyun static int __init alsa_seq_init(void)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	int err;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	err = client_init_data();
73*4882a593Smuzhiyun 	if (err < 0)
74*4882a593Smuzhiyun 		goto error;
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	/* register sequencer device */
77*4882a593Smuzhiyun 	err = snd_sequencer_device_init();
78*4882a593Smuzhiyun 	if (err < 0)
79*4882a593Smuzhiyun 		goto error;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	/* register proc interface */
82*4882a593Smuzhiyun 	err = snd_seq_info_init();
83*4882a593Smuzhiyun 	if (err < 0)
84*4882a593Smuzhiyun 		goto error_device;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	/* register our internal client */
87*4882a593Smuzhiyun 	err = snd_seq_system_client_init();
88*4882a593Smuzhiyun 	if (err < 0)
89*4882a593Smuzhiyun 		goto error_info;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	snd_seq_autoload_init();
92*4882a593Smuzhiyun 	return 0;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun  error_info:
95*4882a593Smuzhiyun 	snd_seq_info_done();
96*4882a593Smuzhiyun  error_device:
97*4882a593Smuzhiyun 	snd_sequencer_device_done();
98*4882a593Smuzhiyun  error:
99*4882a593Smuzhiyun 	return err;
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun 
alsa_seq_exit(void)102*4882a593Smuzhiyun static void __exit alsa_seq_exit(void)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun 	/* unregister our internal client */
105*4882a593Smuzhiyun 	snd_seq_system_client_done();
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	/* unregister proc interface */
108*4882a593Smuzhiyun 	snd_seq_info_done();
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun 	/* delete timing queues */
111*4882a593Smuzhiyun 	snd_seq_queues_delete();
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	/* unregister sequencer device */
114*4882a593Smuzhiyun 	snd_sequencer_device_done();
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	snd_seq_autoload_exit();
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun module_init(alsa_seq_init)
120*4882a593Smuzhiyun module_exit(alsa_seq_exit)
121