aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>2013-11-19 05:51:29 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-12-04 13:55:49 -0500
commitf9bdb31ae29c0cf60b35ed83c98e7a4043873336 (patch)
treeae7ed12339849c0cdfa36508549577f0e6c16f50
parentd2099a50522c4002a2888c70a39560aab20d0926 (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.c43
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
40static 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
48static 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
40static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0); 81static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);
41static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0); 82static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
42static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0); 83static 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
387static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = { 428static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = {
388SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, 429SND_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),
390SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1, 431SND_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),
392SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, 433SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,