i915/snd_hdac: I915 subcomponent for the snd_hdac
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 7 Feb 2019 23:27:59 +0000 (00:27 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 8 Feb 2019 15:58:59 +0000 (16:58 +0100)
Since we need multiple components for I915 for different purposes
(Audio & Mei_hdcp), we adopt the subcomponents methodology introduced
by the previous patch (mentioned below).

Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date:   Mon Jan 28 17:08:20 2019 +0530

    components: multiple components for a device

Reviewed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by-by: Ramalingam C <ramalinagm.c@intel.com> (commit message)
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> (code)
cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
cc: Russell King <rmk+kernel@arm.linux.org.uk>
cc: Rafael J. Wysocki <rafael@kernel.org>
cc: Jaroslav Kysela <perex@perex.cz>
cc: Takashi Iwai <tiwai@suse.com>
cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
cc: Jani Nikula <jani.nikula@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190207232759.14553-4-daniel.vetter@ffwll.ch
drivers/gpu/drm/i915/intel_audio.c
include/drm/i915_component.h
include/sound/hda_component.h
sound/hda/hdac_component.c
sound/hda/hdac_i915.c

index ae55a6865d5cca98f8738cbf8db4cffe5039bfa2..b32681632f30096bc7b4750148d214e1a7e47e59 100644 (file)
@@ -984,7 +984,9 @@ void i915_audio_component_init(struct drm_i915_private *dev_priv)
 {
        int ret;
 
-       ret = component_add(dev_priv->drm.dev, &i915_audio_component_bind_ops);
+       ret = component_add_typed(dev_priv->drm.dev,
+                                 &i915_audio_component_bind_ops,
+                                 I915_COMPONENT_AUDIO);
        if (ret < 0) {
                DRM_ERROR("failed to add audio component (%d)\n", ret);
                /* continue with reduced functionality */
index fca22d463e1bf707199bc0dbe8e77705c21c3a8b..72fbb037f9b3018414e8995ecb394f38d139682e 100644 (file)
 
 #include "drm_audio_component.h"
 
+enum i915_component_type {
+       I915_COMPONENT_AUDIO = 1,
+};
+
 /* MAX_PORT is the number of port
  * It must be sync with I915_MAX_PORTS defined i915_drv.h
  */
index 2ec31b35895045e1eb8eb33fc8d5622fb87aa2dd..d4804c72d959e34f88ff0f409dc91838636a4f4d 100644 (file)
@@ -20,7 +20,7 @@ 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_acomp_init(struct hdac_bus *bus,
                        const struct drm_audio_component_audio_ops *aops,
-                       int (*match_master)(struct device *, void *),
+                       int (*match_master)(struct device *, int, void *),
                        size_t extra_size);
 int snd_hdac_acomp_exit(struct hdac_bus *bus);
 int snd_hdac_acomp_register_notifier(struct hdac_bus *bus,
@@ -47,7 +47,8 @@ static inline int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t ni
 }
 static inline int snd_hdac_acomp_init(struct hdac_bus *bus,
                                      const struct drm_audio_component_audio_ops *aops,
-                                     int (*match_master)(struct device *, void *),
+                                     int (*match_master)(struct device *,
+                                                         int, void *),
                                      size_t extra_size)
 {
        return -ENODEV;
index a6d37b9d6413f51b49fd4486a251bf7e84261532..5c95933e739a43bc5cd30829e43c0381cff1e989 100644 (file)
@@ -269,7 +269,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_acomp_register_notifier);
  */
 int snd_hdac_acomp_init(struct hdac_bus *bus,
                        const struct drm_audio_component_audio_ops *aops,
-                       int (*match_master)(struct device *, void *),
+                       int (*match_master)(struct device *, int, void *),
                        size_t extra_size)
 {
        struct component_match *match = NULL;
@@ -288,7 +288,7 @@ int snd_hdac_acomp_init(struct hdac_bus *bus,
        bus->audio_component = acomp;
        devres_add(dev, acomp);
 
-       component_match_add(dev, &match, match_master, bus);
+       component_match_add_typed(dev, &match, match_master, bus);
        ret = component_master_add_with_match(dev, &hdac_component_master_ops,
                                              match);
        if (ret < 0)
index 617ff1aa818f991a01091a9e03aa7952978c0b92..7aee090e3d275883465974ae5d90a39acde6c9b2 100644 (file)
@@ -82,9 +82,11 @@ void snd_hdac_i915_set_bclk(struct hdac_bus *bus)
 }
 EXPORT_SYMBOL_GPL(snd_hdac_i915_set_bclk);
 
-static int i915_component_master_match(struct device *dev, void *data)
+static int i915_component_master_match(struct device *dev, int subcomponent,
+                                      void *data)
 {
-       return !strcmp(dev->driver->name, "i915");
+       return !strcmp(dev->driver->name, "i915") &&
+              subcomponent == I915_COMPONENT_AUDIO;
 }
 
 /* check whether intel graphics is present */