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

[ALSA] ice1724 - Add PCM Playback Switch to Revo 7.1

This patch adds the support of mute for front channels of M-Audio
Revolution 7.1 (the DAC AK4381 features a mute bit).

Signed-off-by: Pavel Hofman <dustin@seznam.cz>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>

authored by

Pavel Hofman and committed by
Jaroslav Kysela
ea7cfcdf 95904743

+29 -3
+1
include/sound/ak4xxx-adda.h
··· 43 43 struct snd_akm4xxx_dac_channel { 44 44 char *name; /* mixer volume name */ 45 45 unsigned int num_channels; 46 + char *switch_name; /* mixer switch*/ 46 47 }; 47 48 48 49 /* ADC labels and channels */
+22 -2
sound/i2c/other/ak4xxx-adda.c
··· 481 481 int addr = AK_GET_ADDR(kcontrol->private_value); 482 482 int shift = AK_GET_SHIFT(kcontrol->private_value); 483 483 int invert = AK_GET_INVERT(kcontrol->private_value); 484 - unsigned char val = snd_akm4xxx_get(ak, chip, addr); 485 - 484 + /* we observe the (1<<shift) bit only */ 485 + unsigned char val = snd_akm4xxx_get(ak, chip, addr) & (1<<shift); 486 486 if (invert) 487 487 val = ! val; 488 488 ucontrol->value.integer.value[0] = (val & (1<<shift)) != 0; ··· 585 585 586 586 mixer_ch = 0; 587 587 for (idx = 0; idx < ak->num_dacs; ) { 588 + /* mute control for Revolution 7.1 - AK4381 */ 589 + if (ak->type == SND_AK4381 590 + && ak->dac_info[mixer_ch].switch_name) { 591 + memset(&knew, 0, sizeof(knew)); 592 + knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 593 + knew.count = 1; 594 + knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; 595 + knew.name = ak->dac_info[mixer_ch].switch_name; 596 + knew.info = ak4xxx_switch_info; 597 + knew.get = ak4xxx_switch_get; 598 + knew.put = ak4xxx_switch_put; 599 + knew.access = 0; 600 + /* register 1, bit 0 (SMUTE): 0 = normal operation, 601 + 1 = mute */ 602 + knew.private_value = 603 + AK_COMPOSE(idx/2, 1, 0, 0) | AK_INVERT; 604 + err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak)); 605 + if (err < 0) 606 + return err; 607 + } 588 608 memset(&knew, 0, sizeof(knew)); 589 609 if (! ak->dac_info || ! ak->dac_info[mixer_ch].name) { 590 610 knew.name = "DAC Volume";
+6 -1
sound/pci/ice1712/revo.c
··· 186 186 #define AK_DAC(xname,xch) { .name = xname, .num_channels = xch } 187 187 188 188 static const struct snd_akm4xxx_dac_channel revo71_front[] = { 189 - AK_DAC("PCM Playback Volume", 2) 189 + { 190 + .name = "PCM Playback Volume", 191 + .num_channels = 2, 192 + /* front channels DAC supports muting */ 193 + .switch_name = "PCM Playback Switch", 194 + }, 190 195 }; 191 196 192 197 static const struct snd_akm4xxx_dac_channel revo71_surround[] = {