diff options
| author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-01-10 07:21:42 -0500 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-01-10 07:21:42 -0500 |
| commit | ae1abb0c3be542555eac0509822373c86307a841 (patch) | |
| tree | e2736f9ccbc9553412ca18a179caf2d8fab1836e | |
| parent | 9931faca02c604c22335f5a935a501bb2ace6e20 (diff) | |
| parent | d71753e22b24548911b377db28f80870cf50d07b (diff) | |
Merge remote-tracking branch 'asoc/fix/arizona' into tmp
| -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 adf397b9d0e..1d8bb591759 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c | |||
| @@ -446,15 +446,9 @@ static int arizona_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | |||
| 446 | case SND_SOC_DAIFMT_DSP_A: | 446 | case SND_SOC_DAIFMT_DSP_A: |
| 447 | mode = 0; | 447 | mode = 0; |
| 448 | break; | 448 | break; |
| 449 | case SND_SOC_DAIFMT_DSP_B: | ||
| 450 | mode = 1; | ||
| 451 | break; | ||
| 452 | case SND_SOC_DAIFMT_I2S: | 449 | case SND_SOC_DAIFMT_I2S: |
| 453 | mode = 2; | 450 | mode = 2; |
| 454 | break; | 451 | break; |
| 455 | case SND_SOC_DAIFMT_LEFT_J: | ||
| 456 | mode = 3; | ||
| 457 | break; | ||
| 458 | default: | 452 | default: |
| 459 | arizona_aif_err(dai, "Unsupported DAI format %d\n", | 453 | arizona_aif_err(dai, "Unsupported DAI format %d\n", |
| 460 | fmt & SND_SOC_DAIFMT_FORMAT_MASK); | 454 | fmt & SND_SOC_DAIFMT_FORMAT_MASK); |
| @@ -714,7 +708,8 @@ static int arizona_hw_params(struct snd_pcm_substream *substream, | |||
| 714 | snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1, | 708 | snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1, |
| 715 | ARIZONA_ASYNC_SAMPLE_RATE_MASK, sr_val); | 709 | ARIZONA_ASYNC_SAMPLE_RATE_MASK, sr_val); |
| 716 | snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, | 710 | snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, |
| 717 | ARIZONA_AIF1_RATE_MASK, 8); | 711 | ARIZONA_AIF1_RATE_MASK, |
| 712 | 8 << ARIZONA_AIF1_RATE_SHIFT); | ||
| 718 | break; | 713 | break; |
| 719 | default: | 714 | default: |
| 720 | arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); | 715 | 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 41dae1ed3b7..4deebeb0717 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 688ade08058..7a9048dad1c 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); |
| @@ -787,6 +790,47 @@ ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE), | |||
| 787 | ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE), | 790 | ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE), |
| 788 | }; | 791 | }; |
| 789 | 792 | ||
| 793 | static int wm5102_spk_ev(struct snd_soc_dapm_widget *w, | ||
| 794 | struct snd_kcontrol *kcontrol, | ||
| 795 | int event) | ||
| 796 | { | ||
| 797 | struct snd_soc_codec *codec = w->codec; | ||
| 798 | struct arizona *arizona = dev_get_drvdata(codec->dev->parent); | ||
| 799 | struct wm5102_priv *wm5102 = snd_soc_codec_get_drvdata(codec); | ||
| 800 | |||
| 801 | if (arizona->rev < 1) | ||
| 802 | return 0; | ||
| 803 | |||
| 804 | switch (event) { | ||
| 805 | case SND_SOC_DAPM_PRE_PMU: | ||
| 806 | if (!wm5102->spk_ena) { | ||
| 807 | snd_soc_write(codec, 0x4f5, 0x25a); | ||
| 808 | wm5102->spk_ena_pending = true; | ||
| 809 | } | ||
| 810 | break; | ||
| 811 | case SND_SOC_DAPM_POST_PMU: | ||
| 812 | if (wm5102->spk_ena_pending) { | ||
| 813 | msleep(75); | ||
| 814 | snd_soc_write(codec, 0x4f5, 0xda); | ||
| 815 | wm5102->spk_ena_pending = false; | ||
| 816 | wm5102->spk_ena++; | ||
| 817 | } | ||
| 818 | break; | ||
| 819 | case SND_SOC_DAPM_PRE_PMD: | ||
| 820 | wm5102->spk_ena--; | ||
| 821 | if (!wm5102->spk_ena) | ||
| 822 | snd_soc_write(codec, 0x4f5, 0x25a); | ||
| 823 | break; | ||
| 824 | case SND_SOC_DAPM_POST_PMD: | ||
| 825 | if (!wm5102->spk_ena) | ||
| 826 | snd_soc_write(codec, 0x4f5, 0x0da); | ||
| 827 | break; | ||
| 828 | } | ||
| 829 | |||
| 830 | return 0; | ||
| 831 | } | ||
| 832 | |||
| 833 | |||
| 790 | ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE); | 834 | ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE); |
| 791 | ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE); | 835 | ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE); |
| 792 | ARIZONA_MIXER_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE); | 836 | ARIZONA_MIXER_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE); |
| @@ -1034,10 +1078,10 @@ SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1, | |||
| 1034 | ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, | 1078 | ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, |
| 1035 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 1079 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), |
| 1036 | SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1, | 1080 | SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1, |
| 1037 | ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, | 1081 | ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev, |
| 1038 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 1082 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), |
| 1039 | SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1, | 1083 | SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1, |
| 1040 | ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, | 1084 | ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev, |
| 1041 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 1085 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), |
| 1042 | SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1, | 1086 | SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1, |
| 1043 | ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, | 1087 | ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, |
