[RFC][PATCH 1/2] alsa: jack: expand snd_jack_report parameter for jack sw_inject

Hui Wang hui.wang at canonical.com
Wed Dec 9 13:43:43 CET 2020


This is the preparation for supporting jack software plug in/out
injection, when users enable the software injection, the jack state
shouldn't be changed by hw events or other non-injection events
anymore, so adding a parameter in the snd_jack_report() to distinguish
if the function is called from software injection or not.

Signed-off-by: Hui Wang <hui.wang at canonical.com>
---
 include/sound/jack.h            | 4 ++--
 sound/core/jack.c               | 3 ++-
 sound/pci/hda/hda_jack.c        | 6 +++---
 sound/pci/hda/patch_hdmi.c      | 2 +-
 sound/pci/oxygen/xonar_wm87x6.c | 2 +-
 sound/soc/soc-jack.c            | 2 +-
 sound/x86/intel_hdmi_audio.c    | 4 ++--
 7 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/include/sound/jack.h b/include/sound/jack.h
index 9eb2b5ec1ec4..17f71fe38ed5 100644
--- a/include/sound/jack.h
+++ b/include/sound/jack.h
@@ -81,7 +81,7 @@ void snd_jack_set_parent(struct snd_jack *jack, struct device *parent);
 int snd_jack_set_key(struct snd_jack *jack, enum snd_jack_types type,
 		     int keytype);
 #endif
-void snd_jack_report(struct snd_jack *jack, int status);
+void snd_jack_report(struct snd_jack *jack, int status, bool sw_inject);
 
 #else
 static inline int snd_jack_new(struct snd_card *card, const char *id, int type,
@@ -95,7 +95,7 @@ static inline int snd_jack_add_new_kctl(struct snd_jack *jack, const char * name
 	return 0;
 }
 
-static inline void snd_jack_report(struct snd_jack *jack, int status)
+static inline void snd_jack_report(struct snd_jack *jack, int status, bool sw_inject)
 {
 }
 
diff --git a/sound/core/jack.c b/sound/core/jack.c
index 503c8af79d55..49b9461aef51 100644
--- a/sound/core/jack.c
+++ b/sound/core/jack.c
@@ -336,8 +336,9 @@ EXPORT_SYMBOL(snd_jack_set_key);
  *
  * @jack:   The jack to report status for
  * @status: The current status of the jack
+ * @sw_inject: Indicate if this is called from jack software inject
  */
-void snd_jack_report(struct snd_jack *jack, int status)
+void snd_jack_report(struct snd_jack *jack, int status, bool sw_inject)
 {
 	struct snd_jack_kctl *jack_kctl;
 #ifdef CONFIG_SND_JACK_INPUT_DEV
diff --git a/sound/pci/hda/hda_jack.c b/sound/pci/hda/hda_jack.c
index 588059428d8f..152d651df74e 100644
--- a/sound/pci/hda/hda_jack.c
+++ b/sound/pci/hda/hda_jack.c
@@ -414,10 +414,10 @@ void snd_hda_jack_report_sync(struct hda_codec *codec)
 			state = jack->button_state;
 			if (get_jack_plug_state(jack->pin_sense))
 				state |= jack->type;
-			snd_jack_report(jack->jack, state);
+			snd_jack_report(jack->jack, state, false);
 			if (jack->button_state) {
 				snd_jack_report(jack->jack,
-						state & ~jack->button_state);
+						state & ~jack->button_state, false);
 				jack->button_state = 0; /* button released */
 			}
 		}
@@ -503,7 +503,7 @@ int snd_hda_jack_add_kctl_mst(struct hda_codec *codec, hda_nid_t nid,
 	}
 
 	state = snd_hda_jack_detect_mst(codec, nid, dev_id);
-	snd_jack_report(jack->jack, state ? jack->type : 0);
+	snd_jack_report(jack->jack, state ? jack->type : 0, false);
 
 	return 0;
 }
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index b0068f8ca46d..f19762a6e9e7 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -1590,7 +1590,7 @@ static void update_eld(struct hda_codec *codec,
 	if (eld_changed && pcm_jack)
 		snd_jack_report(pcm_jack,
 				(eld->monitor_present && eld->eld_valid) ?
-				SND_JACK_AVOUT : 0);
+				SND_JACK_AVOUT : 0, false);
 }
 
 /* update ELD and jack state via HD-audio verbs */
diff --git a/sound/pci/oxygen/xonar_wm87x6.c b/sound/pci/oxygen/xonar_wm87x6.c
index 8aa92f3e5ee8..595e10275bd9 100644
--- a/sound/pci/oxygen/xonar_wm87x6.c
+++ b/sound/pci/oxygen/xonar_wm87x6.c
@@ -251,7 +251,7 @@ static void xonar_ds_handle_hp_jack(struct oxygen *chip)
 		reg |= WM8766_MUTEALL;
 	wm8766_write_cached(chip, WM8766_DAC_CTRL, reg);
 
-	snd_jack_report(data->hp_jack, hp_plugged ? SND_JACK_HEADPHONE : 0);
+	snd_jack_report(data->hp_jack, hp_plugged ? SND_JACK_HEADPHONE : 0, false);
 
 	mutex_unlock(&chip->mutex);
 }
diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c
index 0f1820f36b4d..5b98f5fa4537 100644
--- a/sound/soc/soc-jack.c
+++ b/sound/soc/soc-jack.c
@@ -78,7 +78,7 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask)
 	if (sync)
 		snd_soc_dapm_sync(dapm);
 
-	snd_jack_report(jack->jack, jack->status);
+	snd_jack_report(jack->jack, jack->status, false);
 
 	mutex_unlock(&jack->mutex);
 }
diff --git a/sound/x86/intel_hdmi_audio.c b/sound/x86/intel_hdmi_audio.c
index 9f9fcd2749f2..e12dce8daed0 100644
--- a/sound/x86/intel_hdmi_audio.c
+++ b/sound/x86/intel_hdmi_audio.c
@@ -1363,7 +1363,7 @@ static void had_process_hot_plug(struct snd_intelhad *intelhaddata)
 		had_substream_put(intelhaddata);
 	}
 
-	snd_jack_report(intelhaddata->jack, SND_JACK_AVOUT);
+	snd_jack_report(intelhaddata->jack, SND_JACK_AVOUT, false);
 }
 
 /* process hot unplug, called from wq with mutex locked */
@@ -1398,7 +1398,7 @@ static void had_process_hot_unplug(struct snd_intelhad *intelhaddata)
 		had_substream_put(intelhaddata);
 	}
 
-	snd_jack_report(intelhaddata->jack, 0);
+	snd_jack_report(intelhaddata->jack, 0, false);
 }
 
 /*
-- 
2.25.1



More information about the Alsa-devel mailing list