]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - sound/hda/hdac_component.c
ALSA: hda: Make snd_hdac_display_power() void function
[linux.git] / sound / hda / hdac_component.c
index 6e46a9c73aed463bbc1755edd2fc85f1aa20fa09..a6d37b9d6413f51b49fd4486a251bf7e84261532 100644 (file)
@@ -54,41 +54,44 @@ EXPORT_SYMBOL_GPL(snd_hdac_set_codec_wakeup);
 /**
  * snd_hdac_display_power - Power up / down the power refcount
  * @bus: HDA core bus
+ * @idx: HDA codec address, pass HDA_CODEC_IDX_CONTROLLER for controller
  * @enable: power up or down
  *
- * This function is supposed to be used only by a HD-audio controller
- * driver that needs the interaction with graphics driver.
+ * This function is used by either HD-audio controller or codec driver that
+ * needs the interaction with graphics driver.
  *
- * This function manages a refcount and calls the get_power() and
+ * This function updates the power status, and calls the get_power() and
  * put_power() ops accordingly, toggling the codec wakeup, too.
- *
- * Returns zero for success or a negative error code.
  */
-int snd_hdac_display_power(struct hdac_bus *bus, bool enable)
+void snd_hdac_display_power(struct hdac_bus *bus, unsigned int idx, bool enable)
 {
        struct drm_audio_component *acomp = bus->audio_component;
 
-       if (!acomp || !acomp->ops)
-               return -ENODEV;
-
        dev_dbg(bus->dev, "display power %s\n",
                enable ? "enable" : "disable");
+       if (enable)
+               set_bit(idx, &bus->display_power_status);
+       else
+               clear_bit(idx, &bus->display_power_status);
 
-       if (enable) {
-               if (!bus->drm_power_refcount++) {
+       if (!acomp || !acomp->ops)
+               return;
+
+       if (bus->display_power_status) {
+               if (!bus->display_power_active) {
                        if (acomp->ops->get_power)
                                acomp->ops->get_power(acomp->dev);
                        snd_hdac_set_codec_wakeup(bus, true);
                        snd_hdac_set_codec_wakeup(bus, false);
+                       bus->display_power_active = true;
                }
        } else {
-               WARN_ON(!bus->drm_power_refcount);
-               if (!--bus->drm_power_refcount)
+               if (bus->display_power_active) {
                        if (acomp->ops->put_power)
                                acomp->ops->put_power(acomp->dev);
+                       bus->display_power_active = false;
+               }
        }
-
-       return 0;
 }
 EXPORT_SYMBOL_GPL(snd_hdac_display_power);
 
@@ -321,10 +324,12 @@ int snd_hdac_acomp_exit(struct hdac_bus *bus)
        if (!acomp)
                return 0;
 
-       WARN_ON(bus->drm_power_refcount);
-       if (bus->drm_power_refcount > 0 && acomp->ops)
+       if (WARN_ON(bus->display_power_active) && acomp->ops)
                acomp->ops->put_power(acomp->dev);
 
+       bus->display_power_active = false;
+       bus->display_power_status = 0;
+
        component_master_del(dev, &hdac_component_master_ops);
 
        bus->audio_component = NULL;