Merge branch 'etnaviv/next' of https://git.pengutronix.de/git/lst/linux into drm...
[sfrench/cifs-2.6.git] / sound / hda / hdac_component.c
index 5c95933e739a43bc5cd30829e43c0381cff1e989..dfe7e755f594df25ee4547ece4f6ee72d28f761a 100644 (file)
@@ -69,29 +69,39 @@ void snd_hdac_display_power(struct hdac_bus *bus, unsigned int idx, bool enable)
 
        dev_dbg(bus->dev, "display power %s\n",
                enable ? "enable" : "disable");
+
+       mutex_lock(&bus->lock);
        if (enable)
                set_bit(idx, &bus->display_power_status);
        else
                clear_bit(idx, &bus->display_power_status);
 
        if (!acomp || !acomp->ops)
-               return;
+               goto unlock;
 
        if (bus->display_power_status) {
                if (!bus->display_power_active) {
+                       unsigned long cookie = -1;
+
                        if (acomp->ops->get_power)
-                               acomp->ops->get_power(acomp->dev);
+                               cookie = 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;
+                       bus->display_power_active = cookie;
                }
        } else {
                if (bus->display_power_active) {
+                       unsigned long cookie = bus->display_power_active;
+
                        if (acomp->ops->put_power)
-                               acomp->ops->put_power(acomp->dev);
-                       bus->display_power_active = false;
+                               acomp->ops->put_power(acomp->dev, cookie);
+
+                       bus->display_power_active = 0;
                }
        }
+ unlock:
+       mutex_unlock(&bus->lock);
 }
 EXPORT_SYMBOL_GPL(snd_hdac_display_power);
 
@@ -325,9 +335,9 @@ int snd_hdac_acomp_exit(struct hdac_bus *bus)
                return 0;
 
        if (WARN_ON(bus->display_power_active) && acomp->ops)
-               acomp->ops->put_power(acomp->dev);
+               acomp->ops->put_power(acomp->dev, bus->display_power_active);
 
-       bus->display_power_active = false;
+       bus->display_power_active = 0;
        bus->display_power_status = 0;
 
        component_master_del(dev, &hdac_component_master_ops);