diff options
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/codecs/wm8994.c | 74 |
1 files changed, 55 insertions, 19 deletions
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 2b2dadc54dac..07095a9ca9a6 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
@@ -3470,11 +3470,46 @@ static void wm8958_default_micdet(u16 status, void *data) | |||
3470 | } | 3470 | } |
3471 | } | 3471 | } |
3472 | 3472 | ||
3473 | /* Deferred mic detection to allow for extra settling time */ | ||
3474 | static void wm1811_mic_work(struct work_struct *work) | ||
3475 | { | ||
3476 | struct wm8994_priv *wm8994 = container_of(work, struct wm8994_priv, | ||
3477 | mic_work.work); | ||
3478 | struct snd_soc_codec *codec = wm8994->hubs.codec; | ||
3479 | |||
3480 | pm_runtime_get_sync(codec->dev); | ||
3481 | |||
3482 | /* If required for an external cap force MICBIAS on */ | ||
3483 | if (wm8994->pdata->jd_ext_cap) { | ||
3484 | snd_soc_dapm_force_enable_pin(&codec->dapm, | ||
3485 | "MICBIAS2"); | ||
3486 | snd_soc_dapm_sync(&codec->dapm); | ||
3487 | } | ||
3488 | |||
3489 | mutex_lock(&wm8994->accdet_lock); | ||
3490 | |||
3491 | dev_dbg(codec->dev, "Starting mic detection\n"); | ||
3492 | |||
3493 | /* | ||
3494 | * Start off measument of microphone impedence to find out | ||
3495 | * what's actually there. | ||
3496 | */ | ||
3497 | wm8994->mic_detecting = true; | ||
3498 | wm1811_jackdet_set_mode(codec, WM1811_JACKDET_MODE_MIC); | ||
3499 | |||
3500 | snd_soc_update_bits(codec, WM8958_MIC_DETECT_1, | ||
3501 | WM8958_MICD_ENA, WM8958_MICD_ENA); | ||
3502 | |||
3503 | mutex_unlock(&wm8994->accdet_lock); | ||
3504 | |||
3505 | pm_runtime_put(codec->dev); | ||
3506 | } | ||
3507 | |||
3473 | static irqreturn_t wm1811_jackdet_irq(int irq, void *data) | 3508 | static irqreturn_t wm1811_jackdet_irq(int irq, void *data) |
3474 | { | 3509 | { |
3475 | struct wm8994_priv *wm8994 = data; | 3510 | struct wm8994_priv *wm8994 = data; |
3476 | struct snd_soc_codec *codec = wm8994->hubs.codec; | 3511 | struct snd_soc_codec *codec = wm8994->hubs.codec; |
3477 | int reg; | 3512 | int reg, delay; |
3478 | bool present; | 3513 | bool present; |
3479 | 3514 | ||
3480 | pm_runtime_get_sync(codec->dev); | 3515 | pm_runtime_get_sync(codec->dev); |
@@ -3505,18 +3540,14 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data) | |||
3505 | snd_soc_update_bits(codec, WM1811_JACKDET_CTRL, | 3540 | snd_soc_update_bits(codec, WM1811_JACKDET_CTRL, |
3506 | WM1811_JACKDET_DB, 0); | 3541 | WM1811_JACKDET_DB, 0); |
3507 | 3542 | ||
3508 | /* | 3543 | delay = wm8994->pdata->micdet_delay; |
3509 | * Start off measument of microphone impedence to find | 3544 | schedule_delayed_work(&wm8994->mic_work, |
3510 | * out what's actually there. | 3545 | msecs_to_jiffies(delay)); |
3511 | */ | ||
3512 | wm8994->mic_detecting = true; | ||
3513 | wm1811_jackdet_set_mode(codec, WM1811_JACKDET_MODE_MIC); | ||
3514 | |||
3515 | snd_soc_update_bits(codec, WM8958_MIC_DETECT_1, | ||
3516 | WM8958_MICD_ENA, WM8958_MICD_ENA); | ||
3517 | } else { | 3546 | } else { |
3518 | dev_dbg(codec->dev, "Jack not detected\n"); | 3547 | dev_dbg(codec->dev, "Jack not detected\n"); |
3519 | 3548 | ||
3549 | cancel_delayed_work_sync(&wm8994->mic_work); | ||
3550 | |||
3520 | snd_soc_update_bits(codec, WM8958_MICBIAS2, | 3551 | snd_soc_update_bits(codec, WM8958_MICBIAS2, |
3521 | WM8958_MICB2_DISCH, WM8958_MICB2_DISCH); | 3552 | WM8958_MICB2_DISCH, WM8958_MICB2_DISCH); |
3522 | 3553 | ||
@@ -3533,14 +3564,9 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data) | |||
3533 | 3564 | ||
3534 | mutex_unlock(&wm8994->accdet_lock); | 3565 | mutex_unlock(&wm8994->accdet_lock); |
3535 | 3566 | ||
3536 | /* If required for an external cap force MICBIAS on */ | 3567 | /* Turn off MICBIAS if it was on for an external cap */ |
3537 | if (wm8994->pdata->jd_ext_cap) { | 3568 | if (wm8994->pdata->jd_ext_cap && !present) |
3538 | if (present) | 3569 | snd_soc_dapm_disable_pin(&codec->dapm, "MICBIAS2"); |
3539 | snd_soc_dapm_force_enable_pin(&codec->dapm, | ||
3540 | "MICBIAS2"); | ||
3541 | else | ||
3542 | snd_soc_dapm_disable_pin(&codec->dapm, "MICBIAS2"); | ||
3543 | } | ||
3544 | 3570 | ||
3545 | if (present) | 3571 | if (present) |
3546 | snd_soc_jack_report(wm8994->micdet[0].jack, | 3572 | snd_soc_jack_report(wm8994->micdet[0].jack, |
@@ -3763,10 +3789,20 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec) | |||
3763 | snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_REGMAP); | 3789 | snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_REGMAP); |
3764 | 3790 | ||
3765 | mutex_init(&wm8994->accdet_lock); | 3791 | mutex_init(&wm8994->accdet_lock); |
3766 | INIT_DELAYED_WORK(&wm8994->mic_work, wm8994_mic_work); | ||
3767 | INIT_DELAYED_WORK(&wm8994->jackdet_bootstrap, | 3792 | INIT_DELAYED_WORK(&wm8994->jackdet_bootstrap, |
3768 | wm1811_jackdet_bootstrap); | 3793 | wm1811_jackdet_bootstrap); |
3769 | 3794 | ||
3795 | switch (control->type) { | ||
3796 | case WM8994: | ||
3797 | INIT_DELAYED_WORK(&wm8994->mic_work, wm8994_mic_work); | ||
3798 | break; | ||
3799 | case WM1811: | ||
3800 | INIT_DELAYED_WORK(&wm8994->mic_work, wm1811_mic_work); | ||
3801 | break; | ||
3802 | default: | ||
3803 | break; | ||
3804 | } | ||
3805 | |||
3770 | for (i = 0; i < ARRAY_SIZE(wm8994->fll_locked); i++) | 3806 | for (i = 0; i < ARRAY_SIZE(wm8994->fll_locked); i++) |
3771 | init_completion(&wm8994->fll_locked[i]); | 3807 | init_completion(&wm8994->fll_locked[i]); |
3772 | 3808 | ||