static int stac9766_codec_resume(struct platform_device *pdev) { struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec = socdev->card->codec; u16 id, reset; reset = 0; /* give the codec an AC97 warm reset to start the link */ reset: if (reset > 5) { printk(KERN_ERR "stac9766 failed to resume"); return -EIO; } codec->ac97->bus->ops->warm_reset(codec->ac97); id = soc_ac97_ops.read(codec->ac97, AC97_VENDOR_ID2); if (id != 0x4c13) { stac9766_reset(codec, 0); reset++; goto reset; } stac9766_set_bias_level(codec, SND_SOC_BIAS_STANDBY); if (codec->suspend_bias_level == SND_SOC_BIAS_ON) stac9766_set_bias_level(codec, SND_SOC_BIAS_ON); return 0; }
static int stac9766_codec_probe(struct snd_soc_codec *codec) { int ret = 0; printk(KERN_INFO "STAC9766 SoC Audio Codec %s\n", STAC9766_VERSION); ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); if (ret < 0) goto codec_err; /* do a cold reset for the controller and then try * a warm reset followed by an optional cold reset for codec */ stac9766_reset(codec, 0); ret = stac9766_reset(codec, 1); if (ret < 0) { printk(KERN_ERR "Failed to reset STAC9766: AC97 link error\n"); goto codec_err; } stac9766_set_bias_level(codec, SND_SOC_BIAS_STANDBY); snd_soc_add_controls(codec, stac9766_snd_ac97_controls, ARRAY_SIZE(stac9766_snd_ac97_controls)); return 0; codec_err: snd_soc_free_ac97_codec(codec); return ret; }
static int stac9766_codec_suspend(struct platform_device *pdev, pm_message_t state) { struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec = socdev->card->codec; stac9766_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; }
static int stac9766_codec_resume(struct snd_soc_codec *codec) { u16 id, reset; reset = 0; /* give the codec an AC97 warm reset to start the link */ reset: if (reset > 5) { printk(KERN_ERR "stac9766 failed to resume"); return -EIO; } codec->ac97->bus->ops->warm_reset(codec->ac97); id = soc_ac97_ops.read(codec->ac97, AC97_VENDOR_ID2); if (id != 0x4c13) { stac9766_reset(codec, 0); reset++; goto reset; } stac9766_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; }
static int stac9766_codec_suspend(struct snd_soc_codec *codec, pm_message_t state) { stac9766_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; }
static int stac9766_codec_probe(struct platform_device *pdev) { struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec; int ret = 0; printk(KERN_INFO "STAC9766 SoC Audio Codec %s\n", STAC9766_VERSION); socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); if (socdev->card->codec == NULL) return -ENOMEM; codec = socdev->card->codec; mutex_init(&codec->mutex); codec->reg_cache = kmemdup(stac9766_reg, sizeof(stac9766_reg), GFP_KERNEL); if (codec->reg_cache == NULL) { ret = -ENOMEM; goto cache_err; } codec->reg_cache_size = sizeof(stac9766_reg); codec->reg_cache_step = 2; codec->name = "STAC9766"; codec->owner = THIS_MODULE; codec->dai = stac9766_dai; codec->num_dai = ARRAY_SIZE(stac9766_dai); codec->write = stac9766_ac97_write; codec->read = stac9766_ac97_read; codec->set_bias_level = stac9766_set_bias_level; INIT_LIST_HEAD(&codec->dapm_widgets); INIT_LIST_HEAD(&codec->dapm_paths); ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); if (ret < 0) goto codec_err; /* register pcms */ ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); if (ret < 0) goto pcm_err; /* do a cold reset for the controller and then try * a warm reset followed by an optional cold reset for codec */ stac9766_reset(codec, 0); ret = stac9766_reset(codec, 1); if (ret < 0) { printk(KERN_ERR "Failed to reset STAC9766: AC97 link error\n"); goto reset_err; } stac9766_set_bias_level(codec, SND_SOC_BIAS_STANDBY); snd_soc_add_controls(codec, stac9766_snd_ac97_controls, ARRAY_SIZE(stac9766_snd_ac97_controls)); return 0; reset_err: snd_soc_free_pcms(socdev); pcm_err: snd_soc_free_ac97_codec(codec); codec_err: kfree(codec->private_data); cache_err: kfree(socdev->card->codec); socdev->card->codec = NULL; return ret; }