diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-01-07 21:02:57 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-01-20 08:58:26 -0500 |
commit | 9b85fc90634972634a229aaa1c94f8c9a50fddbc (patch) | |
tree | b264e6e769c2250d4999950a36eecfec0cd65f06 | |
parent | 3b09bb820dda209d5c81e329420ccf36dd30c8eb (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.c | 31 | ||||
-rw-r--r-- | sound/soc/codecs/wm8904.h | 11 |
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[] = { | |||
569 | static const struct soc_enum hpf_mode = | 570 | static 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 | ||
573 | static 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 | |||
572 | static const struct snd_kcontrol_new wm8904_adc_snd_controls[] = { | 596 | static const struct snd_kcontrol_new wm8904_adc_snd_controls[] = { |
573 | SOC_DOUBLE_R_TLV("Digital Capture Volume", WM8904_ADC_DIGITAL_VOLUME_LEFT, | 597 | SOC_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, | |||
585 | SOC_SINGLE("High Pass Filter Switch", WM8904_ADC_DIGITAL_0, 4, 1, 0), | 609 | SOC_SINGLE("High Pass Filter Switch", WM8904_ADC_DIGITAL_0, 4, 1, 0), |
586 | SOC_ENUM("High Pass Filter Mode", hpf_mode), | 610 | SOC_ENUM("High Pass Filter Mode", hpf_mode), |
587 | 611 | ||
588 | SOC_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 | ||
591 | static const char *drc_path_text[] = { | 620 | static 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] */ |