diff options
| -rw-r--r-- | sound/soc/codecs/wm8994.c | 36 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8994.h | 6 |
2 files changed, 25 insertions, 17 deletions
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 4cd1b6cdb34f..1dcccdbbc8b6 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
| @@ -3504,15 +3504,20 @@ static void wm1811_mic_work(struct work_struct *work) | |||
| 3504 | 3504 | ||
| 3505 | dev_dbg(codec->dev, "Starting mic detection\n"); | 3505 | dev_dbg(codec->dev, "Starting mic detection\n"); |
| 3506 | 3506 | ||
| 3507 | /* | 3507 | /* Use a user-supplied callback if we have one */ |
| 3508 | * Start off measument of microphone impedence to find out | 3508 | if (wm8994->micd_cb) { |
| 3509 | * what's actually there. | 3509 | wm8994->micd_cb(wm8994->micd_cb_data); |
| 3510 | */ | 3510 | } else { |
| 3511 | wm8994->mic_detecting = true; | 3511 | /* |
| 3512 | wm1811_jackdet_set_mode(codec, WM1811_JACKDET_MODE_MIC); | 3512 | * Start off measument of microphone impedence to find out |
| 3513 | * what's actually there. | ||
| 3514 | */ | ||
| 3515 | wm8994->mic_detecting = true; | ||
| 3516 | wm1811_jackdet_set_mode(codec, WM1811_JACKDET_MODE_MIC); | ||
| 3513 | 3517 | ||
| 3514 | snd_soc_update_bits(codec, WM8958_MIC_DETECT_1, | 3518 | snd_soc_update_bits(codec, WM8958_MIC_DETECT_1, |
| 3515 | WM8958_MICD_ENA, WM8958_MICD_ENA); | 3519 | WM8958_MICD_ENA, WM8958_MICD_ENA); |
| 3520 | } | ||
| 3516 | 3521 | ||
| 3517 | mutex_unlock(&wm8994->accdet_lock); | 3522 | mutex_unlock(&wm8994->accdet_lock); |
| 3518 | 3523 | ||
| @@ -3624,7 +3629,7 @@ static void wm1811_jackdet_bootstrap(struct work_struct *work) | |||
| 3624 | * detection algorithm. | 3629 | * detection algorithm. |
| 3625 | */ | 3630 | */ |
| 3626 | int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | 3631 | int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, |
| 3627 | wm8958_micdet_cb cb, void *cb_data) | 3632 | wm1811_micdet_cb cb, void *cb_data) |
| 3628 | { | 3633 | { |
| 3629 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 3634 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
| 3630 | struct wm8994 *control = wm8994->wm8994; | 3635 | struct wm8994 *control = wm8994->wm8994; |
| @@ -3639,17 +3644,18 @@ int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | |||
| 3639 | } | 3644 | } |
| 3640 | 3645 | ||
| 3641 | if (jack) { | 3646 | if (jack) { |
| 3642 | /* No longer supported */ | ||
| 3643 | if (cb) | ||
| 3644 | return -EINVAL; | ||
| 3645 | |||
| 3646 | snd_soc_dapm_force_enable_pin(&codec->dapm, "CLK_SYS"); | 3647 | snd_soc_dapm_force_enable_pin(&codec->dapm, "CLK_SYS"); |
| 3647 | snd_soc_dapm_sync(&codec->dapm); | 3648 | snd_soc_dapm_sync(&codec->dapm); |
| 3648 | 3649 | ||
| 3649 | wm8994->micdet[0].jack = jack; | 3650 | wm8994->micdet[0].jack = jack; |
| 3650 | 3651 | ||
| 3651 | wm8994->mic_detecting = true; | 3652 | if (cb) { |
| 3652 | wm8994->jack_mic = false; | 3653 | wm8994->micd_cb = cb; |
| 3654 | wm8994->micd_cb_data = cb_data; | ||
| 3655 | } else { | ||
| 3656 | wm8994->mic_detecting = true; | ||
| 3657 | wm8994->jack_mic = false; | ||
| 3658 | } | ||
| 3653 | 3659 | ||
| 3654 | wm8958_micd_set_rate(codec); | 3660 | wm8958_micd_set_rate(codec); |
| 3655 | 3661 | ||
diff --git a/sound/soc/codecs/wm8994.h b/sound/soc/codecs/wm8994.h index f5546f242ab1..1a6bb4ed08f8 100644 --- a/sound/soc/codecs/wm8994.h +++ b/sound/soc/codecs/wm8994.h | |||
| @@ -39,12 +39,12 @@ enum wm8994_vmid_mode { | |||
| 39 | WM8994_VMID_FORCE, | 39 | WM8994_VMID_FORCE, |
| 40 | }; | 40 | }; |
| 41 | 41 | ||
| 42 | typedef void (*wm8958_micdet_cb)(u16 status, void *data); | 42 | typedef void (*wm1811_micdet_cb)(void *data); |
| 43 | 43 | ||
| 44 | int wm8994_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | 44 | int wm8994_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, |
| 45 | int micbias); | 45 | int micbias); |
| 46 | int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | 46 | int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, |
| 47 | wm8958_micdet_cb cb, void *cb_data); | 47 | wm1811_micdet_cb cb, void *cb_data); |
| 48 | 48 | ||
| 49 | int wm8994_vmid_mode(struct snd_soc_codec *codec, enum wm8994_vmid_mode mode); | 49 | int wm8994_vmid_mode(struct snd_soc_codec *codec, enum wm8994_vmid_mode mode); |
| 50 | 50 | ||
| @@ -138,6 +138,8 @@ struct wm8994_priv { | |||
| 138 | struct delayed_work jackdet_bootstrap; | 138 | struct delayed_work jackdet_bootstrap; |
| 139 | 139 | ||
| 140 | int micdet_irq; | 140 | int micdet_irq; |
| 141 | wm1811_micdet_cb micd_cb; | ||
| 142 | void *micd_cb_data; | ||
| 141 | 143 | ||
| 142 | int revision; | 144 | int revision; |
| 143 | 145 | ||
