diff options
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/soc-core.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 8d6ff047d7a0..2ce0c8251dc3 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -1438,12 +1438,18 @@ int snd_soc_register_card(struct snd_soc_device *socdev) { struct snd_soc_codec *codec = socdev->codec; struct snd_soc_machine *machine = socdev->machine; - int ret = 0, i, ac97 = 0; + int ret = 0, i, ac97 = 0, err = 0; mutex_lock(&codec->mutex); for(i = 0; i < machine->num_links; i++) { - if (socdev->machine->dai_link[i].init) - socdev->machine->dai_link[i].init(codec); + if (socdev->machine->dai_link[i].init) { + err = socdev->machine->dai_link[i].init(codec); + if (err < 0) { + printk(KERN_ERR "asoc: failed to init %s\n", + socdev->machine->dai_link[i].stream_name); + continue; + } + } if (socdev->machine->dai_link[i].cpu_dai->type == SND_SOC_DAI_AC97) ac97 = 1; } @@ -1456,17 +1462,28 @@ int snd_soc_register_card(struct snd_soc_device *socdev) if (ret < 0) { printk(KERN_ERR "asoc: failed to register soundcard for codec %s\n", codec->name); - mutex_unlock(&codec->mutex); - return ret; + goto out; } #ifdef CONFIG_SND_SOC_AC97_BUS - if (ac97) - soc_ac97_dev_register(codec); + if (ac97) { + ret = soc_ac97_dev_register(codec); + if (ret < 0) { + printk(KERN_ERR "asoc: AC97 device register failed\n"); + snd_card_free(codec->card); + goto out; + } + } #endif - snd_soc_dapm_sys_add(socdev->dev); - device_create_file(socdev->dev, &dev_attr_codec_reg); + err = snd_soc_dapm_sys_add(socdev->dev); + if (err < 0) + printk(KERN_WARNING "asoc: failed to add dapm sysfs entries\n"); + + err = device_create_file(socdev->dev, &dev_attr_codec_reg); + if (err < 0) + printk(KERN_WARNING "asoc: failed to add codec sysfs entries\n"); +out: mutex_unlock(&codec->mutex); return ret; } |