summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sound/hda_i915.h6
-rw-r--r--sound/hda/hdac_i915.c34
-rw-r--r--sound/pci/hda/patch_hdmi.c5
-rw-r--r--sound/soc/codecs/hdac_hdmi.c2
4 files changed, 29 insertions, 18 deletions
diff --git a/include/sound/hda_i915.h b/include/sound/hda_i915.h
index f69ea84e7b65..648263791559 100644
--- a/include/sound/hda_i915.h
+++ b/include/sound/hda_i915.h
@@ -17,7 +17,8 @@ int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid, int dev_id,
bool *audio_enabled, char *buffer, int max_bytes);
int snd_hdac_i915_init(struct hdac_bus *bus);
int snd_hdac_i915_exit(struct hdac_bus *bus);
-int snd_hdac_i915_register_notifier(const struct drm_audio_component_audio_ops *);
+int snd_hdac_i915_register_notifier(struct hdac_bus *bus,
+ const struct drm_audio_component_audio_ops *ops);
#else
static inline int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable)
{
@@ -49,7 +50,8 @@ static inline int snd_hdac_i915_exit(struct hdac_bus *bus)
{
return 0;
}
-static inline int snd_hdac_i915_register_notifier(const struct drm_audio_component_audio_ops *ops)
+static inline int snd_hdac_i915_register_notifier(struct hdac_bus *bus,
+ const struct drm_audio_component_audio_ops *ops)
{
return -ENODEV;
}
diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c
index 1a88c1aaf9bb..861b77bbc7df 100644
--- a/sound/hda/hdac_i915.c
+++ b/sound/hda/hdac_i915.c
@@ -22,7 +22,14 @@
#include <sound/hda_i915.h>
#include <sound/hda_register.h>
-static struct drm_audio_component *hdac_acomp;
+static void hdac_acomp_release(struct device *dev, void *res)
+{
+}
+
+static struct drm_audio_component *hdac_get_acomp(struct device *dev)
+{
+ return devres_find(dev, hdac_acomp_release, NULL, NULL);
+}
/**
* snd_hdac_set_codec_wakeup - Enable / disable HDMI/DP codec wakeup
@@ -262,7 +269,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_acomp_get_eld);
static int hdac_component_master_bind(struct device *dev)
{
- struct drm_audio_component *acomp = hdac_acomp;
+ struct drm_audio_component *acomp = hdac_get_acomp(dev);
int ret;
ret = component_bind_all(dev, acomp);
@@ -294,7 +301,7 @@ out_unbind:
static void hdac_component_master_unbind(struct device *dev)
{
- struct drm_audio_component *acomp = hdac_acomp;
+ struct drm_audio_component *acomp = hdac_get_acomp(dev);
module_put(acomp->ops->owner);
component_unbind_all(dev, acomp);
@@ -314,6 +321,7 @@ static int hdac_component_master_match(struct device *dev, void *data)
/**
* snd_hdac_i915_register_notifier - Register i915 audio component ops
+ * @bus: HDA core bus
* @aops: i915 audio component ops
*
* This function is supposed to be used only by a HD-audio controller
@@ -323,12 +331,13 @@ static int hdac_component_master_match(struct device *dev, void *data)
*
* Returns zero for success or a negative error code.
*/
-int snd_hdac_i915_register_notifier(const struct drm_audio_component_audio_ops *aops)
+int snd_hdac_i915_register_notifier(struct hdac_bus *bus,
+ const struct drm_audio_component_audio_ops *aops)
{
- if (!hdac_acomp)
+ if (!bus->audio_component)
return -ENODEV;
- hdac_acomp->audio_ops = aops;
+ bus->audio_component->audio_ops = aops;
return 0;
}
EXPORT_SYMBOL_GPL(snd_hdac_i915_register_notifier);
@@ -365,18 +374,19 @@ int snd_hdac_i915_init(struct hdac_bus *bus)
struct drm_audio_component *acomp;
int ret;
- if (WARN_ON(hdac_acomp))
+ if (WARN_ON(hdac_get_acomp(dev)))
return -EBUSY;
if (!i915_gfx_present())
return -ENODEV;
- i915_acomp = kzalloc(sizeof(*i915_acomp), GFP_KERNEL);
+ i915_acomp = devres_alloc(hdac_acomp_release, sizeof(*i915_acomp),
+ GFP_KERNEL);
if (!i915_acomp)
return -ENOMEM;
acomp = &i915_acomp->base;
bus->audio_component = acomp;
- hdac_acomp = acomp;
+ devres_add(dev, acomp);
component_match_add(dev, &match, hdac_component_master_match, bus);
ret = component_master_add_with_match(dev, &hdac_component_master_ops,
@@ -400,9 +410,8 @@ int snd_hdac_i915_init(struct hdac_bus *bus)
out_master_del:
component_master_del(dev, &hdac_component_master_ops);
out_err:
- kfree(acomp);
bus->audio_component = NULL;
- hdac_acomp = NULL;
+ devres_destroy(dev, hdac_acomp_release, NULL, NULL);
dev_info(dev, "failed to add i915 component master (%d)\n", ret);
return ret;
@@ -434,9 +443,8 @@ int snd_hdac_i915_exit(struct hdac_bus *bus)
component_master_del(dev, &hdac_component_master_ops);
- kfree(acomp);
bus->audio_component = NULL;
- hdac_acomp = NULL;
+ devres_destroy(dev, hdac_acomp_release, NULL, NULL);
return 0;
}
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index c0847017114c..bf174a013f2d 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -2288,7 +2288,7 @@ static void generic_hdmi_free(struct hda_codec *codec)
int pin_idx, pcm_idx;
if (codec_has_acomp(codec))
- snd_hdac_i915_register_notifier(NULL);
+ snd_hdac_i915_register_notifier(&codec->bus->core, NULL);
for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
@@ -2518,7 +2518,8 @@ static void register_i915_notifier(struct hda_codec *codec)
*/
wmb();
spec->drm_audio_ops.pin_eld_notify = intel_pin_eld_notify;
- snd_hdac_i915_register_notifier(&spec->drm_audio_ops);
+ snd_hdac_i915_register_notifier(&codec->bus->core,
+ &spec->drm_audio_ops);
}
/* setup_stream ops override for HSW+ */
diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
index 460075475f20..2b7c33db4ded 100644
--- a/sound/soc/codecs/hdac_hdmi.c
+++ b/sound/soc/codecs/hdac_hdmi.c
@@ -1812,7 +1812,7 @@ static int hdmi_codec_probe(struct snd_soc_component *component)
return ret;
aops.audio_ptr = hdev;
- ret = snd_hdac_i915_register_notifier(&aops);
+ ret = snd_hdac_i915_register_notifier(hdev->bus, &aops);
if (ret < 0) {
dev_err(&hdev->dev, "notifier register failed: err: %d\n", ret);
return ret;