ALSA: hdac: Add snd_hdac_ext_bus_link_power_down_all()
authorJeeja KP <jeeja.kp@intel.com>
Fri, 21 Aug 2015 16:06:18 +0000 (21:36 +0530)
committerTakashi Iwai <tiwai@suse.de>
Fri, 21 Aug 2015 17:28:18 +0000 (19:28 +0200)
New HDA controllers like Skylake sport multiple HDA links, so we need a
helper to turn off all the links in one go while suspending the device so
add snd_hdac_ext_bus_link_power_down_all() API

Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/hdaudio_ext.h
sound/hda/ext/hdac_ext_controller.c

index 55e2fc36177feedea9968a19b51c004815071377..160160d9bffce588739eaadf7c538b75a35b4535 100644 (file)
@@ -116,6 +116,7 @@ struct hdac_ext_link {
 
 int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link);
 int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link);
+int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus);
 void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link,
                                 int stream);
 void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
index d3bb112754f23a20ff33ee6d1afb5379bfa4d36f..63215b17247c8e98e456ff588f96ed5f9bb1cf26 100644 (file)
@@ -280,3 +280,23 @@ int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link)
        return check_hdac_link_power_active(link, false);
 }
 EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down);
+
+/**
+ * snd_hdac_ext_bus_link_power_down_all -power down all hda link
+ * @ebus: HD-audio extended bus
+ */
+int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus)
+{
+       struct hdac_ext_link *hlink = NULL;
+       int ret;
+
+       list_for_each_entry(hlink, &ebus->hlink_list, list) {
+               snd_hdac_updatel(hlink->ml_addr, AZX_REG_ML_LCTL, AZX_MLCTL_SPA, 0);
+               ret = check_hdac_link_power_active(hlink, false);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down_all);