Skip to content

Commit

Permalink
ASoC: wm_hubs: Allow configuration of MICBIAS power up delay via pdata
Browse files Browse the repository at this point in the history
Sometimes the analogue circuitry connected to the microphone needs some
time to settle after power up. Allow systems to configure this delay in
the platform data, the driver will then insert the required delay during
power up of paths that involve the microphone.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Mark Brown committed Aug 22, 2012
1 parent 20bac1f commit 02e7947
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 4 deletions.
4 changes: 4 additions & 0 deletions include/linux/mfd/wm8994/pdata.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,10 @@ struct wm8994_pdata {
int num_micd_rates;
struct wm8958_micd_rate *micd_rates;

/* Power up delays to add after microphone bias power up (ms) */
int micb1_delay;
int micb2_delay;

/* LINEOUT can be differential or single ended */
unsigned int lineout1_diff:1;
unsigned int lineout2_diff:1;
Expand Down
4 changes: 4 additions & 0 deletions include/sound/wm8993.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ struct wm8993_platform_data {
unsigned int lineout1fb:1;
unsigned int lineout2fb:1;

/* Delay to add for microphones to stabalise after power up */
int micbias1_delay;
int micbias2_delay;

/* Microphone biases: 0=0.9*AVDD1 1=0.65*AVVD1 */
unsigned int micbias1_lvl:1;
unsigned int micbias2_lvl:1;
Expand Down
2 changes: 2 additions & 0 deletions sound/soc/codecs/wm8993.c
Original file line number Diff line number Diff line change
Expand Up @@ -1520,6 +1520,8 @@ static int wm8993_probe(struct snd_soc_codec *codec)
wm8993->pdata.lineout2fb,
wm8993->pdata.jd_scthr,
wm8993->pdata.jd_thr,
wm8993->pdata.micbias1_delay,
wm8993->pdata.micbias2_delay,
wm8993->pdata.micbias1_lvl,
wm8993->pdata.micbias2_lvl);

Expand Down
2 changes: 2 additions & 0 deletions sound/soc/codecs/wm8994.c
Original file line number Diff line number Diff line change
Expand Up @@ -3145,6 +3145,8 @@ static void wm8994_handle_pdata(struct wm8994_priv *wm8994)
pdata->lineout2fb,
pdata->jd_scthr,
pdata->jd_thr,
pdata->micb1_delay,
pdata->micb2_delay,
pdata->micbias1_lvl,
pdata->micbias2_lvl);

Expand Down
35 changes: 31 additions & 4 deletions sound/soc/codecs/wm_hubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,28 @@ static int lineout_event(struct snd_soc_dapm_widget *w,
return 0;
}

static int micbias_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
struct snd_soc_codec *codec = w->codec;
struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);

switch (w->shift) {
case WM8993_MICB1_ENA_SHIFT:
if (hubs->micb1_delay)
msleep(hubs->micb1_delay);
break;
case WM8993_MICB2_ENA_SHIFT:
if (hubs->micb2_delay)
msleep(hubs->micb2_delay);
break;
default:
return -EINVAL;
}

return 0;
}

void wm_hubs_update_class_w(struct snd_soc_codec *codec)
{
struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);
Expand Down Expand Up @@ -834,8 +856,10 @@ SND_SOC_DAPM_INPUT("IN1RP"),
SND_SOC_DAPM_INPUT("IN2RN"),
SND_SOC_DAPM_INPUT("IN2RP:VXRP"),

SND_SOC_DAPM_SUPPLY("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0,
micbias_event, SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_SUPPLY("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0,
micbias_event, SND_SOC_DAPM_POST_PMU),

SND_SOC_DAPM_MIXER("IN1L PGA", WM8993_POWER_MANAGEMENT_2, 6, 0,
in1l_pga, ARRAY_SIZE(in1l_pga)),
Expand Down Expand Up @@ -1170,13 +1194,16 @@ EXPORT_SYMBOL_GPL(wm_hubs_add_analogue_routes);
int wm_hubs_handle_analogue_pdata(struct snd_soc_codec *codec,
int lineout1_diff, int lineout2_diff,
int lineout1fb, int lineout2fb,
int jd_scthr, int jd_thr, int micbias1_lvl,
int micbias2_lvl)
int jd_scthr, int jd_thr,
int micbias1_delay, int micbias2_delay,
int micbias1_lvl, int micbias2_lvl)
{
struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);

hubs->lineout1_se = !lineout1_diff;
hubs->lineout2_se = !lineout2_diff;
hubs->micb1_delay = micbias1_delay;
hubs->micb2_delay = micbias2_delay;

if (!lineout1_diff)
snd_soc_update_bits(codec, WM8993_LINE_MIXER1,
Expand Down
4 changes: 4 additions & 0 deletions sound/soc/codecs/wm_hubs.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ struct wm_hubs_data {
struct list_head dcs_cache;
bool (*check_class_w_digital)(struct snd_soc_codec *);

int micb1_delay;
int micb2_delay;

bool lineout1_se;
bool lineout1n_ena;
bool lineout1p_ena;
Expand All @@ -56,6 +59,7 @@ extern int wm_hubs_handle_analogue_pdata(struct snd_soc_codec *,
int lineout1_diff, int lineout2_diff,
int lineout1fb, int lineout2fb,
int jd_scthr, int jd_thr,
int micbias1_dly, int micbias2_dly,
int micbias1_lvl, int micbias2_lvl);

extern irqreturn_t wm_hubs_dcs_done(int irq, void *data);
Expand Down

0 comments on commit 02e7947

Please sign in to comment.