summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound
diff options
context:
space:
mode:
authorariff <ariff@FreeBSD.org>2006-10-12 15:37:43 +0000
committerariff <ariff@FreeBSD.org>2006-10-12 15:37:43 +0000
commit48bb5fd39c8684c485949e32acf297a8636168ac (patch)
tree258d79f929b42b66148766d613ba87ca6ab04aa7 /sys/dev/sound
parentf3ea6df16865410d83b71c27fc94abd756f064b0 (diff)
downloadFreeBSD-src-48bb5fd39c8684c485949e32acf297a8636168ac.zip
FreeBSD-src-48bb5fd39c8684c485949e32acf297a8636168ac.tar.gz
- Fix support for ASUS U5F laptop. This laptop (and possibly others)
need a special inverted EAPD quirk. - Add "eapdinv" config for future testing purposes. Tested by: Yuriy Tsibizov <Yuriy.Tsibizov@gfk.ru> #freebsd-azalia @ irc.freenode.net
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/pci/hda/hdac.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
index 9837243..cee0d75 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 "20061009_0031"
+#define HDA_DRV_TEST_REV "20061013_0032"
#define HDA_WIDGET_PARSER_REV 1
SND_DECLARE_FILE("$FreeBSD$");
@@ -188,6 +188,7 @@ SND_DECLARE_FILE("$FreeBSD$");
/* Asus */
#define ASUS_VENDORID 0x1043
#define ASUS_M5200_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1993)
+#define ASUS_U5F_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1263)
#define ASUS_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0xffff)
/* IBM / Lenovo */
@@ -222,6 +223,7 @@ SND_DECLARE_FILE("$FreeBSD$");
#define HDA_QUIRK_SOFTPCMVOL (1 << 15)
#define HDA_QUIRK_FIXEDRATE (1 << 16)
#define HDA_QUIRK_FORCESTEREO (1 << 17)
+#define HDA_QUIRK_EAPDINV (1 << 18)
static const struct {
char *key;
@@ -233,6 +235,7 @@ static const struct {
{ "softpcmvol", HDA_QUIRK_SOFTPCMVOL },
{ "fixedrate", HDA_QUIRK_FIXEDRATE },
{ "forcestereo", HDA_QUIRK_FORCESTEREO },
+ { "eapdinv", HDA_QUIRK_EAPDINV },
};
#define HDAC_QUIRKS_TAB_LEN \
(sizeof(hdac_quirks_tab) / sizeof(hdac_quirks_tab[0]))
@@ -2686,6 +2689,7 @@ 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);
@@ -2709,7 +2713,10 @@ hdac_audio_ctl_ossmixer_set(struct snd_mixer *m, unsigned dev,
return (-1);
}
orig = w->param.eapdbtl;
- if (left == 0)
+ set = (left != 0) ? 1 : 0;
+ if (devinfo->function.audio.quirks & HDA_QUIRK_EAPDINV)
+ set ^= 1;
+ if (set == 0)
w->param.eapdbtl &= ~HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
else
w->param.eapdbtl |= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
@@ -3231,6 +3238,8 @@ static const struct {
HDA_QUIRK_GPIO1, 0 },
{ ASUS_M5200_SUBVENDOR, HDA_CODEC_ALC880,
HDA_QUIRK_GPIO1, 0 },
+ { ASUS_U5F_SUBVENDOR, HDA_CODEC_AD1986A,
+ HDA_QUIRK_EAPDINV, 0 },
{ HDA_MATCH_ALL, HDA_CODEC_CXVENICE,
0, HDA_QUIRK_FORCESTEREO },
{ HDA_MATCH_ALL, HDA_CODEC_STACXXXX,
@@ -3912,11 +3921,22 @@ hdac_audio_commit(struct hdac_devinfo *devinfo, uint32_t cfl)
w->wclass.pin.ctrl), cad);
}
if ((cfl & HDA_COMMIT_EAPD) &&
- w->param.eapdbtl != HDAC_INVALID)
+ w->param.eapdbtl != HDAC_INVALID) {
+ 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;
+ }
hdac_command(sc,
HDA_CMD_SET_EAPD_BTL_ENABLE(cad, w->nid,
w->param.eapdbtl), cad);
+ }
DELAY(1000);
}
}
OpenPOWER on IntegriCloud