ALSA: hda - Fix broken workaround for HDMI/SPDIF conflicts
authorTakashi Iwai <tiwai@suse.de>
Tue, 12 Feb 2013 16:02:41 +0000 (17:02 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 12 Feb 2013 16:09:19 +0000 (17:09 +0100)
commitea9b43addc4d90ca5b029f47f85ca152320a1e8d
tree58c8b75cd440b48d71acea7cafc9e6e8689f9aa1
parent9958922a320d6ee9e9f96b30110bc3765b3e8299
ALSA: hda - Fix broken workaround for HDMI/SPDIF conflicts

The commit [dcda58061: ALSA: hda - Add workaround for conflicting
IEC958 controls] introduced a workaround for cards that have both
SPDIF and HDMI devices for giving device=1 to SPDIF control elements.
It turned out, however, that this workaround doesn't work well -

- The workaround checks only conflicts in a single codec, but SPDIF
  and HDMI are provided by multiple codecs in many cases, and

- ALSA mixer abstraction doesn't care about the device number in ctl
  elements, thus you'll get errors from amixer such as
  % amixer scontrols -c 0
  ALSA lib simple_none.c:1551:(simple_add1) helem (MIXER,'IEC958
  Playback Switch',0,1,0) appears twice or more
  amixer: Mixer hw:0 load error: Invalid argument

This patch fixes the previous broken workaround.  Instead of changing
the device number of SPDIF ctl elements, shift the element indices of
such controls up to 16.  Also, the conflict check is performed over
all codecs found on the bus.

HDMI devices will be put to dev=0,index=0 as before.  Only the
conflicting SPDIF device is moved to a different place.  The new place
of SPDIF device is supposed by the updated alsa-lib HDA-Intel.conf,
respectively.

Reported-by: Stephan Raue <stephan@openelec.tv>
Reported-by: Anssi Hannula <anssi.hannula@iki.fi>
Cc: <stable@vger.kernel.org> [v3.8]
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h