From 290cec3c415ef37c10465f201545f26423241249 Mon Sep 17 00:00:00 2001 From: Digital Dreamtime Date: Thu, 4 Feb 2016 14:14:44 +0000 Subject: [PATCH] Allow up to 24dB digital gain to be applied when using IQAudIO DAC+ 24db_digital_gain DT param can be used to specify that PCM512x codec "Digital" volume control should not be limited to 0dB gain, and if specified will allow the full 24dB gain. --- arch/arm/boot/dts/overlays/README | 17 +++++++++++++++-- .../boot/dts/overlays/iqaudio-dacplus-overlay.dts | 6 +++++- sound/soc/bcm/iqaudio-dac.c | 20 ++++++++++++++------ 3 files changed, 34 insertions(+), 9 deletions(-) --- a/arch/arm/boot/dts/overlays/README +++ b/arch/arm/boot/dts/overlays/README @@ -362,8 +362,21 @@ Params: Name: iqaudio-dacplus Info: Configures the IQaudio DAC+ audio card -Load: dtoverlay=iqaudio-dacplus -Params: +Load: dtoverlay=iqaudio-dacplus,= +Params: 24db_digital_gain Allow gain to be applied via the PCM512x codec + Digital volume control. Enable with + "dtoverlay=iqaudio-dacplus,24db_digital_gain" + (The default behaviour is that the Digital + volume control is limited to a maximum of + 0dB. ie. it can attenuate but not provide + gain. For most users, this will be desired + as it will prevent clipping. By appending + the 24db_digital_gain parameter, the Digital + volume control will allow up to 24dB of + gain. If this parameter is enabled, it is the + responsibility of the user to ensure that + the Digital volume control is set to a value + that does not result in clipping/distortion!) Name: lirc-rpi --- a/arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts +++ b/arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts @@ -7,7 +7,7 @@ fragment@0 { target = <&sound>; - __overlay__ { + frag0: __overlay__ { compatible = "iqaudio,iqaudio-dac"; i2s-controller = <&i2s>; status = "okay"; @@ -36,4 +36,8 @@ }; }; }; + + __overrides__ { + 24db_digital_gain = <&frag0>,"iqaudio,24db_digital_gain?"; + }; }; --- a/sound/soc/bcm/iqaudio-dac.c +++ b/sound/soc/bcm/iqaudio-dac.c @@ -23,14 +23,19 @@ #include #include +static bool digital_gain_0db_limit = true; + static int snd_rpi_iqaudio_dac_init(struct snd_soc_pcm_runtime *rtd) { - int ret; - struct snd_soc_card *card = rtd->card; - - ret = snd_soc_limit_volume(card, "Digital Playback Volume", 207); - if (ret < 0) - dev_warn(card->dev, "Failed to set volume limit: %d\n", ret); + if (digital_gain_0db_limit) + { + int ret; + struct snd_soc_card *card = rtd->card; + + ret = snd_soc_limit_volume(card, "Digital Playback Volume", 207); + if (ret < 0) + dev_warn(card->dev, "Failed to set volume limit: %d\n", ret); + } return 0; } @@ -94,6 +99,9 @@ static int snd_rpi_iqaudio_dac_probe(str dai->platform_name = NULL; dai->platform_of_node = i2s_node; } + + digital_gain_0db_limit = !of_property_read_bool(pdev->dev.of_node, + "iqaudio,24db_digital_gain"); } ret = snd_soc_register_card(&snd_rpi_iqaudio_dac);