[alsa-devel] HDMI codec, way forward?
Takashi Iwai
tiwai at suse.de
Wed Oct 21 09:50:35 PDT 2015
On Wed, 21 Oct 2015 18:48:06 +0200,
Takashi Iwai wrote:
>
> On Wed, 21 Oct 2015 18:46:23 +0200,
> Takashi Iwai wrote:
> >
> > Below is a test patch I cooked quickly. This is the third patch
> > applied after other two more patches: a cleanup patch and a patch for
> > deferred probe of HD-audio with component.
>
> And this is the patch to defer the probe.
... and the first patch, a sort of cleanup, is here
(sorry for the mess).
I put these three in test/hda-i915 branch of my sound git tree.
Takashi
---- 8< ----
From: Takashi Iwai <tiwai at suse.de>
Subject: [PATCH 1/3] ALSA: hda - Pass hdac_device object at notifier
registration
For dropping the local static variable in hdac_i915.c, add an argument
to pass the hdac_device object to snd-Hdac_i915_register_notifier().
This allows us (in theory) having individual audio component per bus.
Signed-off-by: Takashi Iwai <tiwai at suse.de>
---
include/sound/hda_i915.h | 6 ++++--
sound/hda/hdac_i915.c | 21 +++++++++++++--------
sound/pci/hda/patch_hdmi.c | 5 +++--
3 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/include/sound/hda_i915.h b/include/sound/hda_i915.h
index 930b41e5acf4..7b19f1f8cc23 100644
--- a/include/sound/hda_i915.h
+++ b/include/sound/hda_i915.h
@@ -12,7 +12,8 @@ int snd_hdac_display_power(struct hdac_bus *bus, bool enable);
int snd_hdac_get_display_clk(struct hdac_bus *bus);
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 i915_audio_component_audio_ops *);
+int snd_hdac_i915_register_notifier(struct hdac_device *codec,
+ const struct i915_audio_component_audio_ops *);
#else
static inline int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable)
{
@@ -34,7 +35,8 @@ static inline int snd_hdac_i915_exit(struct hdac_bus *bus)
{
return 0;
}
-static inline int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *ops)
+static inline int snd_hdac_i915_register_notifier(struct hdac_device *codec,
+ const struct i915_audio_component_audio_ops *ops)
{
return -ENODEV;
}
diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c
index 55c3df4458f7..e36ed18f23c4 100644
--- a/sound/hda/hdac_i915.c
+++ b/sound/hda/hdac_i915.c
@@ -21,8 +21,6 @@
#include <sound/hdaudio.h>
#include <sound/hda_i915.h>
-static struct i915_audio_component *hdac_acomp;
-
int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable)
{
struct i915_audio_component *acomp = bus->audio_component;
@@ -84,7 +82,9 @@ EXPORT_SYMBOL_GPL(snd_hdac_get_display_clk);
static int hdac_component_master_bind(struct device *dev)
{
- struct i915_audio_component *acomp = hdac_acomp;
+ struct hdac_device *codec = dev_to_hdac_dev(dev);
+ struct hdac_bus *bus = codec->bus;
+ struct i915_audio_component *acomp = bus->audio_component;
int ret;
ret = component_bind_all(dev, acomp);
@@ -116,7 +116,9 @@ out_unbind:
static void hdac_component_master_unbind(struct device *dev)
{
- struct i915_audio_component *acomp = hdac_acomp;
+ struct hdac_device *codec = dev_to_hdac_dev(dev);
+ struct hdac_bus *bus = codec->bus;
+ struct i915_audio_component *acomp = bus->audio_component;
module_put(acomp->ops->owner);
component_unbind_all(dev, acomp);
@@ -134,12 +136,16 @@ static int hdac_component_master_match(struct device *dev, void *data)
return !strcmp(dev->driver->name, "i915");
}
-int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *aops)
+int snd_hdac_i915_register_notifier(struct hdac_device *codec,
+ const struct i915_audio_component_audio_ops *aops)
{
- if (WARN_ON(!hdac_acomp))
+ struct hdac_bus *bus = codec->bus;
+ struct i915_audio_component *acomp = bus->audio_component;
+
+ if (WARN_ON(!acomp))
return -ENODEV;
- hdac_acomp->audio_ops = aops;
+ acomp->audio_ops = aops;
return 0;
}
EXPORT_SYMBOL_GPL(snd_hdac_i915_register_notifier);
@@ -155,7 +161,6 @@ int snd_hdac_i915_init(struct hdac_bus *bus)
if (!acomp)
return -ENOMEM;
bus->audio_component = acomp;
- hdac_acomp = acomp;
component_match_add(dev, &match, hdac_component_master_match, bus);
ret = component_master_add_with_match(dev, &hdac_component_master_ops,
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index f503a883bef3..fbd60ea98f19 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -2216,7 +2216,7 @@ static void generic_hdmi_free(struct hda_codec *codec)
int pin_idx;
if (is_haswell_plus(codec) || is_valleyview_plus(codec))
- snd_hdac_i915_register_notifier(NULL);
+ snd_hdac_i915_register_notifier(&codec->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);
@@ -2381,7 +2381,8 @@ static int patch_generic_hdmi(struct hda_codec *codec)
codec->depop_delay = 0;
spec->i915_audio_ops.audio_ptr = codec;
spec->i915_audio_ops.pin_eld_notify = intel_pin_eld_notify;
- snd_hdac_i915_register_notifier(&spec->i915_audio_ops);
+ snd_hdac_i915_register_notifier(&codec->core,
+ &spec->i915_audio_ops);
}
if (hdmi_parse_codec(codec) < 0) {
--
2.6.1
More information about the dri-devel
mailing list