| From 84ebac4d04d25ac5c1b1dc3ae621fd465eb38f4e Mon Sep 17 00:00:00 2001 |
| From: John Keeping <john@metanate.com> |
| Date: Wed, 9 Dec 2015 11:38:13 +0000 |
| Subject: ASoC: es8328: Fix deemphasis values |
| |
| From: John Keeping <john@metanate.com> |
| |
| commit 84ebac4d04d25ac5c1b1dc3ae621fd465eb38f4e upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/soc/codecs/es8328.c | 25 +++++++++++++++++-------- |
| sound/soc/codecs/es8328.h | 1 + |
| 2 files changed, 18 insertions(+), 8 deletions(-) |
| |
| --- a/sound/soc/codecs/es8328.c |
| +++ b/sound/soc/codecs/es8328.c |
| @@ -85,7 +85,15 @@ static const DECLARE_TLV_DB_SCALE(pga_tl |
| static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0); |
| static const DECLARE_TLV_DB_SCALE(mic_tlv, 0, 300, 0); |
| |
| -static const int deemph_settings[] = { 0, 32000, 44100, 48000 }; |
| +static const struct { |
| + int rate; |
| + unsigned int val; |
| +} deemph_settings[] = { |
| + { 0, ES8328_DACCONTROL6_DEEMPH_OFF }, |
| + { 32000, ES8328_DACCONTROL6_DEEMPH_32k }, |
| + { 44100, ES8328_DACCONTROL6_DEEMPH_44_1k }, |
| + { 48000, ES8328_DACCONTROL6_DEEMPH_48k }, |
| +}; |
| |
| static int es8328_set_deemph(struct snd_soc_codec *codec) |
| { |
| @@ -97,21 +105,22 @@ static int es8328_set_deemph(struct snd_ |
| * rate. |
| */ |
| if (es8328->deemph) { |
| - best = 1; |
| - for (i = 2; i < ARRAY_SIZE(deemph_settings); i++) { |
| - if (abs(deemph_settings[i] - es8328->playback_fs) < |
| - abs(deemph_settings[best] - es8328->playback_fs)) |
| + best = 0; |
| + for (i = 1; i < ARRAY_SIZE(deemph_settings); i++) { |
| + if (abs(deemph_settings[i].rate - es8328->playback_fs) < |
| + abs(deemph_settings[best].rate - es8328->playback_fs)) |
| best = i; |
| } |
| |
| - val = best << 1; |
| + val = deemph_settings[best].val; |
| } else { |
| - val = 0; |
| + val = ES8328_DACCONTROL6_DEEMPH_OFF; |
| } |
| |
| dev_dbg(codec->dev, "Set deemphasis %d\n", val); |
| |
| - return snd_soc_update_bits(codec, ES8328_DACCONTROL6, 0x6, val); |
| + return snd_soc_update_bits(codec, ES8328_DACCONTROL6, |
| + ES8328_DACCONTROL6_DEEMPH_MASK, val); |
| } |
| |
| static int es8328_get_deemph(struct snd_kcontrol *kcontrol, |
| --- a/sound/soc/codecs/es8328.h |
| +++ b/sound/soc/codecs/es8328.h |
| @@ -153,6 +153,7 @@ int es8328_probe(struct device *dev, str |
| #define ES8328_DACCONTROL6_CLICKFREE (1 << 3) |
| #define ES8328_DACCONTROL6_DAC_INVR (1 << 4) |
| #define ES8328_DACCONTROL6_DAC_INVL (1 << 5) |
| +#define ES8328_DACCONTROL6_DEEMPH_MASK (3 << 6) |
| #define ES8328_DACCONTROL6_DEEMPH_OFF (0 << 6) |
| #define ES8328_DACCONTROL6_DEEMPH_32k (1 << 6) |
| #define ES8328_DACCONTROL6_DEEMPH_44_1k (2 << 6) |