diff options
author | Takashi Iwai <tiwai@suse.de> | 2017-06-09 09:11:58 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2017-06-12 02:43:33 -0400 |
commit | 111b0cdb97d44cfe5dec1338a78ba8aff65c32e2 (patch) | |
tree | 41822f2d0878d180aa540a33ce4e79f19d34b10d /sound/drivers | |
parent | 8272115578ce02566b4c6bbe45f09d0d55f4a1c6 (diff) |
ALSA: seq: Allow the modular sequencer registration
Many drivers bind the sequencer stuff in off-load by another driver
module, so that it's loaded only on demand. In the current code, this
mechanism doesn't work when the driver is built-in while the sequencer
is module. We check with IS_REACHABLE() and enable only when the
sequencer is in the same level of build.
However, this is basically a overshoot. The binder code
(snd-seq-device) is an individual module from the sequencer core
(snd-seq), and we just have to make the former a built-in while
keeping the latter a module for allowing the scenario like the above.
This patch achieves that by rewriting Kconfig slightly. Now, a driver
that provides the manual sequencer device binding should select
CONFIG_SND_SEQ_DEVICE in a way as
select SND_SEQ_DEVICE if SND_SEQUENCER != n
Note that the "!=n" is needed here to avoid the influence of the
sequencer core is module while the driver is built-in.
Also, since rawmidi.o may be linked with snd_seq_device.o when
built-in, we have to shuffle the code to make the linker happy.
(the kernel linker isn't smart enough yet to handle such a case.)
That is, snd_seq_device.c is moved to sound/core from sound/core/seq,
as well as Makefile.
Last but not least, the patch replaces the code using IS_REACHABLE()
with IS_ENABLED(), since now the condition meets always when enabled.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/drivers')
-rw-r--r-- | sound/drivers/Kconfig | 2 | ||||
-rw-r--r-- | sound/drivers/opl3/opl3_lib.c | 2 | ||||
-rw-r--r-- | sound/drivers/opl4/opl4_lib.c | 4 | ||||
-rw-r--r-- | sound/drivers/opl4/opl4_local.h | 2 |
4 files changed, 6 insertions, 4 deletions
diff --git a/sound/drivers/Kconfig b/sound/drivers/Kconfig index 0e3dc80a7262..7144cc36e8ae 100644 --- a/sound/drivers/Kconfig +++ b/sound/drivers/Kconfig | |||
@@ -6,11 +6,13 @@ config SND_OPL3_LIB | |||
6 | tristate | 6 | tristate |
7 | select SND_TIMER | 7 | select SND_TIMER |
8 | select SND_HWDEP | 8 | select SND_HWDEP |
9 | select SND_SEQ_DEVICE if SND_SEQUENCER != n | ||
9 | 10 | ||
10 | config SND_OPL4_LIB | 11 | config SND_OPL4_LIB |
11 | tristate | 12 | tristate |
12 | select SND_TIMER | 13 | select SND_TIMER |
13 | select SND_HWDEP | 14 | select SND_HWDEP |
15 | select SND_SEQ_DEVICE if SND_SEQUENCER != n | ||
14 | 16 | ||
15 | # select SEQ stuff to min(SND_SEQUENCER,SND_XXX) | 17 | # select SEQ stuff to min(SND_SEQUENCER,SND_XXX) |
16 | config SND_OPL3_LIB_SEQ | 18 | config SND_OPL3_LIB_SEQ |
diff --git a/sound/drivers/opl3/opl3_lib.c b/sound/drivers/opl3/opl3_lib.c index cd9e9f31720f..d5e5b4657b4b 100644 --- a/sound/drivers/opl3/opl3_lib.c +++ b/sound/drivers/opl3/opl3_lib.c | |||
@@ -528,7 +528,7 @@ int snd_opl3_hwdep_new(struct snd_opl3 * opl3, | |||
528 | 528 | ||
529 | opl3->hwdep = hw; | 529 | opl3->hwdep = hw; |
530 | opl3->seq_dev_num = seq_device; | 530 | opl3->seq_dev_num = seq_device; |
531 | #if IS_REACHABLE(CONFIG_SND_SEQUENCER) | 531 | #if IS_ENABLED(CONFIG_SND_SEQUENCER) |
532 | if (snd_seq_device_new(card, seq_device, SNDRV_SEQ_DEV_ID_OPL3, | 532 | if (snd_seq_device_new(card, seq_device, SNDRV_SEQ_DEV_ID_OPL3, |
533 | sizeof(struct snd_opl3 *), &opl3->seq_dev) >= 0) { | 533 | sizeof(struct snd_opl3 *), &opl3->seq_dev) >= 0) { |
534 | strcpy(opl3->seq_dev->name, hw->name); | 534 | strcpy(opl3->seq_dev->name, hw->name); |
diff --git a/sound/drivers/opl4/opl4_lib.c b/sound/drivers/opl4/opl4_lib.c index 240656e54400..bc345d564f8d 100644 --- a/sound/drivers/opl4/opl4_lib.c +++ b/sound/drivers/opl4/opl4_lib.c | |||
@@ -153,7 +153,7 @@ static int snd_opl4_detect(struct snd_opl4 *opl4) | |||
153 | return 0; | 153 | return 0; |
154 | } | 154 | } |
155 | 155 | ||
156 | #if IS_REACHABLE(CONFIG_SND_SEQUENCER) | 156 | #if IS_ENABLED(CONFIG_SND_SEQUENCER) |
157 | static void snd_opl4_seq_dev_free(struct snd_seq_device *seq_dev) | 157 | static void snd_opl4_seq_dev_free(struct snd_seq_device *seq_dev) |
158 | { | 158 | { |
159 | struct snd_opl4 *opl4 = seq_dev->private_data; | 159 | struct snd_opl4 *opl4 = seq_dev->private_data; |
@@ -249,7 +249,7 @@ int snd_opl4_create(struct snd_card *card, | |||
249 | snd_opl4_create_mixer(opl4); | 249 | snd_opl4_create_mixer(opl4); |
250 | snd_opl4_create_proc(opl4); | 250 | snd_opl4_create_proc(opl4); |
251 | 251 | ||
252 | #if IS_REACHABLE(CONFIG_SND_SEQUENCER) | 252 | #if IS_ENABLED(CONFIG_SND_SEQUENCER) |
253 | opl4->seq_client = -1; | 253 | opl4->seq_client = -1; |
254 | if (opl4->hardware < OPL3_HW_OPL4_ML) | 254 | if (opl4->hardware < OPL3_HW_OPL4_ML) |
255 | snd_opl4_create_seq_dev(opl4, seq_device); | 255 | snd_opl4_create_seq_dev(opl4, seq_device); |
diff --git a/sound/drivers/opl4/opl4_local.h b/sound/drivers/opl4/opl4_local.h index d5bac93f8245..a16b4677c1e9 100644 --- a/sound/drivers/opl4/opl4_local.h +++ b/sound/drivers/opl4/opl4_local.h | |||
@@ -184,7 +184,7 @@ struct snd_opl4 { | |||
184 | #endif | 184 | #endif |
185 | struct mutex access_mutex; | 185 | struct mutex access_mutex; |
186 | 186 | ||
187 | #if IS_REACHABLE(CONFIG_SND_SEQUENCER) | 187 | #if IS_ENABLED(CONFIG_SND_SEQUENCER) |
188 | int used; | 188 | int used; |
189 | 189 | ||
190 | int seq_dev_num; | 190 | int seq_dev_num; |