[alsa-devel] [PATCH 1/3] ALSA: hda - add new function snd_hda_bus_reset() for codec communitation error

mengdong.lin at intel.com mengdong.lin at intel.com
Mon Apr 8 19:53:44 CEST 2013


From: Mengdong Lin <mengdong.lin at intel.com>

A new function snd_hda_bus_reset() is defined to suspend and resume all codecs
on the hda bus. It will be called by bus reset ops azx_bus_reset() as a rescue
of codec communitation error.

snd_hda_suspend & snd_hda_resume will no longer be called by azx_bus_reset.
So snd_hda_resume will only be used in system resume and may delay resuming a
codec.

Signed-off-by: Mengdong Lin <mengdong.lin at intel.com>

diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 17286b3..a05af8b 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -5523,6 +5523,26 @@ int snd_hda_resume(struct hda_bus *bus)
 	return 0;
 }
 EXPORT_SYMBOL_HDA(snd_hda_resume);
+
+/**
+ * snd_hda_bus_reset - reset the codecs, i.e. suspend and resume the codecs
+ * @bus: the HDA bus
+ *
+ * Returns 0 if successful.
+ */
+int snd_hda_bus_reset(struct hda_bus *bus)
+{
+	struct hda_codec *codec;
+
+	list_for_each_entry(codec, &bus->codec_list, list) {
+		cancel_delayed_work_sync(&codec->jackpoll_work);
+		if (hda_codec_is_power_on(codec))
+			hda_call_codec_suspend(codec, false);
+		hda_call_codec_resume(codec);
+	}
+	return 0;
+}
+EXPORT_SYMBOL_HDA(snd_hda_bus_reset);
 #endif /* CONFIG_PM */
 
 /*
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
index c93f902..6061360 100644
--- a/sound/pci/hda/hda_codec.h
+++ b/sound/pci/hda/hda_codec.h
@@ -1076,6 +1076,7 @@ void snd_hda_unlock_devices(struct hda_bus *bus);
 #ifdef CONFIG_PM
 int snd_hda_suspend(struct hda_bus *bus);
 int snd_hda_resume(struct hda_bus *bus);
+int snd_hda_bus_reset(struct hda_bus *bus);
 #endif
 
 static inline
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 735567e..6f11c7a 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1659,8 +1659,7 @@ static void azx_bus_reset(struct hda_bus *bus)
 		struct azx_pcm *p;
 		list_for_each_entry(p, &chip->pcm_list, list)
 			snd_pcm_suspend_all(p->pcm);
-		snd_hda_suspend(chip->bus);
-		snd_hda_resume(chip->bus);
+		snd_hda_bus_reset(chip->bus);
 	}
 #endif
 	bus->in_reset = 0;
-- 
1.7.10.4



More information about the Alsa-devel mailing list