···1212#define __LINUX_SND_WM2200_H13131414#define WM2200_GPIO_SET 0x100001515+#define WM2200_MAX_MICBIAS 215161617enum wm2200_in_mode {1718 WM2200_IN_SE = 0,···2625 WM2200_DMIC_SUP_MICBIAS2 = 2,2726};28272828+enum wm2200_mbias_lvl {2929+ WM2200_MBIAS_LVL_1V5 = 1,3030+ WM2200_MBIAS_LVL_1V8 = 2,3131+ WM2200_MBIAS_LVL_1V9 = 3,3232+ WM2200_MBIAS_LVL_2V0 = 4,3333+ WM2200_MBIAS_LVL_2V2 = 5,3434+ WM2200_MBIAS_LVL_2V4 = 6,3535+ WM2200_MBIAS_LVL_2V5 = 7,3636+ WM2200_MBIAS_LVL_2V6 = 8,3737+};3838+3939+struct wm2200_micbias {4040+ enum wm2200_mbias_lvl mb_lvl; /** Regulated voltage */4141+ unsigned int discharge:1; /** Actively discharge */4242+ unsigned int fast_start:1; /** Enable aggressive startup ramp rate */4343+ unsigned int bypass:1; /** Use bypass mode */4444+};4545+2946struct wm2200_pdata {3047 int reset; /** GPIO controlling /RESET, if any */3148 int ldo_ena; /** GPIO controlling LODENA, if any */···5435 enum wm2200_in_mode in_mode[3];5536 enum wm2200_dmic_sup dmic_sup[3];56375757- int micbias_cfg[2]; /** Register value to configure MICBIAS */3838+ /** MICBIAS configurations */3939+ struct wm2200_micbias micbias[WM2200_MAX_MICBIAS];5840};59416042#endif
+31
sound/soc/codecs/wm2200.c
···22122212 struct wm2200_priv *wm2200;22132213 unsigned int reg;22142214 int ret, i;22152215+ int val;2215221622162217 wm2200 = devm_kzalloc(&i2c->dev, sizeof(struct wm2200_priv),22172218 GFP_KERNEL);···23612360 for (i = 0; i < 6; i++) {23622361 regmap_write(wm2200->regmap, WM2200_AUDIO_IF_1_10 + i, i);23632362 regmap_write(wm2200->regmap, WM2200_AUDIO_IF_1_16 + i, i);23632363+ }23642364+23652365+ for (i = 0; i < WM2200_MAX_MICBIAS; i++) {23662366+ if (!wm2200->pdata.micbias[i].mb_lvl &&23672367+ !wm2200->pdata.micbias[i].bypass)23682368+ continue;23692369+23702370+ /* Apply default for bypass mode */23712371+ if (!wm2200->pdata.micbias[i].mb_lvl)23722372+ wm2200->pdata.micbias[i].mb_lvl23732373+ = WM2200_MBIAS_LVL_1V5;23742374+23752375+ val = (wm2200->pdata.micbias[i].mb_lvl -1)23762376+ << WM2200_MICB1_LVL_SHIFT;23772377+23782378+ if (wm2200->pdata.micbias[i].discharge)23792379+ val |= WM2200_MICB1_DISCH;23802380+23812381+ if (wm2200->pdata.micbias[i].fast_start)23822382+ val |= WM2200_MICB1_RATE;23832383+23842384+ if (wm2200->pdata.micbias[i].bypass)23852385+ val |= WM2200_MICB1_MODE;23862386+23872387+ regmap_update_bits(wm2200->regmap,23882388+ WM2200_MIC_BIAS_CTRL_1 + i,23892389+ WM2200_MICB1_LVL_MASK |23902390+ WM2200_MICB1_DISCH |23912391+ WM2200_MICB1_MODE |23922392+ WM2200_MICB1_RATE, val);23642393 }2365239423662395 for (i = 0; i < ARRAY_SIZE(wm2200->pdata.in_mode); i++) {