Commit 87cf815b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-fix-4.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "The previous pull request introduced a few WARN_ON() for Intel
  HD-audio HDMI.  Indeed it caught bugs, and now users get annoyed.  So
  this request came up: a collection of small fixes to paper over the
  inconsistencies on (mostly) old Intel chipsets.

  In addition, a trivial USB-audio quirk is included, too"

* tag 'sound-fix-4.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: hda - Fix missing ELD update at unplugging
  ALSA: usb-audio: add Microsoft HD-5001 to quirks
  ALSA: hda - Workaround for unbalanced i915 power refcount by concurrent probe
  ALSA: hda - Fix spurious kernel WARNING on Baytrail HDMI
  ALSA: hda - Fix forgotten HDMI monitor_present update
  ALSA: hda - Really restrict i915 notifier to HSW+
parents b4af7f77 c64c1437
...@@ -152,6 +152,7 @@ struct hdmi_spec { ...@@ -152,6 +152,7 @@ struct hdmi_spec {
struct hda_pcm_stream pcm_playback; struct hda_pcm_stream pcm_playback;
/* i915/powerwell (Haswell+/Valleyview+) specific */ /* i915/powerwell (Haswell+/Valleyview+) specific */
bool use_acomp_notifier; /* use i915 eld_notify callback for hotplug */
struct i915_audio_component_audio_ops i915_audio_ops; struct i915_audio_component_audio_ops i915_audio_ops;
bool i915_bound; /* was i915 bound in this driver? */ bool i915_bound; /* was i915 bound in this driver? */
...@@ -159,8 +160,11 @@ struct hdmi_spec { ...@@ -159,8 +160,11 @@ struct hdmi_spec {
}; };
#ifdef CONFIG_SND_HDA_I915 #ifdef CONFIG_SND_HDA_I915
#define codec_has_acomp(codec) \ static inline bool codec_has_acomp(struct hda_codec *codec)
((codec)->bus->core.audio_component != NULL) {
struct hdmi_spec *spec = codec->spec;
return spec->use_acomp_notifier;
}
#else #else
#define codec_has_acomp(codec) false #define codec_has_acomp(codec) false
#endif #endif
...@@ -1354,6 +1358,7 @@ static void update_eld(struct hda_codec *codec, ...@@ -1354,6 +1358,7 @@ static void update_eld(struct hda_codec *codec,
eld->eld_size) != 0) eld->eld_size) != 0)
eld_changed = true; eld_changed = true;
pin_eld->monitor_present = eld->monitor_present;
pin_eld->eld_valid = eld->eld_valid; pin_eld->eld_valid = eld->eld_valid;
pin_eld->eld_size = eld->eld_size; pin_eld->eld_size = eld->eld_size;
if (eld->eld_valid) if (eld->eld_valid)
...@@ -1479,11 +1484,10 @@ static void sync_eld_via_acomp(struct hda_codec *codec, ...@@ -1479,11 +1484,10 @@ static void sync_eld_via_acomp(struct hda_codec *codec,
int size; int size;
mutex_lock(&per_pin->lock); mutex_lock(&per_pin->lock);
eld->monitor_present = false;
size = snd_hdac_acomp_get_eld(&codec->bus->core, per_pin->pin_nid, size = snd_hdac_acomp_get_eld(&codec->bus->core, per_pin->pin_nid,
&eld->monitor_present, eld->eld_buffer, &eld->monitor_present, eld->eld_buffer,
ELD_MAX_SIZE); ELD_MAX_SIZE);
if (size < 0)
goto unlock;
if (size > 0) { if (size > 0) {
size = min(size, ELD_MAX_SIZE); size = min(size, ELD_MAX_SIZE);
if (snd_hdmi_parse_eld(codec, &eld->info, if (snd_hdmi_parse_eld(codec, &eld->info,
...@@ -1736,7 +1740,8 @@ static int generic_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, ...@@ -1736,7 +1740,8 @@ static int generic_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
/* Call sync_audio_rate to set the N/CTS/M manually if necessary */ /* Call sync_audio_rate to set the N/CTS/M manually if necessary */
/* Todo: add DP1.2 MST audio support later */ /* Todo: add DP1.2 MST audio support later */
snd_hdac_sync_audio_rate(&codec->bus->core, pin_nid, runtime->rate); if (codec_has_acomp(codec))
snd_hdac_sync_audio_rate(&codec->bus->core, pin_nid, runtime->rate);
non_pcm = check_non_pcm_per_cvt(codec, cvt_nid); non_pcm = check_non_pcm_per_cvt(codec, cvt_nid);
mutex_lock(&per_pin->lock); mutex_lock(&per_pin->lock);
...@@ -2248,12 +2253,24 @@ static int patch_generic_hdmi(struct hda_codec *codec) ...@@ -2248,12 +2253,24 @@ static int patch_generic_hdmi(struct hda_codec *codec)
codec->spec = spec; codec->spec = spec;
hdmi_array_init(spec, 4); hdmi_array_init(spec, 4);
#ifdef CONFIG_SND_HDA_I915
/* Try to bind with i915 for Intel HSW+ codecs (if not done yet) */ /* Try to bind with i915 for Intel HSW+ codecs (if not done yet) */
if (!codec_has_acomp(codec) && if ((codec->core.vendor_id >> 16) == 0x8086 &&
(codec->core.vendor_id >> 16) == 0x8086 && is_haswell_plus(codec)) {
is_haswell_plus(codec)) #if 0
if (!snd_hdac_i915_init(&codec->bus->core)) /* on-demand binding leads to an unbalanced refcount when
spec->i915_bound = true; * both i915 and hda drivers are probed concurrently;
* disabled temporarily for now
*/
if (!codec->bus->core.audio_component)
if (!snd_hdac_i915_init(&codec->bus->core))
spec->i915_bound = true;
#endif
/* use i915 audio component notifier for hotplug */
if (codec->bus->core.audio_component)
spec->use_acomp_notifier = true;
}
#endif
if (is_haswell_plus(codec)) { if (is_haswell_plus(codec)) {
intel_haswell_enable_all_pins(codec, true); intel_haswell_enable_all_pins(codec, true);
......
...@@ -1126,6 +1126,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) ...@@ -1126,6 +1126,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)
switch (chip->usb_id) { switch (chip->usb_id) {
case USB_ID(0x045E, 0x075D): /* MS Lifecam Cinema */ case USB_ID(0x045E, 0x075D): /* MS Lifecam Cinema */
case USB_ID(0x045E, 0x076D): /* MS Lifecam HD-5000 */ case USB_ID(0x045E, 0x076D): /* MS Lifecam HD-5000 */
case USB_ID(0x045E, 0x076E): /* MS Lifecam HD-5001 */
case USB_ID(0x045E, 0x076F): /* MS Lifecam HD-6000 */ case USB_ID(0x045E, 0x076F): /* MS Lifecam HD-6000 */
case USB_ID(0x045E, 0x0772): /* MS Lifecam Studio */ case USB_ID(0x045E, 0x0772): /* MS Lifecam Studio */
case USB_ID(0x045E, 0x0779): /* MS Lifecam HD-3000 */ case USB_ID(0x045E, 0x0779): /* MS Lifecam HD-3000 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment