aboutsummaryrefslogtreecommitdiffstats
path: root/sound/isa/sb
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2007-04-26 08:13:44 -0400
committerJaroslav Kysela <perex@suse.cz>2007-05-11 10:56:11 -0400
commitb7dd2b349a9fa9e4347780c2bbb41e51484b5bb5 (patch)
treef5b896fd062a410e46bc35963fe15cdaed38f654 /sound/isa/sb
parentf223a9fc3d5707c354588570e2cf1f3abf6b1f84 (diff)
[ALSA] Don't use request_firmware if internal firmwares are defined
Don't use request_firmware() if the internal firmwares are defined via Kconfig. Otherwise it results in a significant delay at loading time (minutes). Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Diffstat (limited to 'sound/isa/sb')
-rw-r--r--sound/isa/sb/sb16_csp.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/sound/isa/sb/sb16_csp.c b/sound/isa/sb/sb16_csp.c
index ef71e50744e9..92e2bc413178 100644
--- a/sound/isa/sb/sb16_csp.c
+++ b/sound/isa/sb/sb16_csp.c
@@ -161,13 +161,17 @@ int snd_sb_csp_new(struct snd_sb *chip, int device, struct snd_hwdep ** rhwdep)
161 */ 161 */
162static void snd_sb_csp_free(struct snd_hwdep *hwdep) 162static void snd_sb_csp_free(struct snd_hwdep *hwdep)
163{ 163{
164#ifndef CONFIG_SND_SB16_CSP_FIRMWARE_IN_KERNEL
164 int i; 165 int i;
166#endif
165 struct snd_sb_csp *p = hwdep->private_data; 167 struct snd_sb_csp *p = hwdep->private_data;
166 if (p) { 168 if (p) {
167 if (p->running & SNDRV_SB_CSP_ST_RUNNING) 169 if (p->running & SNDRV_SB_CSP_ST_RUNNING)
168 snd_sb_csp_stop(p); 170 snd_sb_csp_stop(p);
171#ifndef CONFIG_SND_SB16_CSP_FIRMWARE_IN_KERNEL
169 for (i = 0; i < ARRAY_SIZE(p->csp_programs); ++i) 172 for (i = 0; i < ARRAY_SIZE(p->csp_programs); ++i)
170 release_firmware(p->csp_programs[i]); 173 release_firmware(p->csp_programs[i]);
174#endif
171 kfree(p); 175 kfree(p);
172 } 176 }
173} 177}
@@ -712,22 +716,19 @@ static int snd_sb_csp_firmware_load(struct snd_sb_csp *p, int index, int flags)
712 "sb16/ima_adpcm_capture.csp", 716 "sb16/ima_adpcm_capture.csp",
713 }; 717 };
714 const struct firmware *program; 718 const struct firmware *program;
715 int err;
716 719
717 BUILD_BUG_ON(ARRAY_SIZE(names) != CSP_PROGRAM_COUNT); 720 BUILD_BUG_ON(ARRAY_SIZE(names) != CSP_PROGRAM_COUNT);
718 program = p->csp_programs[index]; 721 program = p->csp_programs[index];
719 if (!program) { 722 if (!program) {
720 err = request_firmware(&program, names[index],
721 p->chip->card->dev);
722 if (err >= 0)
723 p->csp_programs[index] = program;
724 else {
725#ifdef CONFIG_SND_SB16_CSP_FIRMWARE_IN_KERNEL 723#ifdef CONFIG_SND_SB16_CSP_FIRMWARE_IN_KERNEL
726 program = &snd_sb_csp_static_programs[index]; 724 program = &snd_sb_csp_static_programs[index];
727#else 725#else
726 int err = request_firmware(&program, names[index],
727 p->chip->card->dev);
728 if (err < 0)
728 return err; 729 return err;
729#endif 730#endif
730 } 731 p->csp_programs[index] = program;
731 } 732 }
732 return snd_sb_csp_load(p, program->data, program->size, flags); 733 return snd_sb_csp_load(p, program->data, program->size, flags);
733} 734}