[alsa-devel] ALC882 on Abit AW9D-MAX
Dan Aloni
da-x at monatomic.org
Thu Apr 12 23:11:41 CEST 2007
On Thu, Apr 12, 2007 at 02:34:49PM +0200, Takashi Iwai wrote:
> At Thu, 12 Apr 2007 13:09:59 +0300,
> Dan Aloni wrote:
> >
> > Hello,
> >
> > Yesterday I posted this bug in the bugtracker:
> >
> > https://bugtrack.alsa-project.org/alsa-bug/view.php?id=3013
> >
> > I have received no reponse yet.
> >
> > I'd like to cooperate on solving this.
>
> Most of such problems are caused by buggy BIOS, as the driver tries
> to set up based on BIOS information if the device is unknown.
>
> Did you try to pass model options for ALC882?
> For example, model=3stack or model=6stack.
> Also, position_fix option is worth try to fix some playback problems.
Okay, so based on the 2.6.21-rc6 codebase:
position_fix=1 fixed the clicks.
Concerning the speakers - I have found that if I swap the orange
and black - it works.
Of course, it wouldn't be right to swap them out physically (i.e.
black connects to orange socket and orange to black socket), so I
made a patch for it.
BTW, I have double-checked that everything is wired correctly in
my 5.1 system (i.e, Front = Green jack, Rear = Black jack, Center
and LFE = Orange jack).
NOTE: This patch is *UGLY*. I don't expect you to commit it, but
it provides some info on how to detect my board. You guys properly
have a better idea on how to implement it.
Signed-off-by: Dan Aloni <da-x at monatomic.org>
diff --git a/hda_intel.c b/hda_intel.c
index 1672cac..0566147 100644
--- a/hda_intel.c
+++ b/hda_intel.c
@@ -1520,6 +1520,7 @@ static int azx_dev_free(struct snd_device *device)
*/
static const struct snd_pci_quirk position_fix_list[] __devinitdata = {
SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_NONE),
+ SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", POS_FIX_POSBUF),
{}
};
diff --git a/patch_realtek.c b/patch_realtek.c
index fba3cb1..4b09c61 100644
--- a/patch_realtek.c
+++ b/patch_realtek.c
@@ -123,6 +123,7 @@ enum {
enum {
ALC882_3ST_DIG,
ALC882_6ST_DIG,
+ ALC882_ABIT,
ALC882_ARIMA,
ALC882_AUTO,
ALC885_MACPRO,
@@ -3007,7 +3008,7 @@ static void alc880_auto_init_analog_input(struct hda_codec *codec)
/* parse the BIOS configuration and set up the alc_spec */
/* return 1 if successful, 0 if the proper config is not found, or a negative error code */
-static int alc880_parse_auto_config(struct hda_codec *codec)
+static int alc880_parse_auto_config(struct hda_codec *codec, int abit)
{
struct alc_spec *spec = codec->spec;
int err;
@@ -3016,6 +3017,14 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
alc880_ignore)) < 0)
return err;
+
+ if (abit) {
+ struct auto_pin_cfg *cfg = &spec->autocfg;
+ hda_nid_t nid = cfg->line_out_pins[1];
+ cfg->line_out_pins[1] = cfg->line_out_pins[2];
+ cfg->line_out_pins[2] = nid;
+ }
+
if (! spec->autocfg.line_outs)
return 0; /* can't find valid BIOS pin config */
@@ -3082,7 +3091,7 @@ static int patch_alc880(struct hda_codec *codec)
if (board_config == ALC880_AUTO) {
/* automatic parse from the BIOS config */
- err = alc880_parse_auto_config(codec);
+ err = alc880_parse_auto_config(codec, 0);
if (err < 0) {
alc_free(codec);
return err;
@@ -4781,6 +4790,7 @@ static struct snd_kcontrol_new alc882_capture_mixer[] = {
static const char *alc882_models[ALC882_MODEL_LAST] = {
[ALC882_3ST_DIG] = "3stack-dig",
[ALC882_6ST_DIG] = "6stack-dig",
+ [ALC882_ABIT] = "abit",
[ALC882_ARIMA] = "arima",
[ALC885_MACPRO] = "macpro",
[ALC882_AUTO] = "auto",
@@ -4792,6 +4802,7 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = {
SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA),
SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
+ SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_ABIT),
{}
};
@@ -4907,10 +4918,10 @@ static void alc882_auto_init_analog_input(struct hda_codec *codec)
}
/* almost identical with ALC880 parser... */
-static int alc882_parse_auto_config(struct hda_codec *codec)
+static int alc882_parse_auto_config(struct hda_codec *codec, int abit)
{
struct alc_spec *spec = codec->spec;
- int err = alc880_parse_auto_config(codec);
+ int err = alc880_parse_auto_config(codec, abit);
if (err < 0)
return err;
@@ -4932,6 +4943,7 @@ static int patch_alc882(struct hda_codec *codec)
{
struct alc_spec *spec;
int err, board_config;
+ int abit = 0;
spec = kzalloc(sizeof(*spec), GFP_KERNEL);
if (spec == NULL)
@@ -4956,9 +4968,14 @@ static int patch_alc882(struct hda_codec *codec)
}
}
+ if (board_config == ALC882_ABIT) {
+ abit = 1;
+ board_config = ALC882_AUTO;
+ }
+
if (board_config == ALC882_AUTO) {
/* automatic parse from the BIOS config */
- err = alc882_parse_auto_config(codec);
+ err = alc882_parse_auto_config(codec, abit);
if (err < 0) {
alc_free(codec);
return err;
@@ -5826,7 +5843,7 @@ static void alc883_auto_init_analog_input(struct hda_codec *codec)
static int alc883_parse_auto_config(struct hda_codec *codec)
{
struct alc_spec *spec = codec->spec;
- int err = alc880_parse_auto_config(codec);
+ int err = alc880_parse_auto_config(codec, 0);
if (err < 0)
return err;
--
Dan Aloni
XIV LTD, http://www.xivstorage.com
da-x (at) monatomic.org, dan (at) xiv.co.il
More information about the Alsa-devel
mailing list