Browse Source

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>
Mark Brown 12 years ago
parent
commit
63dd54521f
2 changed files with 25 additions and 17 deletions
  1. 21 15
      sound/soc/codecs/wm8994.c
  2. 4 2
      sound/soc/codecs/wm8994.h

+ 21 - 15
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);
 

+ 4 - 2
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;