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 b452e08e73
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>
This commit is contained in:
Родитель
08d1e63508
Коммит
2fb930b53f
|
@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_value *ucontrol)
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
{
|
{
|
||||||
struct via82xx *chip = snd_kcontrol_chip(kcontrol);
|
struct via82xx *chip = snd_kcontrol_chip(kcontrol);
|
||||||
unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
|
unsigned int idx = kcontrol->id.subdevice;
|
||||||
|
|
||||||
ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0];
|
ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0];
|
||||||
ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1];
|
ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1];
|
||||||
|
@ -1646,7 +1646,7 @@ static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_value *ucontrol)
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
{
|
{
|
||||||
struct via82xx *chip = snd_kcontrol_chip(kcontrol);
|
struct via82xx *chip = snd_kcontrol_chip(kcontrol);
|
||||||
unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
|
unsigned int idx = kcontrol->id.subdevice;
|
||||||
unsigned long port = chip->port + 0x10 * idx;
|
unsigned long port = chip->port + 0x10 * idx;
|
||||||
unsigned char val;
|
unsigned char val;
|
||||||
int i, change = 0;
|
int i, change = 0;
|
||||||
|
@ -1705,11 +1705,12 @@ static struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control __devinitdata =
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = {
|
static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = {
|
||||||
.name = "VIA DXS Playback Volume",
|
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
||||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
.device = 0,
|
||||||
|
/* .subdevice set later */
|
||||||
|
.name = "PCM Playback Volume",
|
||||||
.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
|
.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
|
||||||
SNDRV_CTL_ELEM_ACCESS_TLV_READ),
|
SNDRV_CTL_ELEM_ACCESS_TLV_READ),
|
||||||
.count = 4,
|
|
||||||
.info = snd_via8233_dxs_volume_info,
|
.info = snd_via8233_dxs_volume_info,
|
||||||
.get = snd_via8233_dxs_volume_get,
|
.get = snd_via8233_dxs_volume_get,
|
||||||
.put = snd_via8233_dxs_volume_put,
|
.put = snd_via8233_dxs_volume_put,
|
||||||
|
@ -1936,10 +1937,18 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip)
|
||||||
}
|
}
|
||||||
else /* Using DXS when PCM emulation is enabled is really weird */
|
else /* Using DXS when PCM emulation is enabled is really weird */
|
||||||
{
|
{
|
||||||
/* Standalone DXS controls */
|
for (i = 0; i < 4; ++i) {
|
||||||
err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip));
|
struct snd_kcontrol *kctl;
|
||||||
if (err < 0)
|
|
||||||
return err;
|
kctl = snd_ctl_new1(
|
||||||
|
&snd_via8233_dxs_volume_control, chip);
|
||||||
|
if (!kctl)
|
||||||
|
return -ENOMEM;
|
||||||
|
kctl->id.subdevice = i;
|
||||||
|
err = snd_ctl_add(chip->card, kctl);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* select spdif data slot 10/11 */
|
/* select spdif data slot 10/11 */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче