summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorMengdong Lin <mengdong.lin@intel.com>2015-04-29 11:43:12 +0200
committerTakashi Iwai <tiwai@suse.de>2015-04-29 12:27:52 +0200
commitd4b7b13e19258a848da920502e27526f36c5a59d (patch)
treefd2a55f49787b4621511bfd6b9aca7475f7a88d4 /sound
parentALSA: hda - Replace open codes with snd_hdac_stream_set_params() (diff)
downloadlinux-d4b7b13e19258a848da920502e27526f36c5a59d.tar.xz
linux-d4b7b13e19258a848da920502e27526f36c5a59d.zip
ALSA: hda - implement a refcount for i915 power well switch
This is to check the refcount of audio driver and reduce calling to i915. Signed-off-by: Mengdong Lin <mengdong.lin@intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/hda/hda_i915.c18
-rw-r--r--sound/pci/hda/hda_intel.h1
2 files changed, 15 insertions, 4 deletions
diff --git a/sound/pci/hda/hda_i915.c b/sound/pci/hda/hda_i915.c
index 52a85d87c23c..b648928b6415 100644
--- a/sound/pci/hda/hda_i915.c
+++ b/sound/pci/hda/hda_i915.c
@@ -42,10 +42,15 @@ int hda_display_power(struct hda_intel *hda, bool enable)
dev_dbg(&hda->chip.pci->dev, "display power %s\n",
enable ? "enable" : "disable");
- if (enable)
- acomp->ops->get_power(acomp->dev);
- else
- acomp->ops->put_power(acomp->dev);
+
+ if (enable) {
+ if (!hda->i915_power_refcount++)
+ acomp->ops->get_power(acomp->dev);
+ } else {
+ WARN_ON(!hda->i915_power_refcount);
+ if (!--hda->i915_power_refcount)
+ acomp->ops->put_power(acomp->dev);
+ }
return 0;
}
@@ -183,6 +188,11 @@ out_err:
int hda_i915_exit(struct hda_intel *hda)
{
struct device *dev = &hda->chip.pci->dev;
+ struct i915_audio_component *acomp = &hda->audio_component;
+
+ WARN_ON(hda->i915_power_refcount);
+ if (hda->i915_power_refcount > 0 && acomp->ops)
+ acomp->ops->put_power(acomp->dev);
component_master_del(dev, &hda_component_master_ops);
diff --git a/sound/pci/hda/hda_intel.h b/sound/pci/hda/hda_intel.h
index 206989878bc6..dc1d3ffab1aa 100644
--- a/sound/pci/hda/hda_intel.h
+++ b/sound/pci/hda/hda_intel.h
@@ -46,6 +46,7 @@ struct hda_intel {
/* i915 component interface */
struct i915_audio_component audio_component;
+ int i915_power_refcount;
};
#ifdef CONFIG_SND_HDA_I915