diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-11-22 20:44:32 +0900 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-12-03 16:34:12 +0900 |
commit | 63dd54521f1d143fbc6584ace66ef264a7f867f7 (patch) | |
tree | c7cc350894650771f79b95f6729b275b34d17de1 /sound/soc | |
parent | 78b76dbec8da6437e30519e6bbe4fb44d798addf (diff) | |
download | op-kernel-dev-63dd54521f1d143fbc6584ace66ef264a7f867f7.zip op-kernel-dev-63dd54521f1d143fbc6584ace66ef264a7f867f7.tar.gz |
ASoC: wm8994: Support custom accessory identification for WM1811A
Allow the user to override the accessory identification code with their
own implementation if the system provides an alternative method.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc')
-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 4cd1b6c..1dcccdb 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) dev_dbg(codec->dev, "Starting mic detection\n"); - /* - * Start off measument of microphone impedence to find out - * what's actually there. - */ - wm8994->mic_detecting = true; - wm1811_jackdet_set_mode(codec, WM1811_JACKDET_MODE_MIC); + /* Use a user-supplied callback if we have one */ + if (wm8994->micd_cb) { + wm8994->micd_cb(wm8994->micd_cb_data); + } else { + /* + * Start off measument of microphone impedence to find out + * what's actually there. + */ + wm8994->mic_detecting = true; + wm1811_jackdet_set_mode(codec, WM1811_JACKDET_MODE_MIC); - snd_soc_update_bits(codec, WM8958_MIC_DETECT_1, - WM8958_MICD_ENA, WM8958_MICD_ENA); + snd_soc_update_bits(codec, WM8958_MIC_DETECT_1, + WM8958_MICD_ENA, WM8958_MICD_ENA); + } mutex_unlock(&wm8994->accdet_lock); @@ -3624,7 +3629,7 @@ static void wm1811_jackdet_bootstrap(struct work_struct *work) * detection algorithm. */ int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, - wm8958_micdet_cb cb, void *cb_data) + wm1811_micdet_cb cb, void *cb_data) { struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994 *control = wm8994->wm8994; @@ -3639,17 +3644,18 @@ int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, } if (jack) { - /* No longer supported */ - if (cb) - return -EINVAL; - snd_soc_dapm_force_enable_pin(&codec->dapm, "CLK_SYS"); snd_soc_dapm_sync(&codec->dapm); wm8994->micdet[0].jack = jack; - wm8994->mic_detecting = true; - wm8994->jack_mic = false; + if (cb) { + wm8994->micd_cb = cb; + wm8994->micd_cb_data = cb_data; + } else { + wm8994->mic_detecting = true; + wm8994->jack_mic = false; + } wm8958_micd_set_rate(codec); diff --git a/sound/soc/codecs/wm8994.h b/sound/soc/codecs/wm8994.h index f5546f2..1a6bb4e 100644 --- a/sound/soc/codecs/wm8994.h +++ b/sound/soc/codecs/wm8994.h @@ -39,12 +39,12 @@ enum wm8994_vmid_mode { WM8994_VMID_FORCE, }; -typedef void (*wm8958_micdet_cb)(u16 status, void *data); +typedef void (*wm1811_micdet_cb)(void *data); int wm8994_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, int micbias); int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, - wm8958_micdet_cb cb, void *cb_data); + wm1811_micdet_cb cb, void *cb_data); int wm8994_vmid_mode(struct snd_soc_codec *codec, enum wm8994_vmid_mode mode); @@ -138,6 +138,8 @@ struct wm8994_priv { struct delayed_work jackdet_bootstrap; int micdet_irq; + wm1811_micdet_cb micd_cb; + void *micd_cb_data; int revision; |