1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
From 290cec3c415ef37c10465f201545f26423241249 Mon Sep 17 00:00:00 2001
From: Digital Dreamtime <clive.messer@digitaldreamtime.co.uk>
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: <None>
Name: iqaudio-dacplus
Info: Configures the IQaudio DAC+ audio card
-Load: dtoverlay=iqaudio-dacplus
-Params: <None>
+Load: dtoverlay=iqaudio-dacplus,<param>=<val>
+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 <sound/soc.h>
#include <sound/jack.h>
+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);
|