i915/snd_hdac: I915 subcomponent for the snd_hdac

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
This commit is contained in:
Daniel Vetter 2019-02-08 00:27:59 +01:00
parent 3521ee994b
commit 8857c7d065
5 changed files with 16 additions and 7 deletions

View File

@ -984,7 +984,9 @@ void i915_audio_component_init(struct drm_i915_private *dev_priv)
{ {
int ret; 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) { if (ret < 0) {
DRM_ERROR("failed to add audio component (%d)\n", ret); DRM_ERROR("failed to add audio component (%d)\n", ret);
/* continue with reduced functionality */ /* continue with reduced functionality */

View File

@ -26,6 +26,10 @@
#include "drm_audio_component.h" #include "drm_audio_component.h"
enum i915_component_type {
I915_COMPONENT_AUDIO = 1,
};
/* MAX_PORT is the number of port /* MAX_PORT is the number of port
* It must be sync with I915_MAX_PORTS defined i915_drv.h * It must be sync with I915_MAX_PORTS defined i915_drv.h
*/ */

View 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); bool *audio_enabled, char *buffer, int max_bytes);
int snd_hdac_acomp_init(struct hdac_bus *bus, int snd_hdac_acomp_init(struct hdac_bus *bus,
const struct drm_audio_component_audio_ops *aops, 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); size_t extra_size);
int snd_hdac_acomp_exit(struct hdac_bus *bus); int snd_hdac_acomp_exit(struct hdac_bus *bus);
int snd_hdac_acomp_register_notifier(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, static inline int snd_hdac_acomp_init(struct hdac_bus *bus,
const struct drm_audio_component_audio_ops *aops, 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) size_t extra_size)
{ {
return -ENODEV; return -ENODEV;

View File

@ -269,7 +269,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_acomp_register_notifier);
*/ */
int snd_hdac_acomp_init(struct hdac_bus *bus, int snd_hdac_acomp_init(struct hdac_bus *bus,
const struct drm_audio_component_audio_ops *aops, 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) size_t extra_size)
{ {
struct component_match *match = NULL; struct component_match *match = NULL;
@ -288,7 +288,7 @@ int snd_hdac_acomp_init(struct hdac_bus *bus,
bus->audio_component = acomp; bus->audio_component = acomp;
devres_add(dev, 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, ret = component_master_add_with_match(dev, &hdac_component_master_ops,
match); match);
if (ret < 0) if (ret < 0)

View File

@ -82,9 +82,11 @@ void snd_hdac_i915_set_bclk(struct hdac_bus *bus)
} }
EXPORT_SYMBOL_GPL(snd_hdac_i915_set_bclk); 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 */ /* check whether intel graphics is present */