| From ece602dfdc038f5088ebf6ee8ceaf1e7ace6d8d2 Mon Sep 17 00:00:00 2001 |
| From: Sylwester Nawrocki <s.nawrocki@samsung.com> |
| Date: Fri, 20 Sep 2019 15:02:10 +0200 |
| Subject: [PATCH] ASoC: wm8994: Do not register inapplicable controls for |
| WM1811 |
| |
| commit ca2347190adb5e4eece73a2b16e96e651c46246b upstream. |
| |
| In case of WM1811 device there are currently being registered controls |
| referring to registers not existing on that device. |
| It has been noticed when getting values of "AIF1ADC2 Volume", "AIF1DAC2 |
| Volume" controls was failing during ALSA state restoring at boot time: |
| "amixer: Mixer hw:0 load error: Device or resource busy" |
| |
| Reading some registers through I2C was failing with EBUSY error and |
| indeed these registers were not available according to the datasheet. |
| |
| To fix this controls not available on WM1811 are moved to a separate |
| array and registered only for WM8994 and WM8958. |
| |
| There are some further differences between WM8994 and WM1811, |
| e.g. registers 603h, 604h, 605h, which are not covered in this patch. |
| |
| Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com> |
| Acked-by: Krzysztof Kozlowski <krzk@kernel.org> |
| Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> |
| Link: https://lore.kernel.org/r/20190920130218.32690-2-s.nawrocki@samsung.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c |
| index c3d06e8bc54f..d5fb7f5dd551 100644 |
| --- a/sound/soc/codecs/wm8994.c |
| +++ b/sound/soc/codecs/wm8994.c |
| @@ -533,13 +533,10 @@ static SOC_ENUM_SINGLE_DECL(dac_osr, |
| static SOC_ENUM_SINGLE_DECL(adc_osr, |
| WM8994_OVERSAMPLING, 1, osr_text); |
| |
| -static const struct snd_kcontrol_new wm8994_snd_controls[] = { |
| +static const struct snd_kcontrol_new wm8994_common_snd_controls[] = { |
| SOC_DOUBLE_R_TLV("AIF1ADC1 Volume", WM8994_AIF1_ADC1_LEFT_VOLUME, |
| WM8994_AIF1_ADC1_RIGHT_VOLUME, |
| 1, 119, 0, digital_tlv), |
| -SOC_DOUBLE_R_TLV("AIF1ADC2 Volume", WM8994_AIF1_ADC2_LEFT_VOLUME, |
| - WM8994_AIF1_ADC2_RIGHT_VOLUME, |
| - 1, 119, 0, digital_tlv), |
| SOC_DOUBLE_R_TLV("AIF2ADC Volume", WM8994_AIF2_ADC_LEFT_VOLUME, |
| WM8994_AIF2_ADC_RIGHT_VOLUME, |
| 1, 119, 0, digital_tlv), |
| @@ -556,8 +553,6 @@ SOC_ENUM("AIF2DACR Source", aif2dacr_src), |
| |
| SOC_DOUBLE_R_TLV("AIF1DAC1 Volume", WM8994_AIF1_DAC1_LEFT_VOLUME, |
| WM8994_AIF1_DAC1_RIGHT_VOLUME, 1, 96, 0, digital_tlv), |
| -SOC_DOUBLE_R_TLV("AIF1DAC2 Volume", WM8994_AIF1_DAC2_LEFT_VOLUME, |
| - WM8994_AIF1_DAC2_RIGHT_VOLUME, 1, 96, 0, digital_tlv), |
| SOC_DOUBLE_R_TLV("AIF2DAC Volume", WM8994_AIF2_DAC_LEFT_VOLUME, |
| WM8994_AIF2_DAC_RIGHT_VOLUME, 1, 96, 0, digital_tlv), |
| |
| @@ -565,17 +560,12 @@ SOC_SINGLE_TLV("AIF1 Boost Volume", WM8994_AIF1_CONTROL_2, 10, 3, 0, aif_tlv), |
| SOC_SINGLE_TLV("AIF2 Boost Volume", WM8994_AIF2_CONTROL_2, 10, 3, 0, aif_tlv), |
| |
| SOC_SINGLE("AIF1DAC1 EQ Switch", WM8994_AIF1_DAC1_EQ_GAINS_1, 0, 1, 0), |
| -SOC_SINGLE("AIF1DAC2 EQ Switch", WM8994_AIF1_DAC2_EQ_GAINS_1, 0, 1, 0), |
| SOC_SINGLE("AIF2 EQ Switch", WM8994_AIF2_EQ_GAINS_1, 0, 1, 0), |
| |
| WM8994_DRC_SWITCH("AIF1DAC1 DRC Switch", WM8994_AIF1_DRC1_1, 2), |
| WM8994_DRC_SWITCH("AIF1ADC1L DRC Switch", WM8994_AIF1_DRC1_1, 1), |
| WM8994_DRC_SWITCH("AIF1ADC1R DRC Switch", WM8994_AIF1_DRC1_1, 0), |
| |
| -WM8994_DRC_SWITCH("AIF1DAC2 DRC Switch", WM8994_AIF1_DRC2_1, 2), |
| -WM8994_DRC_SWITCH("AIF1ADC2L DRC Switch", WM8994_AIF1_DRC2_1, 1), |
| -WM8994_DRC_SWITCH("AIF1ADC2R DRC Switch", WM8994_AIF1_DRC2_1, 0), |
| - |
| WM8994_DRC_SWITCH("AIF2DAC DRC Switch", WM8994_AIF2_DRC_1, 2), |
| WM8994_DRC_SWITCH("AIF2ADCL DRC Switch", WM8994_AIF2_DRC_1, 1), |
| WM8994_DRC_SWITCH("AIF2ADCR DRC Switch", WM8994_AIF2_DRC_1, 0), |
| @@ -594,9 +584,6 @@ SOC_SINGLE("Sidetone HPF Switch", WM8994_SIDETONE, 6, 1, 0), |
| SOC_ENUM("AIF1ADC1 HPF Mode", aif1adc1_hpf), |
| SOC_DOUBLE("AIF1ADC1 HPF Switch", WM8994_AIF1_ADC1_FILTERS, 12, 11, 1, 0), |
| |
| -SOC_ENUM("AIF1ADC2 HPF Mode", aif1adc2_hpf), |
| -SOC_DOUBLE("AIF1ADC2 HPF Switch", WM8994_AIF1_ADC2_FILTERS, 12, 11, 1, 0), |
| - |
| SOC_ENUM("AIF2ADC HPF Mode", aif2adc_hpf), |
| SOC_DOUBLE("AIF2ADC HPF Switch", WM8994_AIF2_ADC_FILTERS, 12, 11, 1, 0), |
| |
| @@ -637,6 +624,24 @@ SOC_SINGLE("AIF2DAC 3D Stereo Switch", WM8994_AIF2_DAC_FILTERS_2, |
| 8, 1, 0), |
| }; |
| |
| +/* Controls not available on WM1811 */ |
| +static const struct snd_kcontrol_new wm8994_snd_controls[] = { |
| +SOC_DOUBLE_R_TLV("AIF1ADC2 Volume", WM8994_AIF1_ADC2_LEFT_VOLUME, |
| + WM8994_AIF1_ADC2_RIGHT_VOLUME, |
| + 1, 119, 0, digital_tlv), |
| +SOC_DOUBLE_R_TLV("AIF1DAC2 Volume", WM8994_AIF1_DAC2_LEFT_VOLUME, |
| + WM8994_AIF1_DAC2_RIGHT_VOLUME, 1, 96, 0, digital_tlv), |
| + |
| +SOC_SINGLE("AIF1DAC2 EQ Switch", WM8994_AIF1_DAC2_EQ_GAINS_1, 0, 1, 0), |
| + |
| +WM8994_DRC_SWITCH("AIF1DAC2 DRC Switch", WM8994_AIF1_DRC2_1, 2), |
| +WM8994_DRC_SWITCH("AIF1ADC2L DRC Switch", WM8994_AIF1_DRC2_1, 1), |
| +WM8994_DRC_SWITCH("AIF1ADC2R DRC Switch", WM8994_AIF1_DRC2_1, 0), |
| + |
| +SOC_ENUM("AIF1ADC2 HPF Mode", aif1adc2_hpf), |
| +SOC_DOUBLE("AIF1ADC2 HPF Switch", WM8994_AIF1_ADC2_FILTERS, 12, 11, 1, 0), |
| +}; |
| + |
| static const struct snd_kcontrol_new wm8994_eq_controls[] = { |
| SOC_SINGLE_TLV("AIF1DAC1 EQ1 Volume", WM8994_AIF1_DAC1_EQ_GAINS_1, 11, 31, 0, |
| eq_tlv), |
| @@ -4258,13 +4263,15 @@ static int wm8994_component_probe(struct snd_soc_component *component) |
| wm8994_handle_pdata(wm8994); |
| |
| wm_hubs_add_analogue_controls(component); |
| - snd_soc_add_component_controls(component, wm8994_snd_controls, |
| - ARRAY_SIZE(wm8994_snd_controls)); |
| + snd_soc_add_component_controls(component, wm8994_common_snd_controls, |
| + ARRAY_SIZE(wm8994_common_snd_controls)); |
| snd_soc_dapm_new_controls(dapm, wm8994_dapm_widgets, |
| ARRAY_SIZE(wm8994_dapm_widgets)); |
| |
| switch (control->type) { |
| case WM8994: |
| + snd_soc_add_component_controls(component, wm8994_snd_controls, |
| + ARRAY_SIZE(wm8994_snd_controls)); |
| snd_soc_dapm_new_controls(dapm, wm8994_specific_dapm_widgets, |
| ARRAY_SIZE(wm8994_specific_dapm_widgets)); |
| if (control->revision < 4) { |
| @@ -4284,8 +4291,10 @@ static int wm8994_component_probe(struct snd_soc_component *component) |
| } |
| break; |
| case WM8958: |
| + snd_soc_add_component_controls(component, wm8994_snd_controls, |
| + ARRAY_SIZE(wm8994_snd_controls)); |
| snd_soc_add_component_controls(component, wm8958_snd_controls, |
| - ARRAY_SIZE(wm8958_snd_controls)); |
| + ARRAY_SIZE(wm8958_snd_controls)); |
| snd_soc_dapm_new_controls(dapm, wm8958_dapm_widgets, |
| ARRAY_SIZE(wm8958_dapm_widgets)); |
| if (control->revision < 1) { |
| -- |
| 2.7.4 |
| |