Skip to content

Commit 014ee06

Browse files
LeeWeiTse-sevenbroonie
authored andcommitted
ASoC: nau8821: Improve AMIC recording performance.
Since the hardware may be designed as a single-ended input, the headset mic record only supports single-ended input on the left side. This patch will enhance microphone recording performance for single-end. Signed-off-by: Seven Lee <wtli@nuvoton.com> Link: https://lore.kernel.org/r/20230823071244.1861487-2-wtli@nuvoton.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 91e28d0 commit 014ee06

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

sound/soc/codecs/nau8821.c

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,36 @@ static int system_clock_control(struct snd_soc_dapm_widget *w,
624624
return 0;
625625
}
626626

627+
static int nau8821_left_fepga_event(struct snd_soc_dapm_widget *w,
628+
struct snd_kcontrol *kcontrol, int event)
629+
{
630+
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
631+
struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component);
632+
633+
if (!nau8821->left_input_single_end)
634+
return 0;
635+
636+
switch (event) {
637+
case SND_SOC_DAPM_POST_PMU:
638+
regmap_update_bits(nau8821->regmap, NAU8821_R77_FEPGA,
639+
NAU8821_ACDC_CTRL_MASK | NAU8821_FEPGA_MODEL_MASK,
640+
NAU8821_ACDC_VREF_MICN | NAU8821_FEPGA_MODEL_AAF);
641+
regmap_update_bits(nau8821->regmap, NAU8821_R76_BOOST,
642+
NAU8821_HP_BOOST_DISCHRG_EN, NAU8821_HP_BOOST_DISCHRG_EN);
643+
break;
644+
case SND_SOC_DAPM_POST_PMD:
645+
regmap_update_bits(nau8821->regmap, NAU8821_R77_FEPGA,
646+
NAU8821_ACDC_CTRL_MASK | NAU8821_FEPGA_MODEL_MASK, 0);
647+
regmap_update_bits(nau8821->regmap, NAU8821_R76_BOOST,
648+
NAU8821_HP_BOOST_DISCHRG_EN, 0);
649+
break;
650+
default:
651+
break;
652+
}
653+
654+
return 0;
655+
}
656+
627657
static const struct snd_soc_dapm_widget nau8821_dapm_widgets[] = {
628658
SND_SOC_DAPM_SUPPLY("System Clock", SND_SOC_NOPM, 0, 0,
629659
system_clock_control, SND_SOC_DAPM_POST_PMD),
@@ -635,8 +665,10 @@ static const struct snd_soc_dapm_widget nau8821_dapm_widgets[] = {
635665
NAU8821_POWERUP_ADCL_SFT, 0),
636666
SND_SOC_DAPM_ADC("ADCR Power", NULL, NAU8821_R72_ANALOG_ADC_2,
637667
NAU8821_POWERUP_ADCR_SFT, 0),
668+
/* single-ended design only on the left */
638669
SND_SOC_DAPM_PGA_S("Frontend PGA L", 1, NAU8821_R7F_POWER_UP_CONTROL,
639-
NAU8821_PUP_PGA_L_SFT, 0, NULL, 0),
670+
NAU8821_PUP_PGA_L_SFT, 0, nau8821_left_fepga_event,
671+
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
640672
SND_SOC_DAPM_PGA_S("Frontend PGA R", 1, NAU8821_R7F_POWER_UP_CONTROL,
641673
NAU8821_PUP_PGA_R_SFT, 0, NULL, 0),
642674
SND_SOC_DAPM_PGA_S("ADCL Digital path", 0, NAU8821_R01_ENA_CTRL,
@@ -1677,6 +1709,8 @@ static int nau8821_read_device_properties(struct device *dev,
16771709
"nuvoton,jkdet-pull-up");
16781710
nau8821->key_enable = device_property_read_bool(dev,
16791711
"nuvoton,key-enable");
1712+
nau8821->left_input_single_end = device_property_read_bool(dev,
1713+
"nuvoton,left-input-single-end");
16801714
ret = device_property_read_u32(dev, "nuvoton,jkdet-polarity",
16811715
&nau8821->jkdet_polarity);
16821716
if (ret)
@@ -1760,6 +1794,12 @@ static void nau8821_init_regs(struct nau8821 *nau8821)
17601794
NAU8821_ADC_SYNC_DOWN_MASK, NAU8821_ADC_SYNC_DOWN_64);
17611795
regmap_update_bits(regmap, NAU8821_R2C_DAC_CTRL1,
17621796
NAU8821_DAC_OVERSAMPLE_MASK, NAU8821_DAC_OVERSAMPLE_64);
1797+
if (nau8821->left_input_single_end) {
1798+
regmap_update_bits(regmap, NAU8821_R6B_PGA_MUTE,
1799+
NAU8821_MUTE_MICNL_EN, NAU8821_MUTE_MICNL_EN);
1800+
regmap_update_bits(regmap, NAU8821_R74_MIC_BIAS,
1801+
NAU8821_MICBIAS_LOWNOISE_EN, NAU8821_MICBIAS_LOWNOISE_EN);
1802+
}
17631803
}
17641804

