Commit 2fb930b53f513cbc4c102d415d2923a8a7091337
Committed by
Takashi Iwai
1 parent
08d1e63508
Exists in
master
and in
4 other branches
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>
Showing 1 changed file with 18 additions and 9 deletions Side-by-side Diff
sound/pci/via82xx.c
... | ... | @@ -1626,7 +1626,7 @@ |
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,7 +1646,7 @@ |
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; |
1653 | 1653 | |
... | ... | @@ -1705,11 +1705,12 @@ |
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, |
... | ... | @@ -1936,10 +1937,18 @@ |
1936 | 1937 | } |
1937 | 1938 | else /* Using DXS when PCM emulation is enabled is really weird */ |
1938 | 1939 | { |
1939 | - /* Standalone DXS controls */ | |
1940 | - err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip)); | |
1941 | - if (err < 0) | |
1942 | - return err; | |
1940 | + for (i = 0; i < 4; ++i) { | |
1941 | + struct snd_kcontrol *kctl; | |
1942 | + | |
1943 | + kctl = snd_ctl_new1( | |
1944 | + &snd_via8233_dxs_volume_control, chip); | |
1945 | + if (!kctl) | |
1946 | + return -ENOMEM; | |
1947 | + kctl->id.subdevice = i; | |
1948 | + err = snd_ctl_add(chip->card, kctl); | |
1949 | + if (err < 0) | |
1950 | + return err; | |
1951 | + } | |
1943 | 1952 | } |
1944 | 1953 | } |
1945 | 1954 | /* select spdif data slot 10/11 */ |