|
@@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
|
{
|
|
|
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[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 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 char val;
|
|
|
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 = {
|
|
|
- .name = "VIA DXS Playback Volume",
|
|
|
- .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
|
+ .iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
|
|
+ .device = 0,
|
|
|
+ /* .subdevice set later */
|
|
|
+ .name = "PCM Playback Volume",
|
|
|
.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
|
|
|
SNDRV_CTL_ELEM_ACCESS_TLV_READ),
|
|
|
- .count = 4,
|
|
|
.info = snd_via8233_dxs_volume_info,
|
|
|
.get = snd_via8233_dxs_volume_get,
|
|
|
.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 */
|
|
|
{
|
|
|
- /* Standalone DXS controls */
|
|
|
- err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip));
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
+ for (i = 0; i < 4; ++i) {
|
|
|
+ struct snd_kcontrol *kctl;
|
|
|
+
|
|
|
+ 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 */
|