17651805
static int nau8821_setup_irq(struct nau8821 *nau8821)

sound/soc/codecs/nau8821.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,14 @@
433433
#define NAU8821_DAC_CAPACITOR_MSB (0x1 << 1)
434434
#define NAU8821_DAC_CAPACITOR_LSB 0x1
435435

436+
/* MUTE_MIC_L_N (0x6b) */
437+
#define NAU8821_MUTE_MICNL_SFT 5
438+
#define NAU8821_MUTE_MICNL_EN (0x1 << NAU8821_MUTE_MICNL_SFT)
439+
#define NAU8821_MUTE_MICNR_SFT 4
440+
#define NAU8821_MUTE_MICNR_EN (0x1 << NAU8821_MUTE_MICNR_SFT)
441+
#define NAU8821_MUTE_MICRP_SFT 2
442+
#define NAU8821_MUTE_MICRP_EN (0x1 << NAU8821_MUTE_MICRP_SFT)
443+
436444
/* ANALOG_ADC_1 (0x71) */
437445
#define NAU8821_MICDET_EN_SFT 0
438446
#define NAU8821_MICDET_MASK 0x1
@@ -463,23 +471,39 @@
463471

464472
/* MIC_BIAS (0x74) */
465473
#define NAU8821_MICBIAS_JKR2 (0x1 << 12)
474+
#define NAU8821_MICBIAS_LOWNOISE_SFT 10
475+
#define NAU8821_MICBIAS_LOWNOISE_EN (0x1 << NAU8821_MICBIAS_LOWNOISE_SFT)
466476
#define NAU8821_MICBIAS_POWERUP_SFT 8
477+
#define NAU8821_MICBIAS_POWERUP_EN (0x1 << NAU8821_MICBIAS_POWERUP_SFT)
467478
#define NAU8821_MICBIAS_VOLTAGE_SFT 0
468479
#define NAU8821_MICBIAS_VOLTAGE_MASK 0x7
469480

470481
/* BOOST (0x76) */
471482
#define NAU8821_PRECHARGE_DIS (0x1 << 13)
472483
#define NAU8821_GLOBAL_BIAS_EN (0x1 << 12)
484+
#define NAU8821_HP_BOOST_DISCHRG_SFT 11
485+
#define NAU8821_HP_BOOST_DISCHRG_EN (0x1 << NAU8821_HP_BOOST_DISCHRG_SFT)
473486
#define NAU8821_HP_BOOST_DIS_SFT 9
474487
#define NAU8821_HP_BOOST_DIS (0x1 << NAU8821_HP_BOOST_DIS_SFT)
475488
#define NAU8821_HP_BOOST_G_DIS (0x1 << 8)
476489
#define NAU8821_SHORT_SHUTDOWN_EN (0x1 << 6)
477490

478491
/* FEPGA (0x77) */
492+
#define NAU8821_ACDC_CTRL_SFT 14
493+
#define NAU8821_ACDC_CTRL_MASK (0x3 << NAU8821_ACDC_CTRL_SFT)
494+
#define NAU8821_ACDC_VREF_MICP (0x1 << NAU8821_ACDC_CTRL_SFT)
495+
#define NAU8821_ACDC_VREF_MICN (0x2 << NAU8821_ACDC_CTRL_SFT)
479496
#define NAU8821_FEPGA_MODEL_SFT 4
480497
#define NAU8821_FEPGA_MODEL_MASK (0xf << NAU8821_FEPGA_MODEL_SFT)
498+
#define NAU8821_FEPGA_MODEL_AAF (0x1 << NAU8821_FEPGA_MODEL_SFT)
499+
#define NAU8821_FEPGA_MODEL_DIS (0x2 << NAU8821_FEPGA_MODEL_SFT)
500+
#define NAU8821_FEPGA_MODEL_IMP12K (0x8 << NAU8821_FEPGA_MODEL_SFT)
481501
#define NAU8821_FEPGA_MODER_SFT 0
482502
#define NAU8821_FEPGA_MODER_MASK 0xf
503+
#define NAU8821_FEPGA_MODER_AAF 0x1
504+
#define NAU8821_FEPGA_MODER_DIS 0x2
505+
#define NAU8821_FEPGA_MODER_IMP12K 0x8
506+
483507

484508
/* PGA_GAIN (0x7e) */
485509
#define NAU8821_PGA_GAIN_L_SFT 8
@@ -543,6 +567,7 @@ struct nau8821 {
543567
bool jkdet_enable;
544568
bool jkdet_pull_enable;
545569
bool jkdet_pull_up;
570+
bool left_input_single_end;
546571
int jkdet_polarity;
547572
int jack_insert_debounce;
548573
int jack_eject_debounce;

0 commit comments

Comments
 (0)