summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound
diff options
context:
space:
mode:
authorariff <ariff@FreeBSD.org>2006-10-16 14:43:22 +0000
committerariff <ariff@FreeBSD.org>2006-10-16 14:43:22 +0000
commitf134f02fc227922bbc4e7f3ec8d1951a4691bdb9 (patch)
tree25b970c0997d4e38d965e6b3d089ec90995afffe /sys/dev/sound
parenta58f62cb8322338088db8ec438e3ab536661af0b (diff)
downloadFreeBSD-src-f134f02fc227922bbc4e7f3ec8d1951a4691bdb9.zip
FreeBSD-src-f134f02fc227922bbc4e7f3ec8d1951a4691bdb9.tar.gz
- Inverted EAPD quirk for ASUS A8Jc.
- Take the literal meaning of eapdbtl, but do the inversion during write. Tested by: Chung-liang Wei <idreamer@gmail.com>
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/pci/hda/hdac.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
index cee0d75..0889e4d 100644
--- a/sys/dev/sound/pci/hda/hdac.c
+++ b/sys/dev/sound/pci/hda/hdac.c
@@ -80,7 +80,7 @@
#include "mixer_if.h"
-#define HDA_DRV_TEST_REV "20061013_0032"
+#define HDA_DRV_TEST_REV "20061017_0033"
#define HDA_WIDGET_PARSER_REV 1
SND_DECLARE_FILE("$FreeBSD$");
@@ -189,6 +189,7 @@ SND_DECLARE_FILE("$FreeBSD$");
#define ASUS_VENDORID 0x1043
#define ASUS_M5200_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1993)
#define ASUS_U5F_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1263)
+#define ASUS_A8JC_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1153)
#define ASUS_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0xffff)
/* IBM / Lenovo */
@@ -2689,7 +2690,6 @@ hdac_audio_ctl_ossmixer_set(struct snd_mixer *m, unsigned dev,
hdac_lock(sc);
if (dev == SOUND_MIXER_OGAIN) {
uint32_t orig;
- int set;
/*if (left != right || !(left == 0 || left == 1)) {
hdac_unlock(sc);
return (-1);
@@ -2713,19 +2713,21 @@ hdac_audio_ctl_ossmixer_set(struct snd_mixer *m, unsigned dev,
return (-1);
}
orig = w->param.eapdbtl;
- set = (left != 0) ? 1 : 0;
- if (devinfo->function.audio.quirks & HDA_QUIRK_EAPDINV)
- set ^= 1;
- if (set == 0)
+ if (left == 0)
w->param.eapdbtl &= ~HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
else
w->param.eapdbtl |= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
if (orig != w->param.eapdbtl) {
+ uint32_t val;
+
if (hdac_eapd_switch[i].hp_switch != 0)
hdac_hp_switch_handler(devinfo);
+ val = w->param.eapdbtl;
+ if (devinfo->function.audio.quirks & HDA_QUIRK_EAPDINV)
+ val ^= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
hdac_command(sc,
HDA_CMD_SET_EAPD_BTL_ENABLE(devinfo->codec->cad,
- w->nid, w->param.eapdbtl), devinfo->codec->cad);
+ w->nid, val), devinfo->codec->cad);
}
hdac_unlock(sc);
return (left | (left << 8));
@@ -3240,6 +3242,8 @@ static const struct {
HDA_QUIRK_GPIO1, 0 },
{ ASUS_U5F_SUBVENDOR, HDA_CODEC_AD1986A,
HDA_QUIRK_EAPDINV, 0 },
+ { ASUS_A8JC_SUBVENDOR, HDA_CODEC_AD1986A,
+ HDA_QUIRK_EAPDINV, 0 },
{ HDA_MATCH_ALL, HDA_CODEC_CXVENICE,
0, HDA_QUIRK_FORCESTEREO },
{ HDA_MATCH_ALL, HDA_CODEC_STACXXXX,
@@ -3922,19 +3926,15 @@ hdac_audio_commit(struct hdac_devinfo *devinfo, uint32_t cfl)
}
if ((cfl & HDA_COMMIT_EAPD) &&
w->param.eapdbtl != HDAC_INVALID) {
+ uint32_t val;
+
+ val = w->param.eapdbtl;
if (devinfo->function.audio.quirks &
- HDA_QUIRK_EAPDINV) {
- if (w->param.eapdbtl &
- HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD)
- w->param.eapdbtl &=
- ~HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
- else
- w->param.eapdbtl |=
- HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
- }
+ HDA_QUIRK_EAPDINV)
+ val ^= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
hdac_command(sc,
HDA_CMD_SET_EAPD_BTL_ENABLE(cad, w->nid,
- w->param.eapdbtl), cad);
+ val), cad);
}
DELAY(1000);
OpenPOWER on IntegriCloud