예제 #1
0
파일: bells.c 프로젝트: kevsmith/linux
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;
}
예제 #4
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);
}
예제 #5
0
파일: lowland.c 프로젝트: 908626950/linux
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);
}
예제 #6
0
파일: lowland.c 프로젝트: 908626950/linux
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;
}
예제 #8
0
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;
}