diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-01-04 16:30:16 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-01-04 16:30:16 -0500 |
commit | 66b6eaf23adc77c7a74d0a7149eb49fbca187a9c (patch) | |
tree | f35e31f06fe0582cff8dfeb6225b95fd1d309284 | |
parent | bc9ab6d31c4fde1016ecc6606913ed0d52b3ed76 (diff) | |
parent | d71753e22b24548911b377db28f80870cf50d07b (diff) |
Merge branch 'fix/arizona' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-arizona
-rw-r--r-- | sound/soc/codecs/arizona.c | 9 | ||||
-rw-r--r-- | sound/soc/codecs/arizona.h | 18 | ||||
-rw-r--r-- | sound/soc/codecs/wm5102.c | 48 |
3 files changed, 57 insertions, 18 deletions
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c index bcd225853eb5..5afc8110ae3a 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c | |||
@@ -503,15 +503,9 @@ static int arizona_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | |||
503 | case SND_SOC_DAIFMT_DSP_A: | 503 | case SND_SOC_DAIFMT_DSP_A: |
504 | mode = 0; | 504 | mode = 0; |
505 | break; | 505 | break; |
506 | case SND_SOC_DAIFMT_DSP_B: | ||
507 | mode = 1; | ||
508 | break; | ||
509 | case SND_SOC_DAIFMT_I2S: | 506 | case SND_SOC_DAIFMT_I2S: |
510 | mode = 2; | 507 | mode = 2; |
511 | break; | 508 | break; |
512 | case SND_SOC_DAIFMT_LEFT_J: | ||
513 | mode = 3; | ||
514 | break; | ||
515 | default: | 509 | default: |
516 | arizona_aif_err(dai, "Unsupported DAI format %d\n", | 510 | arizona_aif_err(dai, "Unsupported DAI format %d\n", |
517 | fmt & SND_SOC_DAIFMT_FORMAT_MASK); | 511 | fmt & SND_SOC_DAIFMT_FORMAT_MASK); |
@@ -771,7 +765,8 @@ static int arizona_hw_params(struct snd_pcm_substream *substream, | |||
771 | snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1, | 765 | snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1, |
772 | ARIZONA_ASYNC_SAMPLE_RATE_MASK, sr_val); | 766 | ARIZONA_ASYNC_SAMPLE_RATE_MASK, sr_val); |
773 | snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, | 767 | snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, |
774 | ARIZONA_AIF1_RATE_MASK, 8); | 768 | ARIZONA_AIF1_RATE_MASK, |
769 | 8 << ARIZONA_AIF1_RATE_SHIFT); | ||
775 | break; | 770 | break; |
776 | default: | 771 | default: |
777 | arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); | 772 | arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); |
diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h index 0973fd9bd9a7..697ff6fcaba4 100644 --- a/sound/soc/codecs/arizona.h +++ b/sound/soc/codecs/arizona.h | |||
@@ -34,15 +34,15 @@ | |||
34 | 34 | ||
35 | #define ARIZONA_FLL_SRC_MCLK1 0 | 35 | #define ARIZONA_FLL_SRC_MCLK1 0 |
36 | #define ARIZONA_FLL_SRC_MCLK2 1 | 36 | #define ARIZONA_FLL_SRC_MCLK2 1 |
37 | #define ARIZONA_FLL_SRC_SLIMCLK 2 | 37 | #define ARIZONA_FLL_SRC_SLIMCLK 3 |
38 | #define ARIZONA_FLL_SRC_FLL1 3 | 38 | #define ARIZONA_FLL_SRC_FLL1 4 |
39 | #define ARIZONA_FLL_SRC_FLL2 4 | 39 | #define ARIZONA_FLL_SRC_FLL2 5 |
40 | #define ARIZONA_FLL_SRC_AIF1BCLK 5 | 40 | #define ARIZONA_FLL_SRC_AIF1BCLK 8 |
41 | #define ARIZONA_FLL_SRC_AIF2BCLK 6 | 41 | #define ARIZONA_FLL_SRC_AIF2BCLK 9 |
42 | #define ARIZONA_FLL_SRC_AIF3BCLK 7 | 42 | #define ARIZONA_FLL_SRC_AIF3BCLK 10 |
43 | #define ARIZONA_FLL_SRC_AIF1LRCLK 8 | 43 | #define ARIZONA_FLL_SRC_AIF1LRCLK 12 |
44 | #define ARIZONA_FLL_SRC_AIF2LRCLK 9 | 44 | #define ARIZONA_FLL_SRC_AIF2LRCLK 13 |
45 | #define ARIZONA_FLL_SRC_AIF3LRCLK 10 | 45 | #define ARIZONA_FLL_SRC_AIF3LRCLK 14 |
46 | 46 | ||
47 | #define ARIZONA_MIXER_VOL_MASK 0x00FE | 47 | #define ARIZONA_MIXER_VOL_MASK 0x00FE |
48 | #define ARIZONA_MIXER_VOL_SHIFT 1 | 48 | #define ARIZONA_MIXER_VOL_SHIFT 1 |
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c index 04ceb6d587c2..803d6db0eb69 100644 --- a/sound/soc/codecs/wm5102.c +++ b/sound/soc/codecs/wm5102.c | |||
@@ -36,6 +36,9 @@ | |||
36 | struct wm5102_priv { | 36 | struct wm5102_priv { |
37 | struct arizona_priv core; | 37 | struct arizona_priv core; |
38 | struct arizona_fll fll[2]; | 38 | struct arizona_fll fll[2]; |
39 | |||
40 | unsigned int spk_ena:2; | ||
41 | unsigned int spk_ena_pending:1; | ||
39 | }; | 42 | }; |
40 | 43 | ||
41 | static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0); | 44 | static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0); |
@@ -827,6 +830,47 @@ ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE), | |||
827 | ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE), | 830 | ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE), |
828 | }; | 831 | }; |
829 | 832 | ||
833 | static int wm5102_spk_ev(struct snd_soc_dapm_widget *w, | ||
834 | struct snd_kcontrol *kcontrol, | ||
835 | int event) | ||
836 | { | ||
837 | struct snd_soc_codec *codec = w->codec; | ||
838 | struct arizona *arizona = dev_get_drvdata(codec->dev->parent); | ||
839 | struct wm5102_priv *wm5102 = snd_soc_codec_get_drvdata(codec); | ||
840 | |||
841 | if (arizona->rev < 1) | ||
842 | return 0; | ||
843 | |||
844 | switch (event) { | ||
845 | case SND_SOC_DAPM_PRE_PMU: | ||
846 | if (!wm5102->spk_ena) { | ||
847 | snd_soc_write(codec, 0x4f5, 0x25a); | ||
848 | wm5102->spk_ena_pending = true; | ||
849 | } | ||
850 | break; | ||
851 | case SND_SOC_DAPM_POST_PMU: | ||
852 | if (wm5102->spk_ena_pending) { | ||
853 | msleep(75); | ||
854 | snd_soc_write(codec, 0x4f5, 0xda); | ||
855 | wm5102->spk_ena_pending = false; | ||
856 | wm5102->spk_ena++; | ||
857 | } | ||
858 | break; | ||
859 | case SND_SOC_DAPM_PRE_PMD: | ||
860 | wm5102->spk_ena--; | ||
861 | if (!wm5102->spk_ena) | ||
862 | snd_soc_write(codec, 0x4f5, 0x25a); | ||
863 | break; | ||
864 | case SND_SOC_DAPM_POST_PMD: | ||
865 | if (!wm5102->spk_ena) | ||
866 | snd_soc_write(codec, 0x4f5, 0x0da); | ||
867 | break; | ||
868 | } | ||
869 | |||
870 | return 0; | ||
871 | } | ||
872 | |||
873 | |||
830 | ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE); | 874 | ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE); |
831 | ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE); | 875 | ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE); |
832 | ARIZONA_MIXER_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE); | 876 | ARIZONA_MIXER_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE); |
@@ -1106,10 +1150,10 @@ SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1, | |||
1106 | ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, | 1150 | ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, |
1107 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 1151 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), |
1108 | SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1, | 1152 | SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1, |
1109 | ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, | 1153 | ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev, |
1110 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 1154 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), |
1111 | SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1, | 1155 | SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1, |
1112 | ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, | 1156 | ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev, |
1113 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 1157 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), |
1114 | SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1, | 1158 | SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1, |
1115 | ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, | 1159 | ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, |