diff options
Diffstat (limited to 'sound/soc/codecs/rt5677.c')
-rw-r--r-- | sound/soc/codecs/rt5677.c | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c index fb9c20eace3f..c2a6e4091357 100644 --- a/sound/soc/codecs/rt5677.c +++ b/sound/soc/codecs/rt5677.c | |||
@@ -718,11 +718,24 @@ static int rt5677_set_dsp_vad(struct snd_soc_codec *codec, bool on) | |||
718 | RT5677_LDO1_SEL_MASK, 0x0); | 718 | RT5677_LDO1_SEL_MASK, 0x0); |
719 | regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2, | 719 | regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2, |
720 | RT5677_PWR_LDO1, RT5677_PWR_LDO1); | 720 | RT5677_PWR_LDO1, RT5677_PWR_LDO1); |
721 | regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1, | 721 | switch (rt5677->type) { |
722 | RT5677_MCLK_SRC_MASK, RT5677_MCLK2_SRC); | 722 | case RT5677: |
723 | regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK2, | 723 | regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1, |
724 | RT5677_PLL2_PR_SRC_MASK | RT5677_DSP_CLK_SRC_MASK, | 724 | RT5677_MCLK_SRC_MASK, RT5677_MCLK2_SRC); |
725 | RT5677_PLL2_PR_SRC_MCLK2 | RT5677_DSP_CLK_SRC_BYPASS); | 725 | regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK2, |
726 | RT5677_PLL2_PR_SRC_MASK | | ||
727 | RT5677_DSP_CLK_SRC_MASK, | ||
728 | RT5677_PLL2_PR_SRC_MCLK2 | | ||
729 | RT5677_DSP_CLK_SRC_BYPASS); | ||
730 | break; | ||
731 | case RT5676: | ||
732 | regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK2, | ||
733 | RT5677_DSP_CLK_SRC_MASK, | ||
734 | RT5677_DSP_CLK_SRC_BYPASS); | ||
735 | break; | ||
736 | default: | ||
737 | break; | ||
738 | } | ||
726 | regmap_write(rt5677->regmap, RT5677_PWR_DSP2, 0x07ff); | 739 | regmap_write(rt5677->regmap, RT5677_PWR_DSP2, 0x07ff); |
727 | regmap_write(rt5677->regmap, RT5677_PWR_DSP1, 0x07fd); | 740 | regmap_write(rt5677->regmap, RT5677_PWR_DSP1, 0x07fd); |
728 | rt5677_set_dsp_mode(codec, true); | 741 | rt5677_set_dsp_mode(codec, true); |
@@ -4500,10 +4513,10 @@ static int rt5677_suspend(struct snd_soc_codec *codec) | |||
4500 | if (!rt5677->dsp_vad_en) { | 4513 | if (!rt5677->dsp_vad_en) { |
4501 | regcache_cache_only(rt5677->regmap, true); | 4514 | regcache_cache_only(rt5677->regmap, true); |
4502 | regcache_mark_dirty(rt5677->regmap); | 4515 | regcache_mark_dirty(rt5677->regmap); |
4503 | } | ||
4504 | 4516 | ||
4505 | if (gpio_is_valid(rt5677->pow_ldo2)) | 4517 | if (gpio_is_valid(rt5677->pow_ldo2)) |
4506 | gpio_set_value_cansleep(rt5677->pow_ldo2, 0); | 4518 | gpio_set_value_cansleep(rt5677->pow_ldo2, 0); |
4519 | } | ||
4507 | 4520 | ||
4508 | return 0; | 4521 | return 0; |
4509 | } | 4522 | } |
@@ -4512,12 +4525,12 @@ static int rt5677_resume(struct snd_soc_codec *codec) | |||
4512 | { | 4525 | { |
4513 | struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); | 4526 | struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); |
4514 | 4527 | ||
4515 | if (gpio_is_valid(rt5677->pow_ldo2)) { | ||
4516 | gpio_set_value_cansleep(rt5677->pow_ldo2, 1); | ||
4517 | msleep(10); | ||
4518 | } | ||
4519 | |||
4520 | if (!rt5677->dsp_vad_en) { | 4528 | if (!rt5677->dsp_vad_en) { |
4529 | if (gpio_is_valid(rt5677->pow_ldo2)) { | ||
4530 | gpio_set_value_cansleep(rt5677->pow_ldo2, 1); | ||
4531 | msleep(10); | ||
4532 | } | ||
4533 | |||
4521 | regcache_cache_only(rt5677->regmap, false); | 4534 | regcache_cache_only(rt5677->regmap, false); |
4522 | regcache_sync(rt5677->regmap); | 4535 | regcache_sync(rt5677->regmap); |
4523 | } | 4536 | } |
@@ -4733,7 +4746,8 @@ static const struct regmap_config rt5677_regmap = { | |||
4733 | }; | 4746 | }; |
4734 | 4747 | ||
4735 | static const struct i2c_device_id rt5677_i2c_id[] = { | 4748 | static const struct i2c_device_id rt5677_i2c_id[] = { |
4736 | { "rt5677", 0 }, | 4749 | { "rt5677", RT5677 }, |
4750 | { "rt5676", RT5676 }, | ||
4737 | { } | 4751 | { } |
4738 | }; | 4752 | }; |
4739 | MODULE_DEVICE_TABLE(i2c, rt5677_i2c_id); | 4753 | MODULE_DEVICE_TABLE(i2c, rt5677_i2c_id); |
@@ -4850,6 +4864,8 @@ static int rt5677_i2c_probe(struct i2c_client *i2c, | |||
4850 | 4864 | ||
4851 | i2c_set_clientdata(i2c, rt5677); | 4865 | i2c_set_clientdata(i2c, rt5677); |
4852 | 4866 | ||
4867 | rt5677->type = id->driver_data; | ||
4868 | |||
4853 | if (pdata) | 4869 | if (pdata) |
4854 | rt5677->pdata = *pdata; | 4870 | rt5677->pdata = *pdata; |
4855 | 4871 | ||