From 96478622d78d20a1a4d22bbc0c523e99676b1ce1 Mon Sep 17 00:00:00 2001 From: Howard Mitchell Date: Fri, 27 Feb 2015 14:58:04 +0000 Subject: [PATCH 1/2] Revert "pcm512x: Use a range macro for Volume and rename to PCM." This reverts commit 457a0d6f5961c18f79a7643ca0a3e8565af8a0eb. --- sound/soc/codecs/pcm512x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/codecs/pcm512x.c b/sound/soc/codecs/pcm512x.c index b4057198d3f33..640c99198cda5 100644 --- a/sound/soc/codecs/pcm512x.c +++ b/sound/soc/codecs/pcm512x.c @@ -259,8 +259,8 @@ static const struct soc_enum pcm512x_veds = pcm512x_ramp_step_text); static const struct snd_kcontrol_new pcm512x_controls[] = { -SOC_DOUBLE_R_RANGE_TLV("PCM", PCM512x_DIGITAL_VOLUME_2, - PCM512x_DIGITAL_VOLUME_3, 0, 40, 255, 1, digital_tlv), +SOC_DOUBLE_R_TLV("Digital Playback Volume", PCM512x_DIGITAL_VOLUME_2, + PCM512x_DIGITAL_VOLUME_3, 0, 255, 1, digital_tlv), SOC_DOUBLE_TLV("Playback Volume", PCM512x_ANALOG_GAIN_CTRL, PCM512x_LAGN_SHIFT, PCM512x_RAGN_SHIFT, 1, 1, analog_tlv), SOC_DOUBLE_TLV("Playback Boost Volume", PCM512x_ANALOG_GAIN_BOOST, From f48db282eeaa81a3d5f8913c816368e56898d979 Mon Sep 17 00:00:00 2001 From: Howard Mitchell Date: Mon, 2 Mar 2015 17:28:02 +0000 Subject: [PATCH 2/2] Set a limit of 0dB on Digital Volume Control The main volume control in the PCM512x DAC has a range up to +24dB. This is dangerously loud and can potentially cause massive clipping in the output stages. Therefore this sets a sensible limit of 0dB for this control. --- sound/soc/bcm/iqaudio-dac.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sound/soc/bcm/iqaudio-dac.c b/sound/soc/bcm/iqaudio-dac.c index ee8cd6ee4b2d6..a38e8741f2633 100644 --- a/sound/soc/bcm/iqaudio-dac.c +++ b/sound/soc/bcm/iqaudio-dac.c @@ -25,7 +25,13 @@ static int snd_rpi_iqaudio_dac_init(struct snd_soc_pcm_runtime *rtd) { -// NOT USED struct snd_soc_codec *codec = rtd->codec; + int ret; + struct snd_soc_card *card = rtd->card; + struct snd_soc_codec *codec = rtd->codec; + + ret = snd_soc_limit_volume(codec, "Digital Playback Volume", 207); + if (ret < 0) + dev_warn(card->dev, "Failed to set volume limit: %d\n", ret); return 0; }