bb03ed2163
The recent bug report suggests that BCLK setup for i915 HSW/BDW needs to be updated at each HDMI hotplug, not only at initialization and resume. That is, we need to update HSW_EM4 and HSW_EM5 registers at ELD notification, too. Otherwise the HDMI audio may be out of sync and played in a wrong pitch. However, the HDA codec driver has no access to the controller registers, and currently the code managing these registers is in hda_intel.c, i.e. local to the controller driver. For allowing the explicit BCLK update from the codec driver, as in this patch, the former haswell_set_bclk() in hda_intel.c is moved to hdac_i915.c and exposed as snd_hdac_i915_set_bclk(). This is called from both the HDA controller driver and intel_pin_eld_notify() in HDMI codec driver. Along with this change, snd_hdac_get_display_clk() gets dropped as it's no longer used. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91410 Cc: <stable@vger.kernel.org> # v4.5+ Signed-off-by: Takashi Iwai <tiwai@suse.de>
57 lines
1.5 KiB
C
57 lines
1.5 KiB
C
/*
|
|
* HD-Audio helpers to sync with i915 driver
|
|
*/
|
|
#ifndef __SOUND_HDA_I915_H
|
|
#define __SOUND_HDA_I915_H
|
|
|
|
#include <drm/i915_component.h>
|
|
|
|
#ifdef CONFIG_SND_HDA_I915
|
|
int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable);
|
|
int snd_hdac_display_power(struct hdac_bus *bus, bool enable);
|
|
void snd_hdac_i915_set_bclk(struct hdac_bus *bus);
|
|
int snd_hdac_sync_audio_rate(struct hdac_bus *bus, hda_nid_t nid, int rate);
|
|
int snd_hdac_acomp_get_eld(struct hdac_bus *bus, hda_nid_t nid,
|
|
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 i915_audio_component_audio_ops *);
|
|
#else
|
|
static inline int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline int snd_hdac_display_power(struct hdac_bus *bus, bool enable)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline void snd_hdac_i915_set_bclk(struct hdac_bus *bus)
|
|
{
|
|
}
|
|
static inline int snd_hdac_sync_audio_rate(struct hdac_bus *bus, hda_nid_t nid,
|
|
int rate)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline int snd_hdac_acomp_get_eld(struct hdac_bus *bus, hda_nid_t nid,
|
|
bool *audio_enabled, char *buffer,
|
|
int max_bytes)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
static inline int snd_hdac_i915_init(struct hdac_bus *bus)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
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)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
#endif
|
|
|
|
#endif /* __SOUND_HDA_I915_H */
|