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

ASoC: wm2200: Provide platform data for MICBIAS configuration

Signed-off-by: Chris Rattray <crattray@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>

authored by

Chris Rattray and committed by
Mark Brown
1a786243 4c97e8fe

+52 -1
+21 -1
include/sound/wm2200.h
··· 12 12 #define __LINUX_SND_WM2200_H 13 13 14 14 #define WM2200_GPIO_SET 0x10000 15 + #define WM2200_MAX_MICBIAS 2 15 16 16 17 enum wm2200_in_mode { 17 18 WM2200_IN_SE = 0, ··· 26 25 WM2200_DMIC_SUP_MICBIAS2 = 2, 27 26 }; 28 27 28 + enum wm2200_mbias_lvl { 29 + WM2200_MBIAS_LVL_1V5 = 1, 30 + WM2200_MBIAS_LVL_1V8 = 2, 31 + WM2200_MBIAS_LVL_1V9 = 3, 32 + WM2200_MBIAS_LVL_2V0 = 4, 33 + WM2200_MBIAS_LVL_2V2 = 5, 34 + WM2200_MBIAS_LVL_2V4 = 6, 35 + WM2200_MBIAS_LVL_2V5 = 7, 36 + WM2200_MBIAS_LVL_2V6 = 8, 37 + }; 38 + 39 + struct wm2200_micbias { 40 + enum wm2200_mbias_lvl mb_lvl; /** Regulated voltage */ 41 + unsigned int discharge:1; /** Actively discharge */ 42 + unsigned int fast_start:1; /** Enable aggressive startup ramp rate */ 43 + unsigned int bypass:1; /** Use bypass mode */ 44 + }; 45 + 29 46 struct wm2200_pdata { 30 47 int reset; /** GPIO controlling /RESET, if any */ 31 48 int ldo_ena; /** GPIO controlling LODENA, if any */ ··· 54 35 enum wm2200_in_mode in_mode[3]; 55 36 enum wm2200_dmic_sup dmic_sup[3]; 56 37 57 - int micbias_cfg[2]; /** Register value to configure MICBIAS */ 38 + /** MICBIAS configurations */ 39 + struct wm2200_micbias micbias[WM2200_MAX_MICBIAS]; 58 40 }; 59 41 60 42 #endif
+31
sound/soc/codecs/wm2200.c
··· 2212 2212 struct wm2200_priv *wm2200; 2213 2213 unsigned int reg; 2214 2214 int ret, i; 2215 + int val; 2215 2216 2216 2217 wm2200 = devm_kzalloc(&i2c->dev, sizeof(struct wm2200_priv), 2217 2218 GFP_KERNEL); ··· 2361 2360 for (i = 0; i < 6; i++) { 2362 2361 regmap_write(wm2200->regmap, WM2200_AUDIO_IF_1_10 + i, i); 2363 2362 regmap_write(wm2200->regmap, WM2200_AUDIO_IF_1_16 + i, i); 2363 + } 2364 + 2365 + for (i = 0; i < WM2200_MAX_MICBIAS; i++) { 2366 + if (!wm2200->pdata.micbias[i].mb_lvl && 2367 + !wm2200->pdata.micbias[i].bypass) 2368 + continue; 2369 + 2370 + /* Apply default for bypass mode */ 2371 + if (!wm2200->pdata.micbias[i].mb_lvl) 2372 + wm2200->pdata.micbias[i].mb_lvl 2373 + = WM2200_MBIAS_LVL_1V5; 2374 + 2375 + val = (wm2200->pdata.micbias[i].mb_lvl -1) 2376 + << WM2200_MICB1_LVL_SHIFT; 2377 + 2378 + if (wm2200->pdata.micbias[i].discharge) 2379 + val |= WM2200_MICB1_DISCH; 2380 + 2381 + if (wm2200->pdata.micbias[i].fast_start) 2382 + val |= WM2200_MICB1_RATE; 2383 + 2384 + if (wm2200->pdata.micbias[i].bypass) 2385 + val |= WM2200_MICB1_MODE; 2386 + 2387 + regmap_update_bits(wm2200->regmap, 2388 + WM2200_MIC_BIAS_CTRL_1 + i, 2389 + WM2200_MICB1_LVL_MASK | 2390 + WM2200_MICB1_DISCH | 2391 + WM2200_MICB1_MODE | 2392 + WM2200_MICB1_RATE, val); 2364 2393 } 2365 2394 2366 2395 for (i = 0; i < ARRAY_SIZE(wm2200->pdata.in_mode); i++) {