aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2012-01-07 21:02:57 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-01-20 08:58:26 -0500
commit9b85fc90634972634a229aaa1c94f8c9a50fddbc (patch)
treeb264e6e769c2250d4999950a36eecfec0cd65f06
parent3b09bb820dda209d5c81e329420ccf36dd30c8eb (diff)
ASoC: Optimise performance of WM8904 ADC 128fs OSR mode
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--sound/soc/codecs/wm8904.c31
-rw-r--r--sound/soc/codecs/wm8904.h11
2 files changed, 41 insertions, 1 deletions
diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c
index f2a740de3ad1..14afc1193343 100644
--- a/sound/soc/codecs/wm8904.c
+++ b/sound/soc/codecs/wm8904.c
@@ -304,6 +304,7 @@ static bool wm8904_readable_register(struct device *dev, unsigned int reg)
304 case WM8904_EQ23: 304 case WM8904_EQ23:
305 case WM8904_EQ24: 305 case WM8904_EQ24:
306 case WM8904_CONTROL_INTERFACE_TEST_1: 306 case WM8904_CONTROL_INTERFACE_TEST_1:
307 case WM8904_ADC_TEST_0:
307 case WM8904_ANALOGUE_OUTPUT_BIAS_0: 308 case WM8904_ANALOGUE_OUTPUT_BIAS_0:
308 case WM8904_FLL_NCO_TEST_0: 309 case WM8904_FLL_NCO_TEST_0:
309 case WM8904_FLL_NCO_TEST_1: 310 case WM8904_FLL_NCO_TEST_1:
@@ -569,6 +570,29 @@ static const char *hpf_mode_text[] = {
569static const struct soc_enum hpf_mode = 570static const struct soc_enum hpf_mode =
570 SOC_ENUM_SINGLE(WM8904_ADC_DIGITAL_0, 5, 4, hpf_mode_text); 571 SOC_ENUM_SINGLE(WM8904_ADC_DIGITAL_0, 5, 4, hpf_mode_text);
571 572
573static int wm8904_adc_osr_put(struct snd_kcontrol *kcontrol,
574 struct snd_ctl_elem_value *ucontrol)
575{
576 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
577 unsigned int val;
578 int ret;
579
580 ret = snd_soc_put_volsw(kcontrol, ucontrol);
581 if (ret < 0)
582 return ret;
583
584 if (ucontrol->value.integer.value[0])
585 val = 0;
586 else
587 val = WM8904_ADC_128_OSR_TST_MODE | WM8904_ADC_BIASX1P5;
588
589 snd_soc_update_bits(codec, WM8904_ADC_TEST_0,
590 WM8904_ADC_128_OSR_TST_MODE | WM8904_ADC_BIASX1P5,
591 val);
592
593 return ret;
594}
595
572static const struct snd_kcontrol_new wm8904_adc_snd_controls[] = { 596static const struct snd_kcontrol_new wm8904_adc_snd_controls[] = {
573SOC_DOUBLE_R_TLV("Digital Capture Volume", WM8904_ADC_DIGITAL_VOLUME_LEFT, 597SOC_DOUBLE_R_TLV("Digital Capture Volume", WM8904_ADC_DIGITAL_VOLUME_LEFT,
574 WM8904_ADC_DIGITAL_VOLUME_RIGHT, 1, 119, 0, digital_tlv), 598 WM8904_ADC_DIGITAL_VOLUME_RIGHT, 1, 119, 0, digital_tlv),
@@ -585,7 +609,12 @@ SOC_DOUBLE_R("Capture Switch", WM8904_ANALOGUE_LEFT_INPUT_0,
585SOC_SINGLE("High Pass Filter Switch", WM8904_ADC_DIGITAL_0, 4, 1, 0), 609SOC_SINGLE("High Pass Filter Switch", WM8904_ADC_DIGITAL_0, 4, 1, 0),
586SOC_ENUM("High Pass Filter Mode", hpf_mode), 610SOC_ENUM("High Pass Filter Mode", hpf_mode),
587 611
588SOC_SINGLE("ADC 128x OSR Switch", WM8904_ANALOGUE_ADC_0, 0, 1, 0), 612{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
613 .name = "ADC 128x OSR Switch",
614 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,
615 .put = wm8904_adc_osr_put,
616 .private_value = SOC_SINGLE_VALUE(WM8904_ANALOGUE_ADC_0, 0, 1, 0),
617},
589}; 618};
590 619
591static const char *drc_path_text[] = { 620static const char *drc_path_text[] = {
diff --git a/sound/soc/codecs/wm8904.h b/sound/soc/codecs/wm8904.h
index 9e8c84188ba7..c29a0e8131ca 100644
--- a/sound/soc/codecs/wm8904.h
+++ b/sound/soc/codecs/wm8904.h
@@ -123,6 +123,7 @@
123#define WM8904_EQ23 0x9C 123#define WM8904_EQ23 0x9C
124#define WM8904_EQ24 0x9D 124#define WM8904_EQ24 0x9D
125#define WM8904_CONTROL_INTERFACE_TEST_1 0xA1 125#define WM8904_CONTROL_INTERFACE_TEST_1 0xA1
126#define WM8904_ADC_TEST_0 0xC6
126#define WM8904_ANALOGUE_OUTPUT_BIAS_0 0xCC 127#define WM8904_ANALOGUE_OUTPUT_BIAS_0 0xCC
127#define WM8904_FLL_NCO_TEST_0 0xF7 128#define WM8904_FLL_NCO_TEST_0 0xF7
128#define WM8904_FLL_NCO_TEST_1 0xF8 129#define WM8904_FLL_NCO_TEST_1 0xF8
@@ -1557,6 +1558,16 @@
1557#define WM8904_USER_KEY_WIDTH 1 /* USER_KEY */ 1558#define WM8904_USER_KEY_WIDTH 1 /* USER_KEY */
1558 1559
1559/* 1560/*
1561 * R198 (0xC6) - ADC Test 0
1562 */
1563#define WM8904_ADC_128_OSR_TST_MODE 0x0004 /* ADC_128_OSR_TST_MODE */
1564#define WM8904_ADC_128_OSR_TST_MODE_SHIFT 2 /* ADC_128_OSR_TST_MODE */
1565#define WM8904_ADC_128_OSR_TST_MODE_WIDTH 1 /* ADC_128_OSR_TST_MODE */
1566#define WM8904_ADC_BIASX1P5 0x0001 /* ADC_BIASX1P5 */
1567#define WM8904_ADC_BIASX1P5_SHIFT 0 /* ADC_BIASX1P5 */
1568#define WM8904_ADC_BIASX1P5_WIDTH 1 /* ADC_BIASX1P5 */
1569
1570/*
1560 * R204 (0xCC) - Analogue Output Bias 0 1571 * R204 (0xCC) - Analogue Output Bias 0
1561 */ 1572 */
1562#define WM8904_PGA_BIAS_MASK 0x0070 /* PGA_BIAS - [6:4] */ 1573#define WM8904_PGA_BIAS_MASK 0x0070 /* PGA_BIAS - [6:4] */