hw/ac97: Make a bunch of mixer registers read only
The Linux ac97 driver tries to see if optional things like video input volume control are available in 2 ways: 1) See if the mute bit is set after reset, if it is no further tests are done 2) If the mute bit is not set it does a write/read test of the mute bit This patch changes our ac97 to conform to what the Linux driver expects, it initializes registers for things which we don't emulate to 0 (so the mute bit is not set) and makes them read only. This causes Linux to now longer show the following (functionless) controls in alsamixer: Master Mono vol + mute 3d Control toggle PCM out pre / post 3d select Surround toggle CD vol + mute Mic vol + mute Mic boost toggle Mic mic1 / mic2 select Video vol + mute Phone vol + mute Beep mono vol + mute Aux vol + mute Mono "output mic" / "mix" select Sigmatel 4 speaker stereo toggle Sigmatel ADC 6Db att toggle Sigmatel DAC 6Db att toggle This patch was also tested with a Windows XP guest and there it also makes a number of functionless mixer controls go away. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: malc <av1474@comtv.ru>
This commit is contained in:
parent
a4e652ebc0
commit
d044be3714
34
hw/ac97.c
34
hw/ac97.c
@ -54,6 +54,8 @@ enum {
|
||||
AC97_6Ch_Vol_C_LFE_Mute = 0x36,
|
||||
AC97_6Ch_Vol_L_R_Surround_Mute = 0x38,
|
||||
AC97_Vendor_Reserved = 0x58,
|
||||
AC97_Sigmatel_Analog = 0x6c, /* We emulate a Sigmatel codec */
|
||||
AC97_Sigmatel_Dac2Invert = 0x6e, /* We emulate a Sigmatel codec */
|
||||
AC97_Vendor_ID1 = 0x7c,
|
||||
AC97_Vendor_ID2 = 0x7e
|
||||
};
|
||||
@ -503,14 +505,16 @@ static void mixer_reset (AC97LinkState *s)
|
||||
memset (s->mixer_data, 0, sizeof (s->mixer_data));
|
||||
memset (active, 0, sizeof (active));
|
||||
mixer_store (s, AC97_Reset , 0x0000); /* 6940 */
|
||||
mixer_store (s, AC97_Master_Volume_Mono_Mute , 0x8000);
|
||||
mixer_store (s, AC97_Headphone_Volume_Mute , 0x0000);
|
||||
mixer_store (s, AC97_Master_Volume_Mono_Mute , 0x0000);
|
||||
mixer_store (s, AC97_Master_Tone_RL, 0x0000);
|
||||
mixer_store (s, AC97_PC_BEEP_Volume_Mute , 0x0000);
|
||||
|
||||
mixer_store (s, AC97_Phone_Volume_Mute , 0x8008);
|
||||
mixer_store (s, AC97_Mic_Volume_Mute , 0x8008);
|
||||
mixer_store (s, AC97_CD_Volume_Mute , 0x8808);
|
||||
mixer_store (s, AC97_Aux_Volume_Mute , 0x8808);
|
||||
mixer_store (s, AC97_Record_Gain_Mic_Mute , 0x8000);
|
||||
mixer_store (s, AC97_Phone_Volume_Mute , 0x0000);
|
||||
mixer_store (s, AC97_Mic_Volume_Mute , 0x0000);
|
||||
mixer_store (s, AC97_CD_Volume_Mute , 0x0000);
|
||||
mixer_store (s, AC97_Video_Volume_Mute , 0x0000);
|
||||
mixer_store (s, AC97_Aux_Volume_Mute , 0x0000);
|
||||
mixer_store (s, AC97_Record_Gain_Mic_Mute , 0x0000);
|
||||
mixer_store (s, AC97_General_Purpose , 0x0000);
|
||||
mixer_store (s, AC97_3D_Control , 0x0000);
|
||||
mixer_store (s, AC97_Powerdown_Ctrl_Stat , 0x000f);
|
||||
@ -657,6 +661,22 @@ static void nam_writew (void *opaque, uint32_t addr, uint32_t val)
|
||||
val);
|
||||
}
|
||||
break;
|
||||
case AC97_Headphone_Volume_Mute:
|
||||
case AC97_Master_Volume_Mono_Mute:
|
||||
case AC97_Master_Tone_RL:
|
||||
case AC97_PC_BEEP_Volume_Mute:
|
||||
case AC97_Phone_Volume_Mute:
|
||||
case AC97_Mic_Volume_Mute:
|
||||
case AC97_CD_Volume_Mute:
|
||||
case AC97_Video_Volume_Mute:
|
||||
case AC97_Aux_Volume_Mute:
|
||||
case AC97_Record_Gain_Mic_Mute:
|
||||
case AC97_General_Purpose:
|
||||
case AC97_3D_Control:
|
||||
case AC97_Sigmatel_Analog:
|
||||
case AC97_Sigmatel_Dac2Invert:
|
||||
/* None of the features in these regs are emulated, so they are RO */
|
||||
break;
|
||||
default:
|
||||
dolog ("U nam writew %#x <- %#x\n", addr, val);
|
||||
mixer_store (s, index, val);
|
||||
|
Loading…
Reference in New Issue
Block a user