static int bells_late_probe(struct snd_soc_card *card) { struct snd_soc_codec *codec = card->rtd[0].codec; struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai; struct snd_soc_dai *aif2_dai = card->rtd[1].cpu_dai; struct snd_soc_dai *aif3_dai = card->rtd[2].cpu_dai; struct snd_soc_dai *wm9081_dai = card->rtd[2].codec_dai; int ret; ret = snd_soc_dai_set_sysclk(aif1_dai, ARIZONA_CLK_SYSCLK, 0, 0); if (ret != 0) { dev_err(aif1_dai->dev, "Failed to set AIF1 clock: %d\n", ret); return ret; } ret = snd_soc_dai_set_sysclk(aif2_dai, ARIZONA_CLK_ASYNCCLK, 0, 0); if (ret != 0) { dev_err(aif2_dai->dev, "Failed to set AIF2 clock: %d\n", ret); return ret; } ret = snd_soc_dai_set_sysclk(aif3_dai, ARIZONA_CLK_SYSCLK, 0, 0); if (ret != 0) { dev_err(aif1_dai->dev, "Failed to set AIF1 clock: %d\n", ret); return ret; } ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK, ARIZONA_CLK_SRC_FLL1, SYSCLK_RATE, SND_SOC_CLOCK_IN); if (ret != 0) { dev_err(codec->dev, "Failed to set SYSCLK: %d\n", ret); return ret; } ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_OPCLK, 0, WM9081_MCLK_RATE, SND_SOC_CLOCK_OUT); if (ret != 0) { dev_err(codec->dev, "Failed to set OPCLK: %d\n", ret); return ret; } ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_ASYNCCLK, ARIZONA_CLK_SRC_FLL2, ASYNCCLK_RATE, SND_SOC_CLOCK_IN); if (ret != 0) { dev_err(codec->dev, "Failed to set SYSCLK: %d\n", ret); return ret; } ret = snd_soc_codec_set_sysclk(wm9081_dai->codec, WM9081_SYSCLK_MCLK, 0, WM9081_MCLK_RATE, 0); if (ret != 0) { dev_err(wm9081_dai->dev, "Failed to set MCLK: %d\n", ret); return ret; } 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 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 speyside_wm9081_init(struct snd_soc_dapm_context *dapm) { snd_soc_dapm_nc_pin(dapm, "LINEOUT"); /* At any time the WM9081 is active it will have this clock */ return snd_soc_codec_set_sysclk(dapm->codec, WM9081_SYSCLK_MCLK, 48000 * 256, 0); }
static int lowland_wm9081_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; snd_soc_dapm_nc_pin(&codec->dapm, "LINEOUT"); /* At any time the WM9081 is active it will have this clock */ return snd_soc_codec_set_sysclk(codec, WM9081_SYSCLK_MCLK, 0, CLKOUT_RATE, 0); }
static int lowland_wm5100_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; int ret; ret = snd_soc_codec_set_sysclk(codec, WM5100_CLK_SYSCLK, WM5100_CLKSRC_MCLK1, MCLK1_RATE, SND_SOC_CLOCK_IN); if (ret < 0) { pr_err("Failed to set SYSCLK clock source: %d\n", ret); return ret; } /* Clock OPCLK, used by the other audio components. */ ret = snd_soc_codec_set_sysclk(codec, WM5100_CLK_OPCLK, 0, CLKOUT_RATE, 0); if (ret < 0) { pr_err("Failed to set OPCLK rate: %d\n", ret); return ret; } ret = snd_soc_jack_new(codec, "Headset", SND_JACK_LINEOUT | SND_JACK_HEADSET | SND_JACK_BTN_0, &lowland_headset); if (ret) return ret; ret = snd_soc_jack_add_pins(&lowland_headset, ARRAY_SIZE(lowland_headset_pins), lowland_headset_pins); if (ret) return ret; wm5100_detect(codec, &lowland_headset); return 0; }
static int adonisuniv_stop_sysclk(struct snd_soc_card *card) { struct wm5102_machine_priv *priv = snd_soc_card_get_drvdata(card); int ret; ret = snd_soc_codec_set_pll(priv->codec, WM5102_FLL1, ARIZONA_CLK_SRC_MCLK1, ADONISUNIV_DEFAULT_MCLK1, 0); if (ret != 0) { dev_err(priv->codec->dev, "Failed to stop FLL1: %d\n", ret); return ret; } ret = snd_soc_codec_set_sysclk(priv->codec, ARIZONA_CLK_SYSCLK, 0, 0, 0); if (ret != 0) { dev_err(priv->codec->dev, "Failed to stop SYSCLK: %d\n", ret); return ret; } exynos5_audio_set_mclk(0, 0); return ret; }
static int speyside_wm9081_init(struct snd_soc_dapm_context *dapm) { /* At any time the WM9081 is active it will have this clock */ return snd_soc_codec_set_sysclk(dapm->codec, WM9081_SYSCLK_MCLK, 0, MCLK_AUDIO_RATE, 0); }
static int ctp_wm5102_init(struct snd_soc_pcm_runtime *runtime) { int ret; struct snd_soc_card *card = runtime->card; struct ctp_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); struct snd_soc_codec *codec; struct snd_soc_dapm_context *dapm; codec = ctp_get_codec(card, "wm5102-codec"); if (!codec) return -EIO; dapm = &codec->dapm; /* Set codec bias level */ ctp_set_bias_level(card, dapm, SND_SOC_BIAS_OFF); card->dapm.idle_bias_off = true; /* Disable MICBIAS3 bypass mode and set CAP mode. * Capacitors are connected to DMIC on 1525-EV1 board */ snd_soc_update_bits(codec, ARIZONA_MIC_BIAS_CTRL_3, ARIZONA_MICB1_BYPASS_MASK | ARIZONA_MICB1_EXT_CAP_MASK, ARIZONA_MICB1_EXT_CAP); /* Set codec clock */ ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK, ARIZONA_CLK_SRC_FLL1, SYSCLK_RATE, SND_SOC_CLOCK_IN); if (ret != 0) { pr_err("failed: %d\n", ret); return ret; } /* Add Jack specific widgets */ ret = snd_soc_dapm_new_controls(dapm, ctp_dapm_widgets, ARRAY_SIZE(ctp_dapm_widgets)); if (ret) return ret; /* Set up Jack specific audio path audio_map */ snd_soc_dapm_add_routes(dapm, ctp_audio_map, ARRAY_SIZE(ctp_audio_map)); /* Add Comms specefic controls */ ctx->comms_ctl.ssp_bt_sco_master_mode = false; ctx->comms_ctl.ssp_voip_master_mode = false; ctx->comms_ctl.ssp_modem_master_mode = false; ret = snd_soc_add_card_controls(card, ssp_comms_controls, ARRAY_SIZE(ssp_comms_controls)); if (ret) { pr_err("Add Comms Controls failed %d", ret); return ret; } /* Keep the voice call paths active during suspend. Mark the end points ignore_suspend */ snd_soc_dapm_ignore_suspend(dapm, "HPOUT1R"); snd_soc_dapm_ignore_suspend(dapm, "HPOUT1L"); snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); snd_soc_dapm_disable_pin(dapm, "SPKOUTLP"); snd_soc_dapm_disable_pin(dapm, "SPKOUTLN"); snd_soc_dapm_ignore_suspend(dapm, "SPKOUTRP"); snd_soc_dapm_ignore_suspend(dapm, "SPKOUTRN"); mutex_lock(&codec->mutex); snd_soc_dapm_sync(dapm); mutex_unlock(&codec->mutex); return ret; }