static int adonisuniv_suspend_post(struct snd_soc_card *card) { struct snd_soc_codec *codec = card->rtd[0].codec; int ret; if (codec->active) { dev_info(codec->dev, "sound card is still active state"); return 0; } ret = snd_soc_codec_set_pll(codec, WM5102_FLL1, ARIZONA_CLK_SRC_MCLK1, ADONISUNIV_DEFAULT_MCLK1, 0); if (ret != 0) { dev_err(codec->dev, "Failed to stop FLL1: %d\n", ret); return ret; } ret = snd_soc_codec_set_pll(codec, WM5102_FLL2, 0, 0, 0); if (ret != 0) { dev_err(codec->dev, "Failed to stop FLL2: %d\n", ret); return ret; } ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK, 0, 0, 0); if (ret != 0) { dev_err(codec->dev, "Failed to stop SYSCLK: %d\n", ret); return ret; } exynos5_audio_set_mclk(0, 1); return 0; }
static int bells_set_bias_level_post(struct snd_soc_card *card, struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level) { struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; struct snd_soc_codec *codec = codec_dai->codec; int ret; if (dapm->dev != codec_dai->dev) return 0; switch (level) { case SND_SOC_BIAS_STANDBY: ret = snd_soc_codec_set_pll(codec, WM5102_FLL1, 0, 0, 0); if (ret < 0) { pr_err("Failed to stop FLL: %d\n", ret); return ret; } ret = snd_soc_codec_set_pll(codec, WM5102_FLL2, 0, 0, 0); if (ret < 0) { pr_err("Failed to stop FLL: %d\n", ret); return ret; } break; default: break; } dapm->bias_level = level; return 0; }
int adonisuniv_set_media_clocking(struct wm5102_machine_priv *priv) { struct snd_soc_codec *codec = priv->codec; int ret; int fs; if (priv->aif1rate >= 192000) fs = 256; else fs = 512; ret = snd_soc_codec_set_pll(codec, WM5102_FLL1_REFCLK, ARIZONA_FLL_SRC_NONE, 0, 0); if (ret != 0) { dev_err(codec->dev, "Failed to start FLL1 REF: %d\n", ret); return ret; } ret = snd_soc_codec_set_pll(codec, WM5102_FLL1, ARIZONA_CLK_SRC_MCLK1, ADONISUNIV_DEFAULT_MCLK1, priv->aif1rate * fs); if (ret != 0) { dev_err(codec->dev, "Failed to start FLL1: %d\n", ret); return ret; } ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK, ARIZONA_CLK_SRC_FLL1, priv->aif1rate * fs, SND_SOC_CLOCK_IN); if (ret < 0) dev_err(codec->dev, "Failed to set SYSCLK to FLL1: %d\n", ret); ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_ASYNCCLK, ARIZONA_CLK_SRC_FLL2, ADONISUNIV_TELCLK_RATE, SND_SOC_CLOCK_IN); if (ret < 0) dev_err(codec->dev, "Unable to set ASYNCCLK to FLL2: %d\n", ret); /* AIF1 from SYSCLK, AIF2 and 3 from ASYNCCLK */ ret = snd_soc_dai_set_sysclk(priv->aif[0], ARIZONA_CLK_SYSCLK, 0, 0); if (ret < 0) dev_err(codec->dev, "Can't set AIF1 to SYSCLK: %d\n", ret); ret = snd_soc_dai_set_sysclk(priv->aif[1], ARIZONA_CLK_ASYNCCLK, 0, 0); if (ret < 0) dev_err(codec->dev, "Can't set AIF2 to ASYNCCLK: %d\n", ret); ret = snd_soc_dai_set_sysclk(priv->aif[2], ARIZONA_CLK_ASYNCCLK, 0, 0); if (ret < 0) dev_err(codec->dev, "Can't set AIF3 to ASYNCCLK: %d\n", ret); return 0; }
static int set_bias_level(struct snd_soc_card *card, struct snd_soc_codec *codec, enum snd_soc_bias_level level) { int pll_source = ARIZONA_FLL_SRC_MCLK1; if (!strcmp(card->dai_link->codec_dai_name, "wm5102-aif3")) { pll_source = ARIZONA_FLL_SRC_MCLK1; pr_debug("$$VR: ARIZONA_FLL_SRC_MCLK1\n"); } else { if (!strcmp(card->dai_link->codec_dai_name, "wm5102-aif2")) { pll_source = ARIZONA_FLL_SRC_AIF2BCLK; pr_debug("$$VR: ARIZONA_FLL_SRC_AIF2BCLK\n"); } else { if (!strcmp(card->dai_link->codec_dai_name, "wm5102-aif1")) { pll_source = ARIZONA_FLL_SRC_AIF1BCLK; pr_debug("$$VR: ARIZONA_FLL_SRC_AIF1BCLK\n"); } } } return snd_soc_codec_set_pll(codec, WM5102_FLL1, pll_source, DEFAULT_MCLK, SYSCLK_RATE); }
static int bells_set_bias_level(struct snd_soc_card *card, struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level) { struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; struct snd_soc_codec *codec = codec_dai->codec; int ret; if (dapm->dev != codec_dai->dev) return 0; switch (level) { case SND_SOC_BIAS_PREPARE: if (dapm->bias_level == SND_SOC_BIAS_STANDBY) { ret = snd_soc_codec_set_pll(codec, WM5102_FLL1, ARIZONA_FLL_SRC_MCLK1, MCLK_RATE, SYSCLK_RATE); if (ret < 0) pr_err("Failed to start FLL: %d\n", ret); ret = snd_soc_codec_set_pll(codec, WM5102_FLL2, ARIZONA_FLL_SRC_AIF2BCLK, BCLK2_RATE, ASYNCCLK_RATE); if (ret < 0) pr_err("Failed to start FLL: %d\n", ret); } break; default: break; } return 0; }
static int adonisuniv_start_sysclk(struct snd_soc_card *card) { struct wm5102_machine_priv *priv = snd_soc_card_get_drvdata(card); int ret; exynos5_audio_set_mclk(1, 0); ret = snd_soc_codec_set_pll(priv->codec, WM5102_FLL1, ARIZONA_CLK_SRC_MCLK1, ADONISUNIV_DEFAULT_MCLK1, priv->aif1rate * 512); if (ret != 0) { dev_err(priv->codec->dev, "Failed to start FLL1: %d\n", ret); return ret; } return ret; }
static int adonisuniv_set_bias_level(struct snd_soc_card *card, struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level) { struct wm5102_machine_priv *priv = snd_soc_card_get_drvdata(card); int ret = 0; if (!priv->codec || dapm != &priv->codec->dapm) return 0; dev_crit(priv->codec->dev, "SET BIAS %d\n", level); switch (level) { case SND_SOC_BIAS_STANDBY: if (card->dapm.bias_level == SND_SOC_BIAS_OFF) ret = adonisuniv_start_sysclk(card); break; case SND_SOC_BIAS_OFF: ret = adonisuniv_stop_sysclk(card); ret = snd_soc_codec_set_pll(priv->codec, WM5102_FLL2, 0, 0, 0); if (ret != 0) dev_err(priv->codec->dev, "Failed to stop FLL2: %d\n", ret); break; case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_ON: break; default: dev_err(priv->codec->dev, "UNKNOWN BIAS %d\n", level); break; } card->dapm.bias_level = level; return ret; }
int set_bias_level_post(struct snd_soc_card *card, struct snd_soc_codec *codec, enum snd_soc_bias_level level) { return snd_soc_codec_set_pll(codec, WM5102_FLL1, 0, 0, 0); }