Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: Support GPIO based microphone detection for WM8904

The WM8904 allows microphone detection signals to be brought out as
alternate functions of the GPIO signals which can be detected using
interrupt inputs on the CPU. Allow this to be configured using
platform data.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>

+41 -33
+36
include/sound/wm8904.h
··· 19 19 #define WM8904_GPIO_NO_CONFIG 0x8000 20 20 21 21 /* 22 + * R6 (0x06) - Mic Bias Control 0 23 + */ 24 + #define WM8904_MICDET_THR_MASK 0x0070 /* MICDET_THR - [6:4] */ 25 + #define WM8904_MICDET_THR_SHIFT 4 /* MICDET_THR - [6:4] */ 26 + #define WM8904_MICDET_THR_WIDTH 3 /* MICDET_THR - [6:4] */ 27 + #define WM8904_MICSHORT_THR_MASK 0x000C /* MICSHORT_THR - [3:2] */ 28 + #define WM8904_MICSHORT_THR_SHIFT 2 /* MICSHORT_THR - [3:2] */ 29 + #define WM8904_MICSHORT_THR_WIDTH 2 /* MICSHORT_THR - [3:2] */ 30 + #define WM8904_MICDET_ENA 0x0002 /* MICDET_ENA */ 31 + #define WM8904_MICDET_ENA_MASK 0x0002 /* MICDET_ENA */ 32 + #define WM8904_MICDET_ENA_SHIFT 1 /* MICDET_ENA */ 33 + #define WM8904_MICDET_ENA_WIDTH 1 /* MICDET_ENA */ 34 + #define WM8904_MICBIAS_ENA 0x0001 /* MICBIAS_ENA */ 35 + #define WM8904_MICBIAS_ENA_MASK 0x0001 /* MICBIAS_ENA */ 36 + #define WM8904_MICBIAS_ENA_SHIFT 0 /* MICBIAS_ENA */ 37 + #define WM8904_MICBIAS_ENA_WIDTH 1 /* MICBIAS_ENA */ 38 + 39 + /* 40 + * R7 (0x07) - Mic Bias Control 1 41 + */ 42 + #define WM8904_MIC_DET_FILTER_ENA 0x8000 /* MIC_DET_FILTER_ENA */ 43 + #define WM8904_MIC_DET_FILTER_ENA_MASK 0x8000 /* MIC_DET_FILTER_ENA */ 44 + #define WM8904_MIC_DET_FILTER_ENA_SHIFT 15 /* MIC_DET_FILTER_ENA */ 45 + #define WM8904_MIC_DET_FILTER_ENA_WIDTH 1 /* MIC_DET_FILTER_ENA */ 46 + #define WM8904_MIC_SHORT_FILTER_ENA 0x4000 /* MIC_SHORT_FILTER_ENA */ 47 + #define WM8904_MIC_SHORT_FILTER_ENA_MASK 0x4000 /* MIC_SHORT_FILTER_ENA */ 48 + #define WM8904_MIC_SHORT_FILTER_ENA_SHIFT 14 /* MIC_SHORT_FILTER_ENA */ 49 + #define WM8904_MIC_SHORT_FILTER_ENA_WIDTH 1 /* MIC_SHORT_FILTER_ENA */ 50 + #define WM8904_MICBIAS_SEL_MASK 0x0007 /* MICBIAS_SEL - [2:0] */ 51 + #define WM8904_MICBIAS_SEL_SHIFT 0 /* MICBIAS_SEL - [2:0] */ 52 + #define WM8904_MICBIAS_SEL_WIDTH 3 /* MICBIAS_SEL - [2:0] */ 53 + 54 + 55 + /* 22 56 * R121 (0x79) - GPIO Control 1 23 57 */ 24 58 #define WM8904_GPIO1_PU 0x0020 /* GPIO1_PU */ ··· 116 82 #define WM8904_GPIO_BCLK_SEL_SHIFT 0 /* GPIO_BCLK_SEL - [3:0] */ 117 83 #define WM8904_GPIO_BCLK_SEL_WIDTH 4 /* GPIO_BCLK_SEL - [3:0] */ 118 84 85 + #define WM8904_MIC_REGS 2 119 86 #define WM8904_GPIO_REGS 4 120 87 #define WM8904_DRC_REGS 4 121 88 #define WM8904_EQ_REGS 25 ··· 157 122 struct wm8904_retune_mobile_cfg *retune_mobile_cfgs; 158 123 159 124 u32 gpio_cfg[WM8904_GPIO_REGS]; 125 + u32 mic_cfg[WM8904_MIC_REGS]; 160 126 }; 161 127 162 128 #endif
+5
sound/soc/codecs/wm8904.c
··· 2540 2540 wm8904->reg_cache[WM8904_GPIO_CONTROL_1 + i] 2541 2541 = pdata->gpio_cfg[i] & 0xffff; 2542 2542 } 2543 + 2544 + /* Zero is the default value for these anyway */ 2545 + for (i = 0; i < WM8904_MIC_REGS; i++) 2546 + wm8904->reg_cache[WM8904_MIC_BIAS_CONTROL_0 + i] 2547 + = pdata->mic_cfg[i]; 2543 2548 } 2544 2549 2545 2550 /* Set Class W by default - this will be managed by the Class
-33
sound/soc/codecs/wm8904.h
··· 186 186 #define WM8904_VMID_ENA_WIDTH 1 /* VMID_ENA */ 187 187 188 188 /* 189 - * R6 (0x06) - Mic Bias Control 0 190 - */ 191 - #define WM8904_MICDET_THR_MASK 0x0070 /* MICDET_THR - [6:4] */ 192 - #define WM8904_MICDET_THR_SHIFT 4 /* MICDET_THR - [6:4] */ 193 - #define WM8904_MICDET_THR_WIDTH 3 /* MICDET_THR - [6:4] */ 194 - #define WM8904_MICSHORT_THR_MASK 0x000C /* MICSHORT_THR - [3:2] */ 195 - #define WM8904_MICSHORT_THR_SHIFT 2 /* MICSHORT_THR - [3:2] */ 196 - #define WM8904_MICSHORT_THR_WIDTH 2 /* MICSHORT_THR - [3:2] */ 197 - #define WM8904_MICDET_ENA 0x0002 /* MICDET_ENA */ 198 - #define WM8904_MICDET_ENA_MASK 0x0002 /* MICDET_ENA */ 199 - #define WM8904_MICDET_ENA_SHIFT 1 /* MICDET_ENA */ 200 - #define WM8904_MICDET_ENA_WIDTH 1 /* MICDET_ENA */ 201 - #define WM8904_MICBIAS_ENA 0x0001 /* MICBIAS_ENA */ 202 - #define WM8904_MICBIAS_ENA_MASK 0x0001 /* MICBIAS_ENA */ 203 - #define WM8904_MICBIAS_ENA_SHIFT 0 /* MICBIAS_ENA */ 204 - #define WM8904_MICBIAS_ENA_WIDTH 1 /* MICBIAS_ENA */ 205 - 206 - /* 207 - * R7 (0x07) - Mic Bias Control 1 208 - */ 209 - #define WM8904_MIC_DET_FILTER_ENA 0x8000 /* MIC_DET_FILTER_ENA */ 210 - #define WM8904_MIC_DET_FILTER_ENA_MASK 0x8000 /* MIC_DET_FILTER_ENA */ 211 - #define WM8904_MIC_DET_FILTER_ENA_SHIFT 15 /* MIC_DET_FILTER_ENA */ 212 - #define WM8904_MIC_DET_FILTER_ENA_WIDTH 1 /* MIC_DET_FILTER_ENA */ 213 - #define WM8904_MIC_SHORT_FILTER_ENA 0x4000 /* MIC_SHORT_FILTER_ENA */ 214 - #define WM8904_MIC_SHORT_FILTER_ENA_MASK 0x4000 /* MIC_SHORT_FILTER_ENA */ 215 - #define WM8904_MIC_SHORT_FILTER_ENA_SHIFT 14 /* MIC_SHORT_FILTER_ENA */ 216 - #define WM8904_MIC_SHORT_FILTER_ENA_WIDTH 1 /* MIC_SHORT_FILTER_ENA */ 217 - #define WM8904_MICBIAS_SEL_MASK 0x0007 /* MICBIAS_SEL - [2:0] */ 218 - #define WM8904_MICBIAS_SEL_SHIFT 0 /* MICBIAS_SEL - [2:0] */ 219 - #define WM8904_MICBIAS_SEL_WIDTH 3 /* MICBIAS_SEL - [2:0] */ 220 - 221 - /* 222 189 * R8 (0x08) - Analogue DAC 0 223 190 */ 224 191 #define WM8904_DAC_BIAS_SEL_MASK 0x0018 /* DAC_BIAS_SEL - [4:3] */