Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: es8328: Fix deemphasis values

This is using completely the wrong mask and value when updating the
register. Since the correct values are already defined in the header,
switch to using a table with explicit constants rather than shifting the
array index.

Signed-off-by: John Keeping <john@metanate.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: stable@vger.kernel.org

authored by

John Keeping and committed by
Mark Brown
84ebac4d 8005c49d

+18 -8
+17 -8
sound/soc/codecs/es8328.c
··· 85 85 static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0); 86 86 static const DECLARE_TLV_DB_SCALE(mic_tlv, 0, 300, 0); 87 87 88 - static const int deemph_settings[] = { 0, 32000, 44100, 48000 }; 88 + static const struct { 89 + int rate; 90 + unsigned int val; 91 + } deemph_settings[] = { 92 + { 0, ES8328_DACCONTROL6_DEEMPH_OFF }, 93 + { 32000, ES8328_DACCONTROL6_DEEMPH_32k }, 94 + { 44100, ES8328_DACCONTROL6_DEEMPH_44_1k }, 95 + { 48000, ES8328_DACCONTROL6_DEEMPH_48k }, 96 + }; 89 97 90 98 static int es8328_set_deemph(struct snd_soc_codec *codec) 91 99 { ··· 105 97 * rate. 106 98 */ 107 99 if (es8328->deemph) { 108 - best = 1; 109 - for (i = 2; i < ARRAY_SIZE(deemph_settings); i++) { 110 - if (abs(deemph_settings[i] - es8328->playback_fs) < 111 - abs(deemph_settings[best] - es8328->playback_fs)) 100 + best = 0; 101 + for (i = 1; i < ARRAY_SIZE(deemph_settings); i++) { 102 + if (abs(deemph_settings[i].rate - es8328->playback_fs) < 103 + abs(deemph_settings[best].rate - es8328->playback_fs)) 112 104 best = i; 113 105 } 114 106 115 - val = best << 1; 107 + val = deemph_settings[best].val; 116 108 } else { 117 - val = 0; 109 + val = ES8328_DACCONTROL6_DEEMPH_OFF; 118 110 } 119 111 120 112 dev_dbg(codec->dev, "Set deemphasis %d\n", val); 121 113 122 - return snd_soc_update_bits(codec, ES8328_DACCONTROL6, 0x6, val); 114 + return snd_soc_update_bits(codec, ES8328_DACCONTROL6, 115 + ES8328_DACCONTROL6_DEEMPH_MASK, val); 123 116 } 124 117 125 118 static int es8328_get_deemph(struct snd_kcontrol *kcontrol,
+1
sound/soc/codecs/es8328.h
··· 153 153 #define ES8328_DACCONTROL6_CLICKFREE (1 << 3) 154 154 #define ES8328_DACCONTROL6_DAC_INVR (1 << 4) 155 155 #define ES8328_DACCONTROL6_DAC_INVL (1 << 5) 156 + #define ES8328_DACCONTROL6_DEEMPH_MASK (3 << 6) 156 157 #define ES8328_DACCONTROL6_DEEMPH_OFF (0 << 6) 157 158 #define ES8328_DACCONTROL6_DEEMPH_32k (1 << 6) 158 159 #define ES8328_DACCONTROL6_DEEMPH_44_1k (2 << 6)