@@ -305,6 +305,66 @@ static int nau8821_biq_coeff_put(struct snd_kcontrol *kcontrol,
return 0;
}
+static int nau8821_slew_rate_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+ struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component);
+ unsigned int value;
+
+ regmap_read(nau8821->regmap, NAU8821_R13_DMIC_CTRL, &value);
+ nau8821->def_mclk_src = (value & NAU8821_DMIC_SLEW_MASK)
+ >> NAU8821_DMIC_SLEW_SFT;
+ ucontrol->value.bytes.data[0] = nau8821->def_mclk_src;
+
+ return 0;
+}
+
+static int nau8821_slew_rate_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+ struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component);
+
+ nau8821->def_mclk_src = ucontrol->value.integer.value[0];
+
+ regmap_update_bits(component->regmap, NAU8821_R13_DMIC_CTRL,
+ NAU8821_DMIC_SLEW_MASK,
+ nau8821->def_mclk_src << NAU8821_DMIC_SLEW_SFT);
+
+ return 0;
+}
+
+static int nau8821_dmic_clock_speed_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+ struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component);
+ unsigned int value;
+
+ regmap_read(nau8821->regmap, NAU8821_R13_DMIC_CTRL, &value);
+ nau8821->def_dmic_clock = (value & NAU8821_DMIC_SRC_MASK)
+ >> NAU8821_DMIC_SRC_SFT;
+ ucontrol->value.bytes.data[0] = nau8821->def_dmic_clock;
+
+ return 0;
+}
+
+static int nau8821_dmic_clock_speed_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+ struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component);
+
+ nau8821->def_dmic_clock = ucontrol->value.integer.value[0];
+
+ regmap_update_bits(component->regmap, NAU8821_R13_DMIC_CTRL,
+ NAU8821_DMIC_SRC_MASK,
+ nau8821->def_dmic_clock << NAU8821_DMIC_SRC_SFT);
+
+ return 0;
+}
+
static const char * const nau8821_adc_decimation[] = {
"32", "64", "128", "256" };
@@ -319,6 +379,20 @@ static const struct soc_enum nau8821_dac_oversampl_enum =
SOC_ENUM_SINGLE(NAU8821_R2C_DAC_CTRL1, NAU8821_DAC_OVERSAMPLE_SFT,
ARRAY_SIZE(nau8821_dac_oversampl), nau8821_dac_oversampl);
+static const char *const dmic_slew_text[] = {"0", "1", "2", "3", "4", "5",
+ "6", "7"};
+
+static const struct soc_enum nau8821_slew_rate_enum =
+ SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dmic_slew_text),
+ dmic_slew_text);
+
+static const char *const dmic_clock_speed_text[] = {"3.072", "1.536", "0.768",
+ "0.384"};
+
+static const struct soc_enum nau8821_dmic_clock_speed_enum =
+ SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dmic_clock_speed_text),
+ dmic_clock_speed_text);
+
static const DECLARE_TLV_DB_MINMAX_MUTE(adc_vol_tlv, -6600, 2400);
static const DECLARE_TLV_DB_MINMAX_MUTE(sidetone_vol_tlv, -4200, 0);
static const DECLARE_TLV_DB_MINMAX(hp_vol_tlv, -900, 0);
@@ -350,6 +424,11 @@ static const struct snd_kcontrol_new nau8821_controls[] = {
nau8821_biq_coeff_get, nau8821_biq_coeff_put),
SOC_SINGLE("ADC Phase Switch", NAU8821_R1B_TDM_CTRL,
NAU8821_ADCPHS_SFT, 1, 0),
+ SOC_ENUM_EXT("Slew Rate Selection", nau8821_slew_rate_enum,
+ nau8821_slew_rate_get, nau8821_slew_rate_put),
+ SOC_ENUM_EXT("DMIC Clock Speed Selection",
+ nau8821_dmic_clock_speed_enum, nau8821_dmic_clock_speed_get,
+ nau8821_dmic_clock_speed_put),
};
static const struct snd_kcontrol_new nau8821_dmic_mode_switch =
@@ -228,7 +228,7 @@
#define NAU8821_IRQ_INSERT_DIS 0x1
/* DMIC_CTRL (0x13) */
-#define NAU8821_DMIC_DS_SFT 7
+#define NAU8821_DMIC_DS_SFT 11
#define NAU8821_DMIC_DS_MASK (0x1 << NAU8821_DMIC_DS_SFT)
#define NAU8821_DMIC_DS_HIGH (0x1 << NAU8821_DMIC_DS_SFT)
#define NAU8821_DMIC_DS_LOW (0x0 << NAU8821_DMIC_DS_SFT)
@@ -236,6 +236,8 @@
#define NAU8821_DMIC_SRC_MASK (0x3 << NAU8821_DMIC_SRC_SFT)
#define NAU8821_CLK_DMIC_SRC (0x2 << NAU8821_DMIC_SRC_SFT)
#define NAU8821_DMIC_EN_SFT 0
+#define NAU8821_DMIC_SLEW_SFT 8
+#define NAU8821_DMIC_SLEW_MASK (0x7 << NAU8821_DMIC_SLEW_SFT)
/* GPIO12_CTRL (0x1a) */
#define NAU8821_JKDET_PULL_UP (0x1 << 11) /* 0 - pull down, 1 - pull up */
@@ -525,6 +527,8 @@ struct nau8821 {
int jack_eject_debounce;
int fs;
int dmic_clk_threshold;
+ int def_mclk_src;
+ int def_dmic_clock;
};
int nau8821_enable_jack_detect(struct snd_soc_component *component,
Add the following two control options: 1. DMIC pin slew rate selection. 2. DMIC clock speed selection. Signed-off-by: Seven Lee <wtli@nuvoton.com> --- sound/soc/codecs/nau8821.c | 79 ++++++++++++++++++++++++++++++++++++++ sound/soc/codecs/nau8821.h | 6 ++- 2 files changed, 84 insertions(+), 1 deletion(-)