ASoC: adau1761: Add PGA Slew time control
authorLars-Peter Clausen <lars@metafoo.de>
Thu, 26 Sep 2019 11:50:11 +0000 (14:50 +0300)
committerMark Brown <broonie@kernel.org>
Tue, 1 Oct 2019 11:15:43 +0000 (12:15 +0100)
The PGA Slew Time control allows to configure the rate with which the PGA
gain control ramps up/down to the target setting.

The PGA slew control is done via the ALC Control 0 register. There are 2
bits on that reg, that control PGA slew time, while the other bits control
parts of the ALC (automatic level control) block.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Link: https://lore.kernel.org/r/20190926115012.24049-1-alexandru.ardelean@analog.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/adau1761.c

index 977f5a6..a9ef735 100644 (file)
@@ -28,6 +28,7 @@
 #define ADAU1761_REC_MIXER_RIGHT1      0x400d
 #define ADAU1761_LEFT_DIFF_INPUT_VOL   0x400e
 #define ADAU1761_RIGHT_DIFF_INPUT_VOL  0x400f
+#define ADAU1761_ALC_CTRL0             0x4011
 #define ADAU1761_PLAY_LR_MIXER_LEFT    0x4020
 #define ADAU1761_PLAY_MIXER_LEFT0      0x401c
 #define ADAU1761_PLAY_MIXER_LEFT1      0x401d
@@ -71,6 +72,7 @@ static const struct reg_default adau1761_reg_defaults[] = {
        { ADAU1761_REC_MIXER_RIGHT0,            0x00 },
        { ADAU1761_REC_MIXER_RIGHT1,            0x00 },
        { ADAU1761_LEFT_DIFF_INPUT_VOL,         0x00 },
+       { ADAU1761_ALC_CTRL0,                   0x00 },
        { ADAU1761_RIGHT_DIFF_INPUT_VOL,        0x00 },
        { ADAU1761_PLAY_LR_MIXER_LEFT,          0x00 },
        { ADAU1761_PLAY_MIXER_LEFT0,            0x00 },
@@ -147,6 +149,21 @@ static SOC_VALUE_ENUM_SINGLE_DECL(adau1761_capture_bias_enum,
                ADAU17X1_REC_POWER_MGMT, 1, 0x3, adau1761_bias_select_text,
                adau1761_bias_select_values);
 
+static const unsigned int adau1761_pga_slew_time_values[] = {
+       3, 0, 1, 2,
+};
+
+static const char * const adau1761_pga_slew_time_text[] = {
+       "Off",
+       "24 ms",
+       "48 ms",
+       "96 ms",
+};
+
+static SOC_VALUE_ENUM_SINGLE_DECL(adau1761_pga_slew_time_enum,
+               ADAU1761_ALC_CTRL0, 6, 0x3, adau1761_pga_slew_time_text,
+               adau1761_pga_slew_time_values);
+
 static const struct snd_kcontrol_new adau1761_jack_detect_controls[] = {
        SOC_SINGLE("Speaker Auto-mute Switch", ADAU1761_DIGMIC_JACKDETECT,
                4, 1, 0),
@@ -161,6 +178,8 @@ static const struct snd_kcontrol_new adau1761_differential_mode_controls[] = {
 
        SOC_DOUBLE_R_TLV("PGA Boost Capture Volume", ADAU1761_REC_MIXER_LEFT1,
                ADAU1761_REC_MIXER_RIGHT1, 3, 2, 0, adau1761_pga_boost_tlv),
+
+       SOC_ENUM("PGA Capture Slew Time", adau1761_pga_slew_time_enum),
 };
 
 static const struct snd_kcontrol_new adau1761_single_mode_controls[] = {
@@ -632,6 +651,7 @@ static bool adau1761_readable_register(struct device *dev, unsigned int reg)
        case ADAU1761_DEJITTER:
        case ADAU1761_CLK_ENABLE0:
        case ADAU1761_CLK_ENABLE1:
+       case ADAU1761_ALC_CTRL0:
                return true;
        default:
                break;