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 __devinit snd_adonisuniv_probe(struct platform_device *pdev)
{
	int ret;
	struct wm5102_machine_priv *wm5102;

	wm5102 = kzalloc(sizeof *wm5102, GFP_KERNEL);
	if (!wm5102) {
		pr_err("Failed to allocate memory\n");
		return -ENOMEM;
	}

	exynos5_audio_set_mclk(1, 0);

	ret = snd_soc_register_dais(&pdev->dev, adonisuniv_ext_dai,
					ARRAY_SIZE(adonisuniv_ext_dai));
	if (ret != 0)
		pr_err("Failed to register external DAIs: %d\n", ret);

	snd_soc_card_set_drvdata(&adonisuniv, wm5102);

	adonisuniv.dev = &pdev->dev;
	ret = snd_soc_register_card(&adonisuniv);
	if (ret) {
		dev_err(&pdev->dev, "snd_soc_register_card failed %d\n", ret);
		kfree(wm5102);
	}

	adonisuniv_gpio_init();

	return ret;
}
static int pn547_clk_requset(struct pn547_dev *pn547_dev, bool enable)
{
#if defined(CONFIG_SOC_EXYNOS5422)
	if (pn547_dev->clk_use_check) {
		if (enable) {
			int ret;
			ret = clk_enable(pn547_dev->clk);
			if (ret)
				pr_err("%s, enable clk Error !!:%d\n", __func__, ret);
		} else {
			clk_disable(pn547_dev->clk);
		}
	}
#elif defined(CONFIG_SOC_EXYNOS5430)
	if (pn547_dev->clk_use_check == CLK_USE_CAM1) {
		if (enable) {
			int ret;
			ret = pn547_enable_clk("sclk_isp_sensor1", true);
			if (ret)
				pr_err("%s, enable sclk_isp_sensor1 Error !!:%d\n", __func__, ret);
		} else {
			pn547_enable_clk("sclk_isp_sensor1", false);
		}
	} else if (pn547_dev->clk_use_check == CLK_USE_AUDIO) {
		exynos5_audio_set_mclk(enable, false);
	}
#endif

	return 0;
}
static int adonisuniv_resume_pre(struct snd_soc_card *card)
{
	struct wm5102_machine_priv *wm5102_priv
					 = snd_soc_card_get_drvdata(card);

	exynos5_audio_set_mclk(1, 0);

	adonisuniv_set_media_clocking(wm5102_priv);

	return 0;
}
static int __devexit snd_adonisuniv_remove(struct platform_device *pdev)
{
	struct snd_soc_card *card = &adonisuniv;
	struct wm5102_machine_priv *wm5102 = snd_soc_card_get_drvdata(card);

	snd_soc_unregister_card(&adonisuniv);
	kfree(wm5102);

	exynos5_audio_set_mclk(0, 0);

#ifdef GPIO_MICBIAS_EN
	gpio_free(GPIO_MICBIAS_EN);
#endif

	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 __devinit snd_adonisuniv_probe(struct platform_device *pdev)
{
	int ret;
	struct ymu831_machine_priv *ymu831;

	ymu831 = kzalloc(sizeof(struct ymu831_machine_priv), GFP_KERNEL);
	if (!ymu831) {
		pr_err("Failed to allocate memory\n");
		return -ENOMEM;
	}

	exynos5_audio_set_mclk(1, 0);

	snd_soc_card_set_drvdata(&ymu831_snd_card, ymu831);

	ymu831_snd_card.dev = &pdev->dev;
	ret = snd_soc_register_card(&ymu831_snd_card);
	if (ret) {
		dev_err(&pdev->dev, "snd_soc_register_card failed %d\n", ret);
		kfree(ymu831);
	}

	return ret;
}
Example #8
0
int es705_enable_ext_clk(struct device *dev, int enable)
{
	static struct clk *es705_codec_clk = NULL;
	int rc = 0;

	dev_info(dev, "%s: clk enable=%d\n", __func__, enable);

#ifdef CONFIG_ARCH_EXYNOS
	if (enable) {
		if (es705_codec_clk) {
			dev_info(dev, "%s: clk is already On", __func__);
			return 0;
		}

		es705_codec_clk = devm_clk_get(dev, "mclk");
		if (IS_ERR(es705_codec_clk)) {
			dev_err(dev, "%s: Device tree node not found for mclk", __func__);
			es705_codec_clk = NULL;
		}

		if(es705_codec_clk) {
			rc = clk_prepare_enable(es705_codec_clk);
			if (rc) {
				dev_err(dev, "%s: Failed to prepare or enable clock, err=%d\n", __func__, rc);
				goto err;
			}
		} else
			exynos5_audio_set_mclk(true, 0);
	} else {
		if(es705_codec_clk) {
			clk_disable_unprepare(es705_codec_clk);
			devm_clk_put(dev, es705_codec_clk);
			es705_codec_clk = NULL;
		} else
			exynos5_audio_set_mclk(false, 0);
	}
	return 0;
err:
	devm_clk_put(dev, es705_codec_clk);
	es705_codec_clk = NULL;
#else
	es705_codec_clk = clk_get(dev, "osr_clk");
	if (!es705_codec_clk) {
		dev_err(dev, "%s: clk_get osr_clk FAIL\n", __func__);
		return -ENODEV;
	}

	if (enable) {
		rc = clk_prepare_enable(es705_codec_clk);
		if (rc) {
			dev_err(dev,
				"Failed to prepare or enable clock, err=%d\n",
				rc);
			goto err;
		}
	} else {
		clk_disable_unprepare(es705_codec_clk);
		clk_put(es705_codec_clk);
	}

	return 0;

err:
	clk_put(es705_codec_clk);
#endif
	return rc;
}