All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ASoC: rt5659: Add mclk controls
@ 2016-07-27 23:02 ` Nicolin Chen
  0 siblings, 0 replies; 28+ messages in thread
From: Nicolin Chen @ 2016-07-27 23:02 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, robh+dt, mark.rutland, bardliao, oder_chiou,
	devicetree, linux-kernel, alsa-devel

The codec driver should control the mclk. So this patch adds this support.

Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com>
---
 Documentation/devicetree/bindings/sound/rt5659.txt |  3 +++
 sound/soc/codecs/rt5659.c                          | 24 ++++++++++++++++++++++
 sound/soc/codecs/rt5659.h                          |  1 +
 3 files changed, 28 insertions(+)

diff --git a/Documentation/devicetree/bindings/sound/rt5659.txt b/Documentation/devicetree/bindings/sound/rt5659.txt
index 5f79e7f..1766e05 100644
--- a/Documentation/devicetree/bindings/sound/rt5659.txt
+++ b/Documentation/devicetree/bindings/sound/rt5659.txt
@@ -12,6 +12,9 @@ Required properties:
 
 Optional properties:
 
+- clocks: The phandle of the master clock to the CODEC
+- clock-names: Should be "mclk"
+
 - realtek,in1-differential
 - realtek,in3-differential
 - realtek,in4-differential
diff --git a/sound/soc/codecs/rt5659.c b/sound/soc/codecs/rt5659.c
index 1b30914..d9ead96 100644
--- a/sound/soc/codecs/rt5659.c
+++ b/sound/soc/codecs/rt5659.c
@@ -9,6 +9,7 @@
  * published by the Free Software Foundation.
  */
 
+#include <linux/clk.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/init.h>
@@ -3565,7 +3566,9 @@ static int rt5659_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
 static int rt5659_set_bias_level(struct snd_soc_codec *codec,
 			enum snd_soc_bias_level level)
 {
+	struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
 	struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
+	int ret;
 
 	switch (level) {
 	case SND_SOC_BIAS_PREPARE:
@@ -3582,6 +3585,17 @@ static int rt5659_set_bias_level(struct snd_soc_codec *codec,
 			RT5659_PWR_FV1 | RT5659_PWR_FV2);
 		break;
 
+	case SND_SOC_BIAS_STANDBY:
+		if (dapm->bias_level == SND_SOC_BIAS_OFF) {
+			ret = clk_prepare_enable(rt5659->mclk);
+			if (ret) {
+				dev_err(codec->dev,
+					"failed to enable MCLK: %d\n", ret);
+				return ret;
+			}
+		}
+		break;
+
 	case SND_SOC_BIAS_OFF:
 		regmap_update_bits(rt5659->regmap, RT5659_PWR_DIG_1,
 			RT5659_PWR_LDO, 0);
@@ -3591,6 +3605,7 @@ static int rt5659_set_bias_level(struct snd_soc_codec *codec,
 			RT5659_PWR_MB | RT5659_PWR_VREF2);
 		regmap_update_bits(rt5659->regmap, RT5659_DIG_MISC,
 			RT5659_DIG_GATE_CTRL, 0);
+		clk_disable_unprepare(rt5659->mclk);
 		break;
 
 	default:
@@ -4020,6 +4035,15 @@ static int rt5659_i2c_probe(struct i2c_client *i2c,
 
 	regmap_write(rt5659->regmap, RT5659_RESET, 0);
 
+	/* Check if MCLK provided */
+	rt5659->mclk = devm_clk_get(&i2c->dev, "mclk");
+	if (IS_ERR(rt5659->mclk)) {
+		if (PTR_ERR(rt5659->mclk) == -EPROBE_DEFER)
+			return -EPROBE_DEFER;
+		/* Otherwise mark the mclk pointer to NULL */
+		rt5659->mclk = NULL;
+	}
+
 	rt5659_calibrate(rt5659);
 
 	/* line in diff mode*/
diff --git a/sound/soc/codecs/rt5659.h b/sound/soc/codecs/rt5659.h
index d31c9e5..d69b0eb 100644
--- a/sound/soc/codecs/rt5659.h
+++ b/sound/soc/codecs/rt5659.h
@@ -1796,6 +1796,7 @@ struct rt5659_priv {
 	struct gpio_desc *gpiod_reset;
 	struct snd_soc_jack *hs_jack;
 	struct delayed_work jack_detect_work;
+	struct clk *mclk;
 
 	int sysclk;
 	int sysclk_src;
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2016-08-11 11:34 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-27 23:02 [PATCH] ASoC: rt5659: Add mclk controls Nicolin Chen
2016-07-27 23:02 ` Nicolin Chen
2016-07-28 15:57 ` Mark Brown
2016-07-28 15:57   ` Mark Brown
2016-07-28 18:14   ` Nicolin Chen
2016-07-28 18:14     ` Nicolin Chen
2016-07-28 18:55     ` Mark Brown
2016-07-28 18:55       ` Mark Brown
2016-07-28 19:03       ` Nicolin Chen
2016-07-29 16:15       ` Vinod Koul
2016-07-29 16:39         ` Mark Brown
2016-07-29 16:55           ` [alsa-devel] " Vinod Koul
2016-07-29 16:55             ` Vinod Koul
2016-08-10 13:57           ` Pierre-Louis Bossart
2016-08-10 13:57             ` Pierre-Louis Bossart
2016-08-10 17:06             ` [alsa-devel] " Mark Brown
2016-08-10 17:06               ` Mark Brown
2016-08-10 17:31               ` [alsa-devel] " Pierre-Louis Bossart
2016-08-10 17:31                 ` Pierre-Louis Bossart
2016-08-10 17:52                 ` [alsa-devel] " Mark Brown
2016-08-10 17:52                   ` Mark Brown
2016-08-10 21:59                   ` [alsa-devel] " Pierre-Louis Bossart
2016-08-11 11:34                     ` Mark Brown
2016-08-11 11:34                       ` Mark Brown
2016-07-28 20:40 ` Lars-Peter Clausen
2016-07-28 20:40   ` Lars-Peter Clausen
2016-07-28 20:51   ` Nicolin Chen
2016-07-28 20:51     ` Nicolin Chen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.