forked from Minki/linux
ALSA: hda - Enable audio component for old Intel PCH devices
As i915 graphics driver provides the notification via audio component, not only the currently implemented HSW+ and VLV+ platforms but also all other PCH-based platforms (e.g. Cougar Point, Panther Point, etc) can use this infrastructure. It'll improve the reliability and the power consumption significantly, especially once when we implement the ELD notification via component. As a preliminary, this patch enables the usage of audio component for all PCH platforms. The HDA controller just needs to set AZX_DCAPS_I915_POWERWELL flag appropriately. The name of the flag is a bit confusing, but this actually works even on the chips without the powerwell but accesses only the other component ops. In the HDMI/DP codec driver side, we just need to register/unregister the notifier for such chips. This can be identified by checking the audio_component field in the assigned hdac_bus. One caveat is that PCH for Haswell and Broadwell must not be bound with i915 audio component, as there are dedicated HD-audio HDMI controllers on these platforms. Ditto for Poulsbo and Oaktrail as they use gma500 graphics, not i915. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
e90247f9fc
commit
6603249dcd
@ -284,13 +284,19 @@ enum {
|
||||
(AZX_DCAPS_OLD_SSYNC | AZX_DCAPS_NO_ALIGN_BUFSIZE)
|
||||
|
||||
/* quirks for Intel PCH */
|
||||
#define AZX_DCAPS_INTEL_PCH_NOPM \
|
||||
#define AZX_DCAPS_INTEL_PCH_BASE \
|
||||
(AZX_DCAPS_NO_ALIGN_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY |\
|
||||
AZX_DCAPS_REVERSE_ASSIGN | AZX_DCAPS_SNOOP_TYPE(SCH))
|
||||
|
||||
#define AZX_DCAPS_INTEL_PCH \
|
||||
(AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME)
|
||||
/* PCH up to IVB; bound with i915 audio component for HDMI, no runtime PM */
|
||||
#define AZX_DCAPS_INTEL_PCH_NOPM \
|
||||
(AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_I915_POWERWELL)
|
||||
|
||||
/* PCH for HSW/BDW; with runtime PM, but no i915 binding */
|
||||
#define AZX_DCAPS_INTEL_PCH \
|
||||
(AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME)
|
||||
|
||||
/* HSW HDMI */
|
||||
#define AZX_DCAPS_INTEL_HASWELL \
|
||||
(/*AZX_DCAPS_ALIGN_BUFSIZE |*/ AZX_DCAPS_COUNT_LPIB_DELAY |\
|
||||
AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_POWERWELL |\
|
||||
@ -2146,10 +2152,10 @@ static const struct pci_device_id azx_ids[] = {
|
||||
.driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
|
||||
/* Poulsbo */
|
||||
{ PCI_DEVICE(0x8086, 0x811b),
|
||||
.driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
|
||||
.driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_BASE },
|
||||
/* Oaktrail */
|
||||
{ PCI_DEVICE(0x8086, 0x080a),
|
||||
.driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
|
||||
.driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_BASE },
|
||||
/* BayTrail */
|
||||
{ PCI_DEVICE(0x8086, 0x0f04),
|
||||
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BAYTRAIL },
|
||||
|
@ -152,6 +152,8 @@ struct hdmi_spec {
|
||||
struct i915_audio_component_audio_ops i915_audio_ops;
|
||||
};
|
||||
|
||||
#define codec_has_acomp(codec) \
|
||||
((codec)->bus->core.audio_component != NULL)
|
||||
|
||||
struct hdmi_audio_infoframe {
|
||||
u8 type; /* 0x84 */
|
||||
@ -2218,7 +2220,7 @@ static void generic_hdmi_free(struct hda_codec *codec)
|
||||
struct hdmi_spec *spec = codec->spec;
|
||||
int pin_idx;
|
||||
|
||||
if (is_haswell_plus(codec) || is_valleyview_plus(codec))
|
||||
if (codec_has_acomp(codec))
|
||||
snd_hdac_i915_register_notifier(NULL);
|
||||
|
||||
for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
|
||||
@ -2390,7 +2392,7 @@ static int patch_generic_hdmi(struct hda_codec *codec)
|
||||
is_broxton(codec))
|
||||
codec->core.link_power_control = 1;
|
||||
|
||||
if (is_haswell_plus(codec) || is_valleyview_plus(codec)) {
|
||||
if (codec_has_acomp(codec)) {
|
||||
codec->depop_delay = 0;
|
||||
spec->i915_audio_ops.audio_ptr = codec;
|
||||
spec->i915_audio_ops.pin_eld_notify = intel_pin_eld_notify;
|
||||
|
Loading…
Reference in New Issue
Block a user