mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-15 08:44:14 +08:00
[ALSA] Add a new quirk for mute-LED and HP-only.
Modules: AC97 Codec,ATIIXP driver,Intel8x0 driver This patch adds a new quirk for ac97 hardware that combines the existing AC97_TUNE_MUTE_LED and AC97_TUNE_HP_ONLY quirks. This is needed for several current HP laptops. Additionally, it adds the HP nx6125 to the AC97_TUNE_MUTE_LED list. Fixed for the latest version of ALSA by Takashi Iwai <tiwai@suse.de>. Signed-off-by: Matthew Garrett <mjg59@srcf.ucam.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
e12229b4d2
commit
a0faefedf7
@ -541,6 +541,7 @@ enum {
|
||||
AC97_TUNE_ALC_JACK, /* for Realtek, enable JACK detection */
|
||||
AC97_TUNE_INV_EAPD, /* inverted EAPD implementation */
|
||||
AC97_TUNE_MUTE_LED, /* EAPD bit works as mute LED */
|
||||
AC97_TUNE_HP_MUTE_LED, /* EAPD bit works as mute LED, use headphone control as master */
|
||||
};
|
||||
|
||||
struct ac97_quirk {
|
||||
|
@ -2457,6 +2457,41 @@ static int tune_mute_led(struct snd_ac97 *ac97)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hp_master_mute_sw_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
int err = bind_hp_volsw_put(kcontrol, ucontrol);
|
||||
if (err > 0) {
|
||||
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
|
||||
int shift = (kcontrol->private_value >> 8) & 0x0f;
|
||||
int rshift = (kcontrol->private_value >> 12) & 0x0f;
|
||||
unsigned short mask;
|
||||
if (shift != rshift)
|
||||
mask = 0x8080;
|
||||
else
|
||||
mask = 0x8000;
|
||||
snd_ac97_update_bits(ac97, AC97_POWERDOWN, 0x8000,
|
||||
(ac97->regs[AC97_MASTER] & mask) == mask ?
|
||||
0x8000 : 0);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static int tune_hp_mute_led(struct snd_ac97 *ac97)
|
||||
{
|
||||
struct snd_kcontrol *msw = ctl_find(ac97, "Master Playback Switch", NULL);
|
||||
struct snd_kcontrol *mvol = ctl_find(ac97, "Master Playback Volume", NULL);
|
||||
if (! msw || ! mvol)
|
||||
return -ENOENT;
|
||||
msw->put = hp_master_mute_sw_put;
|
||||
mvol->put = bind_hp_volsw_put;
|
||||
snd_ac97_remove_ctl(ac97, "External Amplifier", NULL);
|
||||
snd_ac97_remove_ctl(ac97, "Headphone Playback", "Switch");
|
||||
snd_ac97_remove_ctl(ac97, "Headphone Playback", "Volume");
|
||||
snd_ac97_update_bits(ac97, AC97_POWERDOWN, 0x8000, 0x8000); /* mute LED on */
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct quirk_table {
|
||||
const char *name;
|
||||
int (*func)(struct snd_ac97 *);
|
||||
@ -2471,6 +2506,7 @@ static struct quirk_table applicable_quirks[] = {
|
||||
{ "alc_jack", tune_alc_jack },
|
||||
{ "inv_eapd", tune_inv_eapd },
|
||||
{ "mute_led", tune_mute_led },
|
||||
{ "hp_mute_led", tune_hp_mute_led },
|
||||
};
|
||||
|
||||
/* apply the quirk with the given type */
|
||||
|
@ -1353,6 +1353,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
|
||||
.name = "HP Pavilion ZV5030US",
|
||||
.type = AC97_TUNE_MUTE_LED
|
||||
},
|
||||
{
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x308b,
|
||||
.name = "HP nx6125",
|
||||
.type = AC97_TUNE_MUTE_LED
|
||||
},
|
||||
{ } /* terminator */
|
||||
};
|
||||
|
||||
|
@ -1857,6 +1857,30 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
|
||||
.name = "HP xw8000",
|
||||
.type = AC97_TUNE_HP_ONLY
|
||||
},
|
||||
{
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x0938,
|
||||
.name = "HP nc4200",
|
||||
.type = AC97_TUNE_HP_MUTE_LED
|
||||
},
|
||||
{
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x099c,
|
||||
.name = "HP nc6120",
|
||||
.type = AC97_TUNE_HP_MUTE_LED
|
||||
},
|
||||
{
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x0944,
|
||||
.name = "HP nc6220",
|
||||
.type = AC97_TUNE_HP_MUTE_LED
|
||||
},
|
||||
{
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x0934,
|
||||
.name = "HP nc8220",
|
||||
.type = AC97_TUNE_HP_MUTE_LED
|
||||
},
|
||||
{
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x12f1,
|
||||
|
Loading…
Reference in New Issue
Block a user