diff options
author | Charles Keepax <ckeepax@opensource.wolfsonmicro.com> | 2013-11-19 05:51:29 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-12-04 13:55:49 -0500 |
commit | f9bdb31ae29c0cf60b35ed83c98e7a4043873336 (patch) | |
tree | ae7ed12339849c0cdfa36508549577f0e6c16f50 | |
parent | d2099a50522c4002a2888c70a39560aab20d0926 (diff) |
ASoC: wm5110: Add post SYSCLK register patch for rev D chip
commit f69f86b1ba6493126a7f093a65a8952bcb183de2 upstream.
Certain registers require patching after the SYSCLK has been brought up
add support for this into the CODEC driver.
Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | sound/soc/codecs/wm5110.c | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c index 88ad7db52dde..cd6ed88409d7 100644 --- a/sound/soc/codecs/wm5110.c +++ b/sound/soc/codecs/wm5110.c | |||
@@ -37,6 +37,47 @@ struct wm5110_priv { | |||
37 | struct arizona_fll fll[2]; | 37 | struct arizona_fll fll[2]; |
38 | }; | 38 | }; |
39 | 39 | ||
40 | static const struct reg_default wm5110_sysclk_revd_patch[] = { | ||
41 | { 0x3093, 0x1001 }, | ||
42 | { 0x30E3, 0x1301 }, | ||
43 | { 0x3133, 0x1201 }, | ||
44 | { 0x3183, 0x1501 }, | ||
45 | { 0x31D3, 0x1401 }, | ||
46 | }; | ||
47 | |||
48 | static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w, | ||
49 | struct snd_kcontrol *kcontrol, int event) | ||
50 | { | ||
51 | struct snd_soc_codec *codec = w->codec; | ||
52 | struct arizona *arizona = dev_get_drvdata(codec->dev->parent); | ||
53 | struct regmap *regmap = codec->control_data; | ||
54 | const struct reg_default *patch = NULL; | ||
55 | int i, patch_size; | ||
56 | |||
57 | switch (arizona->rev) { | ||
58 | case 3: | ||
59 | patch = wm5110_sysclk_revd_patch; | ||
60 | patch_size = ARRAY_SIZE(wm5110_sysclk_revd_patch); | ||
61 | break; | ||
62 | default: | ||
63 | return 0; | ||
64 | } | ||
65 | |||
66 | switch (event) { | ||
67 | case SND_SOC_DAPM_POST_PMU: | ||
68 | if (patch) | ||
69 | for (i = 0; i < patch_size; i++) | ||
70 | regmap_write(regmap, patch[i].reg, | ||
71 | patch[i].def); | ||
72 | break; | ||
73 | |||
74 | default: | ||
75 | break; | ||
76 | } | ||
77 | |||
78 | return 0; | ||
79 | } | ||
80 | |||
40 | static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0); | 81 | static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0); |
41 | static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0); | 82 | static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0); |
42 | static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0); | 83 | static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0); |
@@ -386,7 +427,7 @@ static const struct snd_kcontrol_new wm5110_aec_loopback_mux = | |||
386 | 427 | ||
387 | static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = { | 428 | static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = { |
388 | SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, | 429 | SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, |
389 | 0, NULL, 0), | 430 | 0, wm5110_sysclk_ev, SND_SOC_DAPM_POST_PMU), |
390 | SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1, | 431 | SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1, |
391 | ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0), | 432 | ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0), |
392 | SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, | 433 | SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, |