Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sound: via82xx: move DXS volume controls to PCM interface

The "VIA DXS" controls are actually volume controls that apply to the
four PCM substreams, so we better indicate this connection by moving the
controls to the PCM interface.

Commit b452e08e73c0e3dbb0be82130217be4b7084299e in 2.6.30 broke the
restoring of these volumes by "alsactl restore" that most distributions
use; the renaming in this patch cures that regression by preventing
alsactl from applying the old, wrong volume levels to the new controls.
http://bugzilla.kernel.org/show_bug.cgi?id=14151
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=532613

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Cc: <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

authored by

Clemens Ladisch and committed by
Takashi Iwai
2fb930b5 08d1e635

+18 -9
+18 -9
sound/pci/via82xx.c
··· 1626 1626 struct snd_ctl_elem_value *ucontrol) 1627 1627 { 1628 1628 struct via82xx *chip = snd_kcontrol_chip(kcontrol); 1629 - unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); 1629 + unsigned int idx = kcontrol->id.subdevice; 1630 1630 1631 1631 ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; 1632 1632 ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; ··· 1646 1646 struct snd_ctl_elem_value *ucontrol) 1647 1647 { 1648 1648 struct via82xx *chip = snd_kcontrol_chip(kcontrol); 1649 - unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); 1649 + unsigned int idx = kcontrol->id.subdevice; 1650 1650 unsigned long port = chip->port + 0x10 * idx; 1651 1651 unsigned char val; 1652 1652 int i, change = 0; ··· 1705 1705 }; 1706 1706 1707 1707 static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { 1708 - .name = "VIA DXS Playback Volume", 1709 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1708 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1709 + .device = 0, 1710 + /* .subdevice set later */ 1711 + .name = "PCM Playback Volume", 1710 1712 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | 1711 1713 SNDRV_CTL_ELEM_ACCESS_TLV_READ), 1712 - .count = 4, 1713 1714 .info = snd_via8233_dxs_volume_info, 1714 1715 .get = snd_via8233_dxs_volume_get, 1715 1716 .put = snd_via8233_dxs_volume_put, ··· 1937 1936 } 1938 1937 else /* Using DXS when PCM emulation is enabled is really weird */ 1939 1938 { 1940 - /* Standalone DXS controls */ 1941 - err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip)); 1942 - if (err < 0) 1943 - return err; 1939 + for (i = 0; i < 4; ++i) { 1940 + struct snd_kcontrol *kctl; 1941 + 1942 + kctl = snd_ctl_new1( 1943 + &snd_via8233_dxs_volume_control, chip); 1944 + if (!kctl) 1945 + return -ENOMEM; 1946 + kctl->id.subdevice = i; 1947 + err = snd_ctl_add(chip->card, kctl); 1948 + if (err < 0) 1949 + return err; 1950 + } 1944 1951 } 1945 1952 } 1946 1953 /* select spdif data slot 10/11 */