static int platform_clock_control(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { struct snd_soc_dapm_context *dapm = w->dapm; struct snd_soc_card *card = dapm->card; struct snd_soc_dai *codec_dai; struct byt_rt5651_private *priv = snd_soc_card_get_drvdata(card); int ret; codec_dai = snd_soc_card_get_codec_dai(card, BYT_CODEC_DAI1); if (!codec_dai) codec_dai = snd_soc_card_get_codec_dai(card, BYT_CODEC_DAI2); if (!codec_dai) { dev_err(card->dev, "Codec dai not found; Unable to set platform clock\n"); return -EIO; } if (SND_SOC_DAPM_EVENT_ON(event)) { if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) { ret = clk_prepare_enable(priv->mclk); if (ret < 0) { dev_err(card->dev, "could not configure MCLK state"); return ret; } } ret = byt_rt5651_prepare_and_enable_pll1(codec_dai, 48000, 50); } else { /* * Set codec clock source to internal clock before * turning off the platform clock. Codec needs clock * for Jack detection and button press */ ret = snd_soc_dai_set_sysclk(codec_dai, RT5651_SCLK_S_RCCLK, 48000 * 512, SND_SOC_CLOCK_IN); if (!ret) if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) clk_disable_unprepare(priv->mclk); } if (ret < 0) { dev_err(card->dev, "can't set codec sysclk: %d\n", ret); return ret; } return 0; }
static int platform_clock_control(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { struct snd_soc_dapm_context *dapm = w->dapm; struct snd_soc_card *card = dapm->card; struct snd_soc_dai *codec_dai; struct cht_mc_private *ctx = snd_soc_card_get_drvdata(card); int ret; /* See the comment in snd_cht_mc_probe() */ if (ctx->quirks & QUIRK_PMC_PLT_CLK_0) return 0; codec_dai = snd_soc_card_get_codec_dai(card, CHT_CODEC_DAI); if (!codec_dai) { dev_err(card->dev, "Codec dai not found; Unable to set platform clock\n"); return -EIO; } if (SND_SOC_DAPM_EVENT_ON(event)) { ret = clk_prepare_enable(ctx->mclk); if (ret < 0) { dev_err(card->dev, "could not configure MCLK state"); return ret; } } else { clk_disable_unprepare(ctx->mclk); } return 0; }
static int platform_clock_control(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { struct snd_soc_dapm_context *dapm = w->dapm; struct snd_soc_card *card = dapm->card; struct snd_soc_dai *codec_dai; struct cht_mc_private *ctx = snd_soc_card_get_drvdata(card); int ret; codec_dai = snd_soc_card_get_codec_dai(card, CHT_CODEC_DAI1); if (!codec_dai) codec_dai = snd_soc_card_get_codec_dai(card, CHT_CODEC_DAI2); if (!codec_dai) { dev_err(card->dev, "Codec dai not found; Unable to set platform clock\n"); return -EIO; } if (SND_SOC_DAPM_EVENT_ON(event)) { ret = clk_prepare_enable(ctx->mclk); if (ret < 0) { dev_err(card->dev, "could not configure MCLK state"); return ret; } } else { /* Set codec sysclk source to its internal clock because codec PLL will * be off when idle and MCLK will also be off when codec is * runtime suspended. Codec needs clock for jack detection and button * press. MCLK is turned off with clock framework or ACPI. */ ret = snd_soc_dai_set_sysclk(codec_dai, RT5645_SCLK_S_RCCLK, 48000 * 512, SND_SOC_CLOCK_IN); if (ret < 0) { dev_err(card->dev, "can't set codec sysclk: %d\n", ret); return ret; } clk_disable_unprepare(ctx->mclk); } return 0; }