forked from Minki/linux
ASoC: rt5659: Add mclk controls
The codec driver should control the mclk. So this patch adds this support. Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com> Acked-by: Rob Herring <robh@kernel.org> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
29b4817d40
commit
c6f8769b03
@ -12,6 +12,9 @@ Required properties:
|
|||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
|
|
||||||
|
- clocks: The phandle of the master clock to the CODEC
|
||||||
|
- clock-names: Should be "mclk"
|
||||||
|
|
||||||
- realtek,in1-differential
|
- realtek,in1-differential
|
||||||
- realtek,in3-differential
|
- realtek,in3-differential
|
||||||
- realtek,in4-differential
|
- realtek,in4-differential
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/clk.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/init.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,
|
static int rt5659_set_bias_level(struct snd_soc_codec *codec,
|
||||||
enum snd_soc_bias_level level)
|
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);
|
struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
|
||||||
|
int ret;
|
||||||
|
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case SND_SOC_BIAS_PREPARE:
|
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);
|
RT5659_PWR_FV1 | RT5659_PWR_FV2);
|
||||||
break;
|
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:
|
case SND_SOC_BIAS_OFF:
|
||||||
regmap_update_bits(rt5659->regmap, RT5659_PWR_DIG_1,
|
regmap_update_bits(rt5659->regmap, RT5659_PWR_DIG_1,
|
||||||
RT5659_PWR_LDO, 0);
|
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);
|
RT5659_PWR_MB | RT5659_PWR_VREF2);
|
||||||
regmap_update_bits(rt5659->regmap, RT5659_DIG_MISC,
|
regmap_update_bits(rt5659->regmap, RT5659_DIG_MISC,
|
||||||
RT5659_DIG_GATE_CTRL, 0);
|
RT5659_DIG_GATE_CTRL, 0);
|
||||||
|
clk_disable_unprepare(rt5659->mclk);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -4020,6 +4035,15 @@ static int rt5659_i2c_probe(struct i2c_client *i2c,
|
|||||||
|
|
||||||
regmap_write(rt5659->regmap, RT5659_RESET, 0);
|
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) != -ENOENT)
|
||||||
|
return PTR_ERR(rt5659->mclk);
|
||||||
|
/* Otherwise mark the mclk pointer to NULL */
|
||||||
|
rt5659->mclk = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rt5659_calibrate(rt5659);
|
rt5659_calibrate(rt5659);
|
||||||
|
|
||||||
/* line in diff mode*/
|
/* line in diff mode*/
|
||||||
|
@ -1796,6 +1796,7 @@ struct rt5659_priv {
|
|||||||
struct gpio_desc *gpiod_reset;
|
struct gpio_desc *gpiod_reset;
|
||||||
struct snd_soc_jack *hs_jack;
|
struct snd_soc_jack *hs_jack;
|
||||||
struct delayed_work jack_detect_work;
|
struct delayed_work jack_detect_work;
|
||||||
|
struct clk *mclk;
|
||||||
|
|
||||||
int sysclk;
|
int sysclk;
|
||||||
int sysclk_src;
|
int sysclk_src;
|
||||||
|
Loading…
Reference in New Issue
Block a user