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;
}
Beispiel #2
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);
}
Beispiel #5
0
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);
}