The only particularly remarkable change here is the one for handling of the Android suspend ignore code for idle_bias_off CODECs. That one is actually a regression fix as some of the new power savings that have been introduced confused the suspend ignore code, making devices that are active for non-audio reasons look like they are idle causing them to be suspended instead of being kept active.
Unified · Split
| @@ -1113,7 +1113,7 @@ static int cs42l73_pcm_hw_params(struct snd_pcm_substream *substream, · 1112 unmodified lines | |||
| 1113 | priv->config[id].mmcc &= 0xC0; | 1113 | priv->config[id].mmcc &= 0xC0; |
| 1114 | priv->config[id].mmcc |= cs42l73_mclk_coeffs[mclk_coeff].mmcc; | 1114 | priv->config[id].mmcc |= cs42l73_mclk_coeffs[mclk_coeff].mmcc; |
| 1115 | priv->config[id].spc &= 0xFC; | 1115 | priv->config[id].spc &= 0xFC; |
| 1116 | priv->config[id].spc &= MCK_SCLK_64FS; | 1116 | priv->config[id].spc |= MCK_SCLK_MCLK; |
| 1117 | } else { | 1117 | } else { |
| 1118 | /* CS42L73 Slave */ | 1118 | /* CS42L73 Slave */ |
| 1119 | priv->config[id].spc &= 0xFC; | 1119 | priv->config[id].spc &= 0xFC; |
| @@ -3159,13 +3159,13 @@ static int wm8962_hw_params(struct snd_pcm_substream *substream, · 3158 unmodified lines | |||
| 3159 | case SNDRV_PCM_FORMAT_S16_LE: | 3159 | case SNDRV_PCM_FORMAT_S16_LE: |
| 3160 | break; | 3160 | break; |
| 3161 | case SNDRV_PCM_FORMAT_S20_3LE: | 3161 | case SNDRV_PCM_FORMAT_S20_3LE: |
| 3162 | aif0 |= 0x40; | 3162 | aif0 |= 0x4; |
| 3163 | break; | 3163 | break; |
| 3164 | case SNDRV_PCM_FORMAT_S24_LE: | 3164 | case SNDRV_PCM_FORMAT_S24_LE: |
| 3165 | aif0 |= 0x80; | 3165 | aif0 |= 0x8; |
| 3166 | break; | 3166 | break; |
| 3167 | case SNDRV_PCM_FORMAT_S32_LE: | 3167 | case SNDRV_PCM_FORMAT_S32_LE: |
| 3168 | aif0 |= 0xc0; | 3168 | aif0 |= 0xc; |
| 3169 | break; | 3169 | break; |
| 3170 | default: | 3170 | default: |
| 3171 | return -EINVAL; | 3171 | return -EINVAL; |
| @@ -2753,11 +2753,6 @@ static int wm8994_resume(struct snd_soc_codec *codec) · 2752 unmodified lines | |||
| 2753 | codec->cache_only = 0; | 2753 | codec->cache_only = 0; |
| 2754 | } | 2754 | } |
| 2755 | 2755 | ||
| 2756 | /* Restore the registers */ | ||
| 2757 | ret = snd_soc_cache_sync(codec); | ||
| 2758 | if (ret != 0) | ||
| 2759 | dev_err(codec->dev, "Failed to sync cache: %d\n", ret); | ||
| 2760 | |||
| 2761 | wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 2756 | wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
| 2762 | 2757 | ||
| 2763 | for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { | 2758 | for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { |
| @@ -586,8 +586,8 @@ SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER1, 0, 1, 0), · 585 unmodified lines | |||
| 586 | }; | 586 | }; |
| 587 | 587 | ||
| 588 | static const struct snd_kcontrol_new line2_mix[] = { | 588 | static const struct snd_kcontrol_new line2_mix[] = { |
| 589 | SOC_DAPM_SINGLE("IN2R Switch", WM8993_LINE_MIXER2, 2, 1, 0), | 589 | SOC_DAPM_SINGLE("IN1L Switch", WM8993_LINE_MIXER2, 2, 1, 0), |
| 590 | SOC_DAPM_SINGLE("IN2L Switch", WM8993_LINE_MIXER2, 1, 1, 0), | 590 | SOC_DAPM_SINGLE("IN1R Switch", WM8993_LINE_MIXER2, 1, 1, 0), |
| 591 | SOC_DAPM_SINGLE("Output Switch", WM8993_LINE_MIXER2, 0, 1, 0), | 591 | SOC_DAPM_SINGLE("Output Switch", WM8993_LINE_MIXER2, 0, 1, 0), |
| 592 | }; | 592 | }; |
| 593 | 593 | ||
| @@ -848,8 +848,8 @@ static const struct snd_soc_dapm_route lineout1_se_routes[] = { · 254 unmodified lines | |||
| 848 | }; | 848 | }; |
| 849 | 849 | ||
| 850 | static const struct snd_soc_dapm_route lineout2_diff_routes[] = { | 850 | static const struct snd_soc_dapm_route lineout2_diff_routes[] = { |
| 851 | { "LINEOUT2 Mixer", "IN2L Switch", "IN2L PGA" }, | 851 | { "LINEOUT2 Mixer", "IN1L Switch", "IN1L PGA" }, |
| 852 | { "LINEOUT2 Mixer", "IN2R Switch", "IN2R PGA" }, | 852 | { "LINEOUT2 Mixer", "IN1R Switch", "IN1R PGA" }, |
| 853 | { "LINEOUT2 Mixer", "Output Switch", "Right Output PGA" }, | 853 | { "LINEOUT2 Mixer", "Output Switch", "Right Output PGA" }, |
| 854 | 854 | ||
| 855 | { "LINEOUT2N Driver", NULL, "LINEOUT2 Mixer" }, | 855 | { "LINEOUT2N Driver", NULL, "LINEOUT2 Mixer" }, |
| @@ -567,6 +567,17 @@ int snd_soc_suspend(struct device *dev) · 566 unmodified lines | |||
| 567 | if (!codec->suspended && codec->driver->suspend) { | 567 | if (!codec->suspended && codec->driver->suspend) { |
| 568 | switch (codec->dapm.bias_level) { | 568 | switch (codec->dapm.bias_level) { |
| 569 | case SND_SOC_BIAS_STANDBY: | 569 | case SND_SOC_BIAS_STANDBY: |
| 570 | /* | ||
| 571 | * If the CODEC is capable of idle | ||
| 572 | * bias off then being in STANDBY | ||
| 573 | * means it's doing something, | ||
| 574 | * otherwise fall through. | ||
| 575 | */ | ||
| 576 | if (codec->dapm.idle_bias_off) { | ||
| 577 | dev_dbg(codec->dev, | ||
| 578 | "idle_bias_off CODEC on over suspend\n"); | ||
| 579 | break; | ||
| 580 | } | ||
| 570 | case SND_SOC_BIAS_OFF: | 581 | case SND_SOC_BIAS_OFF: |
| 571 | codec->driver->suspend(codec); | 582 | codec->driver->suspend(codec); |
| 572 | codec->suspended = 1; | 583 | codec->suspended = 1; |