// SPDX-License-Identifier: GPL-2.0 // hdac_component.c - routines for sync between HD-A core and DRM driver #include <linux/init.h> #include <linux/module.h> #include <linux/pci.h> #include <linux/component.h> #include <sound/core.h> #include <sound/hdaudio.h> #include <sound/hda_component.h> #include <sound/hda_register.h> static void hdac_acomp_release(struct device *dev, void *res) { … } static struct drm_audio_component *hdac_get_acomp(struct device *dev) { … } /** * snd_hdac_set_codec_wakeup - Enable / disable HDMI/DP codec wakeup * @bus: HDA core bus * @enable: enable or disable the wakeup * * This function is supposed to be used only by a HD-audio controller * driver that needs the interaction with graphics driver. * * This function should be called during the chip reset, also called at * resume for updating STATESTS register read. * * Returns zero for success or a negative error code. */ int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable) { … } EXPORT_SYMBOL_GPL(…); /** * snd_hdac_display_power - Power up / down the power refcount * @bus: HDA core bus * @idx: HDA codec address, pass HDA_CODEC_IDX_CONTROLLER for controller * @enable: power up or down * * This function is used by either HD-audio controller or codec driver that * needs the interaction with graphics driver. * * This function updates the power status, and calls the get_power() and * put_power() ops accordingly, toggling the codec wakeup, too. */ void snd_hdac_display_power(struct hdac_bus *bus, unsigned int idx, bool enable) { … } EXPORT_SYMBOL_GPL(…); /** * snd_hdac_sync_audio_rate - Set N/CTS based on the sample rate * @codec: HDA codec * @nid: the pin widget NID * @dev_id: device identifier * @rate: the sample rate to set * * This function is supposed to be used only by a HD-audio controller * driver that needs the interaction with graphics driver. * * This function sets N/CTS value based on the given sample rate. * Returns zero for success, or a negative error code. */ int snd_hdac_sync_audio_rate(struct hdac_device *codec, hda_nid_t nid, int dev_id, int rate) { … } EXPORT_SYMBOL_GPL(…); /** * snd_hdac_acomp_get_eld - Get the audio state and ELD via component * @codec: HDA codec * @nid: the pin widget NID * @dev_id: device identifier * @audio_enabled: the pointer to store the current audio state * @buffer: the buffer pointer to store ELD bytes * @max_bytes: the max bytes to be stored on @buffer * * This function is supposed to be used only by a HD-audio controller * driver that needs the interaction with graphics driver. * * This function queries the current state of the audio on the given * digital port and fetches the ELD bytes onto the given buffer. * It returns the number of bytes for the total ELD data, zero for * invalid ELD, or a negative error code. * * The return size is the total bytes required for the whole ELD bytes, * thus it may be over @max_bytes. If it's over @max_bytes, it implies * that only a part of ELD bytes have been fetched. */ 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) { … } EXPORT_SYMBOL_GPL(…); static int hdac_component_master_bind(struct device *dev) { … } static void hdac_component_master_unbind(struct device *dev) { … } static const struct component_master_ops hdac_component_master_ops = …; /** * snd_hdac_acomp_register_notifier - Register audio component ops * @bus: HDA core bus * @aops: audio component ops * * This function is supposed to be used only by a HD-audio controller * driver that needs the interaction with graphics driver. * * This function sets the given ops to be called by the graphics driver. * * Returns zero for success or a negative error code. */ int snd_hdac_acomp_register_notifier(struct hdac_bus *bus, const struct drm_audio_component_audio_ops *aops) { … } EXPORT_SYMBOL_GPL(…); /** * snd_hdac_acomp_init - Initialize audio component * @bus: HDA core bus * @aops: audio component ops * @match_master: match function for finding components * @extra_size: Extra bytes to allocate * * This function is supposed to be used only by a HD-audio controller * driver that needs the interaction with graphics driver. * * This function initializes and sets up the audio component to communicate * with graphics driver. * * Unlike snd_hdac_i915_init(), this function doesn't synchronize with the * binding with the DRM component. Each caller needs to sync via master_bind * audio_ops. * * Returns zero for success or a negative error code. */ int snd_hdac_acomp_init(struct hdac_bus *bus, const struct drm_audio_component_audio_ops *aops, int (*match_master)(struct device *, int, void *), size_t extra_size) { … } EXPORT_SYMBOL_GPL(…); /** * snd_hdac_acomp_exit - Finalize audio component * @bus: HDA core bus * * This function is supposed to be used only by a HD-audio controller * driver that needs the interaction with graphics driver. * * This function releases the audio component that has been used. * * Returns zero for success or a negative error code. */ int snd_hdac_acomp_exit(struct hdac_bus *bus) { … } EXPORT_SYMBOL_GPL(…);