Jump to content

AppleHDA Solution - Work in progress


Taruga
 Share

4,108 posts in this topic

Recommended Posts

Hi

 

Glad I found this thread! I got my onboard ALC883 working from a Asus P5K SE mobo.

 

Cheers

Tim

 

 

Is everything working , like headphones ? digital output ? microphone ?

 

Because I have got Realtek ALC883 too and I got only speaker output working , thats it. I tried all installers from Taruga plus I have my own dump file I generated in my Linux.

 

I'd b appreciated If you tell us how did you get it working ?

Thanks.

Link to comment
Share on other sites

Hi all, i have no idea what im doing :(

 

I have a Lenovo 3000 n100 that i have installed iATKOS v1.0i on. everything seems to work perfectly with the exception of sound. And here is the kicker, i dont know the model number of my realtek card. From other forum posts i was under the assumption that i needed to run ad1986. I have, and while before i had no sound, it at least showed the volume slider, and in utilities -> audio midi setup there was an output detected. Now i got no sound and no volume slider, and no devices detected

 

How do i remove the ad1986, and get it working for me?

Link to comment
Share on other sites

From my post on acer thread -> http://forum.insanelymac.com/index.php?sho...mp;#entry585229

 

I've installed a iAtkos 1.0ir2 on my ACER Aspire 5920g

 

I got VGA Out Working (take a look on the upper url for the fix) on my 20" LCD display with a NVidia 8600M GT 256 but still no luck with audio drivers!

i've ICH8 with ALC888 on board: with original Azalia driver i got only stereo with internal speaker but NO mic-in and with AppleHDA 2.0 i got headphone and mic in work BUT NO internal speaker :D

 

HDAUDIO\FUNC_01&VEN_10EC&DEV_0888&SUBSYS_10250121&REV_1001\4&1FC02E00&0&0001

 

i attach to this repley my core_dump0.txt (on my kubuntu on codec#0)

 

Please help me!

core_dump0.txt

Link to comment
Share on other sites

Hi, all.

 

I've got 10.5.1 running on an ASUS G1 laptop, with an ALC660-VD. So far I've only managed to get Azalia to put sound out over the laptop speakers, but what I'd really like is headphone support, so I tried this one. I generated my own codec dump in Ubuntu and patched it with 1.20 with no success, is there anything I've been doing wrong, or any thoughts as to how I can fix this?

 

I've attached the codec dump to the post if that helps anyone

codecdumpALC660_vd.txt

Link to comment
Share on other sites

hi there ppl, i have a tough issue here.. on my a8jn laptop, i have output sound via the speakers..

 

id like to try one of your drivers, but i dont know what ALC xxx i have..

 

all windows says its an intel HD audio deviec, and im using soundmax drivers there..

 

any way how to figure this out?

 

(have tried everest, no success.)

Link to comment
Share on other sites

Is there a reason y I'm not able to have sound from my laptop ?

 

00:1b.0 Audio device [0403]: Intel Corporation 82801H (ICH8 Family) HD Audio Controller [8086:284b] (rev 03)

 

I never seen my controller in System Profiler, both using Azalia or HDA.

 

Codec: Realtek ALC660-VD

Address: 0

Vendor Id: 0x10ec0660

Subsystem Id: 0x10431339

Revision Id: 0x100001

 

HDA doesn't work, Azalia too after edit.... internal speakers are dead too.

Can someone explain please ?

Do you have an AC97 kext too ?

It should be patched ?

 

Help is really needed please.

 

Thanks, Max

Link to comment
Share on other sites

so far so good on with the alc262 beta! i have sound from my internal laptop speakers under normal settings and sound through my headphones when i plug them in! still no mic input though. i did notice that in my system preferences in the output tab i have internal speakers and headphones in there, when it's set to headphones i don't have any output! only works when it's on internal speakers. big ups to bronxboyXXX, i definently agree on the sound quality of alc262_f00.txt!

 

thanks again and am lookin forward to an update for the mic input sometime soon!

Link to comment
Share on other sites

I have a sigmatel 9220 and got the codec dump from another person (CS_Productions) who was so kind to create an archive with everything you need.

 

The already patch AppleHDA.kext is also included. But I dont have an idea what to do with it.

 

When I follow the instructions and start the AppleHDAPatcher 1.1.6 I have an icon in the OSX bar. I drag the textfile (in my case STAC9221D.TXT) onto the icon and nothing happens. An Apple HDA Device exists in the sound configuration. I am using iATKOS...

 

Missed I something? Can somebody explain me how to work with Apple HDA Patcher. Tried the 1.1.8 too with the same results...

 

Holger

 

do you have a link to CS_Productions? I can't seem to find him.

Link to comment
Share on other sites

you have the AD1986 0x11d41986.. search on the first page... there is test to download..

BYE!

hi m8, thx for the info.. i installed this but i dont have any output, and the system tells me all the devices dont have output controls.

 

any solution on this? or can i help you in any way to make it better?

 

Thx!

Link to comment
Share on other sites

the drivers for AD1986 are in testing... if it doesn't works, you can only wait for a working release... i can't do more...

you can use appleHDApatcher 1.20 (in the first page) with your codec dump (for AD1986 is here) or you can obtain your codec dump with linux..

in testing there is also the appleHDApatcher 2.0... search in the site, you will find it...

Link to comment
Share on other sites

Hi all,

I have got a ASRock 1333-d667 Mobo in a Mac Pro case. I installed Leo 10.5.1 with AzaliaAudio.pkg, but I don't have any sound, not even 2 ch sound.

How do I have to modify that file to have the sound (also only 2 channel)?

 

Thanks in advance

 

Andrea

Link to comment
Share on other sites

I hope soundmax ad1988 will be fully working with 8 channels. When it does I will give up on windows.

Surround sound is all that keeps my Leopard on the second place.

 

Anyway, good job Taruga for you efforts. Congratulations and many thanks.

I look forward to see if AD1988 chipsets will function properly.

Link to comment
Share on other sites

First of all, I'd like to thank you so much for your generous work :angel: Thumbs up!

 

Now, i have a Realtek ALC888 codec (6 channels) and i'm using a 4.1 speakers. I got my codec dump from a livecd i got. After using patcher v1.20 i got the following:

 

th_96809_b_122_639lo.jpg

 

I added "Line Output" and "Headphones" as they can "out", then created a aggregate device as follows:

 

th_96815_d_122_65lo.jpg

 

I tested each channel and it worked. Each speaker produces sound on it's own. I then thought everything is done, but wait, I can't hear sound from the two-rear speakers in any other application (including iTunes, QuickTime, ...)! I only hear sound from the two-front speakers! What did i do wrong?

 

PS: The two-rear speakers only produce sound when connected to the 'headphones' socket which is located in the front-side of the chassis. The two-front speakers work normally when connected to the 'green' socket in the back of the chassis. Also note that they all make sound when tested in the 'Audio Midi Setup'.

 

 

This is my Audio Setup. As you can see, Volumes are disabled when i use the aggregate device.

 

th_96810_c_122_898lo.jpg

 

And finally, this is my "Sound" properties page:

 

th_96804_a_122_962lo.jpg

 

PS: I use leopard 5.1 with efi.

 

I hope someone could help me out!!

 

Thanks!!

 

Hey guys, I have the same problem as this guy but I am using the ALC882M codec (with the P5W DH Deluxe). When I play iTunes or other QuickTime audio (or from any program) I cannot hear my rear channels, yet when I test them in the midi program they work. I too thought I had done something wrong, then I found this http://media.ornith.cornell.edu/macaulay web/hawaii.mov and when I listen to this file I do hear the rear channels. Its just that this file actually assigns audio to those channels. I don't know what this means, or if it means anything. I realize that Taruga is working on 2.0 package and hopefully everything will work as it should. I just found this file and thought I'd post it here.

 

Thanks a ton Taruga...looking forward to your next release.

Link to comment
Share on other sites

Taruga can i ask you a favor, can you possibly work on the IDT 92HD202 audio chipset (manufacturer is sigmatel)

 

i really appreciate you helping all of us in the community.

 

Peace

 

this is a sigmatel stac9221 a2 , iirc. You may have the same 945gct-m/1333 that many of us have. I've tried HDAPatcher with no success with codecs from both a knoppix 5 and fedora 8 live cd. Incidentally, the sound doesn't work under those, either. One post on an Ubuntu forum suggests that this is close to the same is in some mac minis.

 

https://answers.launchpad.net/ubuntu/+question/3806

 

Here's the top of the Fedora Codec:

 

Codec: SigmaTel STAC9221 A2

Address: 0

Vendor Id: 0x83847682

Subsystem Id: 0x10192950

Revision Id: 0x103601

Link to comment
Share on other sites

Woo hoo, audio working! I've had my Hackintosh up & running for about 18 months, but when I originally set it up I had sort of burned out on countless reinstalls every time I tried to patch something and killed my OS, so I just went out and got the Turtle Bay USB sound card. Worked like a charm, so I left well enough alone. But then a few weeks ago I got Leo up and running on a nice new 500GB SATA drive. It took me a while to finally fix the boot loader so that I didn't need to leave the DVD, but I got that done last week. So I took a look at the Turtle Bay sound and decided it was time for me to man up and get the onboard sound working. And after all, now that I have Leopard up and running I just need to do a Time Machine restore when I screw up instead of having to do a full reinstall!

 

So I tried the HDA patcher with what I THOUGHT was my sound hardware(Sigmatel 9223), but it didn't work. So I tried the same with a few other patches(I have an Intel D945GNT board, but I forget exactly which one). None of them worked and and I got the grey screen of doom once. Then I looked around and saw that more recent versions of the patcher were not working for some folks, so I went back to 1.16.

 

Houston, we have audio! Not sure if it is all working perfectly, but SOUND OUT is going just fine(ACDC has got the Jack at the moment), and that is all I really use.

 

So I know I have to throw the towel in on my WG311 v2 wireless, but maybe I can get that onboard ethernet going...

 

For archival purposes, I think it is the D945 GNTL(?), & Pentium-D

Link to comment
Share on other sites

this is a sigmatel stac9221 a2 , iirc. You may have the same 945gct-m/1333 that many of us have. I've tried HDAPatcher with no success with codecs from both a knoppix 5 and fedora 8 live cd. Incidentally, the sound doesn't work under those, either. One post on an Ubuntu forum suggests that this is close to the same is in some mac minis.

 

https://answers.launchpad.net/ubuntu/+question/3806

 

Here's the top of the Fedora Codec:

 

Codec: SigmaTel STAC9221 A2

Address: 0

Vendor Id: 0x83847682

Subsystem Id: 0x10192950

Revision Id: 0x103601

 

Thanks for the info willief,

 

i was already downloading fedora

 

a will try and do something/ or try another distro, post my results soon

 

peace

Link to comment
Share on other sites

this is a sigmatel stac9221 a2 , iirc. You may have the same 945gct-m/1333 that many of us have. I've tried HDAPatcher with no success with codecs from both a knoppix 5 and fedora 8 live cd. Incidentally, the sound doesn't work under those, either. One post on an Ubuntu forum suggests that this is close to the same is in some mac minis.

 

https://answers.launchpad.net/ubuntu/+question/3806

 

Here's the top of the Fedora Codec:

 

Codec: SigmaTel STAC9221 A2

Address: 0

Vendor Id: 0x83847682

Subsystem Id: 0x10192950

Revision Id: 0x103601

 

willief i found this pathch on he ubunto forum it might help:

http://osdir.com/ml/ubuntu.devel.kernel.ge...3/msg00018.html

 

 

[PATCH] [uBUNTU:sound] Apply various fixes to Sigmatel HDA codecs: msg#00018

 

Subject: [PATCH] [uBUNTU:sound] Apply various fixes to Sigmatel HDA codecs List-id: Kernel team discussions <kernel-team.lists.ubuntu.com> UpstreamStatus: Added in upstream pci/hda/patch_sigmatel.c r1.8-r1.18

 

These fixes from Matt Porter <mporter@xxxxxxxxxxxxxxxxx> affect the

Sigmatel HDA codecs. Among the noteworthy changes are proper support

for non-reference boards (Intel 9xx) and a fixed mute control for the

922x mixer.

 

Signed-off-by: Daniel T Chen <crimsun@xxxxxxxxxx>

 

---

 

sound/pci/hda/patch_sigmatel.c | 551 ++++++++++++++++++++++++++--------------

1 files changed, 359 insertions(+), 192 deletions(-)

 

a7c6c5a4121e8442fdc5d970ea8a09f6fe7a988c

diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c

index 33a8ada..adb5a9a 100644

--- a/sound/pci/hda/patch_sigmatel.c

+++ b/sound/pci/hda/patch_sigmatel.c

@@ -4,7 +4,7 @@

* HD audio interface patch for SigmaTel STAC92xx

*

* Copyright © 2005 Embedded Alley Solutions, Inc.

- * <matt@xxxxxxxxxxxxxxxxx>

+ * Matt Porter <matt@xxxxxxxxxxxxxxxxx>

*

* Based on patch_cmedia.c and patch_realtek.c

* Copyright © 2004 Takashi Iwai <tiwai@xxxxxxx>

@@ -34,21 +34,27 @@

#include "hda_codec.h"

#include "hda_local.h"

 

-#undef STAC_TEST

-

#define NUM_CONTROL_ALLOC 32

#define STAC_HP_EVENT 0x37

#define STAC_UNSOL_ENABLE (AC_USRSP_EN | STAC_HP_EVENT)

 

+#define STAC_REF 0

+#define STAC_D945GTP3 1

+#define STAC_D945GTP5 2

+

struct sigmatel_spec {

snd_kcontrol_new_t *mixers[4];

unsigned int num_mixers;

 

+ int board_config;

unsigned int surr_switch: 1;

+ unsigned int line_switch: 1;

+ unsigned int mic_switch: 1;

+ unsigned int alt_switch: 1;

 

/* playback */

struct hda_multi_out multiout;

- hda_nid_t dac_nids[4];

+ hda_nid_t dac_nids[5];

 

/* capture */

hda_nid_t *adc_nids;

@@ -57,12 +63,10 @@ struct sigmatel_spec {

unsigned int num_muxes;

hda_nid_t dig_in_nid;

 

-#ifdef STAC_TEST

/* pin widgets */

hda_nid_t *pin_nids;

unsigned int num_pins;

unsigned int *pin_configs;

-#endif

 

/* codec specific stuff */

struct hda_verb *init;

@@ -70,11 +74,10 @@ struct sigmatel_spec {

 

/* capture source */

struct hda_input_mux *input_mux;

- unsigned int cur_mux[2];

+ unsigned int cur_mux[3];

 

- /* channel mode */

- unsigned int num_ch_modes;

- unsigned int cur_ch_mode;

+ /* i/o switches */

+ unsigned int io_switch[2];

 

struct hda_pcm pcm_rec[2]; /* PCM information */

 

@@ -105,7 +108,14 @@ static hda_nid_t stac922x_mux_nids[2] =

0x12, 0x13,

};

 

-#ifdef STAC_TEST

+static hda_nid_t stac927x_adc_nids[3] = {

+ 0x07, 0x08, 0x09

+};

+

+static hda_nid_t stac927x_mux_nids[3] = {

+ 0x15, 0x16, 0x17

+};

+

static hda_nid_t stac9200_pin_nids[8] = {

0x08, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,

};

@@ -114,7 +124,12 @@ static hda_nid_t stac922x_pin_nids[10] =

0x0a, 0x0b, 0x0c, 0x0d, 0x0e,

0x0f, 0x10, 0x11, 0x15, 0x1b,

};

-#endif

+

+static hda_nid_t stac927x_pin_nids[14] = {

+ 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,

+ 0x0f, 0x10, 0x11, 0x12, 0x13,

+ 0x14, 0x21, 0x22, 0x23,

+};

 

static int stac92xx_mux_enum_info(snd_kcontrol_t *kcontrol,

snd_ctl_elem_info_t *uinfo)

{

@@ -155,48 +170,11 @@ static struct hda_verb stac922x_core_ini

{}

};

 

-static int stac922x_channel_modes[3] = {2, 6, 8};

-

-static int stac922x_ch_mode_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t

*uinfo)

-{

- struct hda_codec *codec = snd_kcontrol_chip(kcontrol);

- struct sigmatel_spec *spec = codec->spec;

-

- uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;

- uinfo->count = 1;

- uinfo->value.enumerated.items = spec->num_ch_modes;

- if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)

- uinfo->value.enumerated.item = uinfo->value.enumerated.items -

1;

- sprintf(uinfo->value.enumerated.name, "%dch",

- stac922x_channel_modes[uinfo->value.enumerated.item]);

- return 0;

-}

-

-static int stac922x_ch_mode_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t

*ucontrol)

-{

- struct hda_codec *codec = snd_kcontrol_chip(kcontrol);

- struct sigmatel_spec *spec = codec->spec;

-

- ucontrol->value.enumerated.item[0] = spec->cur_ch_mode;

- return 0;

-}

-

-static int stac922x_ch_mode_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t

*ucontrol)

-{

- struct hda_codec *codec = snd_kcontrol_chip(kcontrol);

- struct sigmatel_spec *spec = codec->spec;

-

- if (ucontrol->value.enumerated.item[0] >= spec->num_ch_modes)

- ucontrol->value.enumerated.item[0] = spec->num_ch_modes;

- if (ucontrol->value.enumerated.item[0] == spec->cur_ch_mode &&

- ! codec->in_resume)

- return 0;

-

- spec->cur_ch_mode = ucontrol->value.enumerated.item[0];

- spec->multiout.max_channels = stac922x_channel_modes[spec->cur_ch_mode];

-

- return 1;

-}

+static struct hda_verb stac927x_core_init[] = {

+ /* set master volume and direct control */

+ { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},

+ {}

+};

 

static snd_kcontrol_new_t stac9200_mixer[] = {

HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),

@@ -231,14 +209,18 @@ static snd_kcontrol_new_t stac922x_mixer

{ } /* end */

};

 

-static snd_kcontrol_new_t stac922x_ch_mode_mixer[] = {

+static snd_kcontrol_new_t stac927x_mixer[] = {

{

.iface = SNDRV_CTL_ELEM_IFACE_MIXER,

- .name = "Channel Mode",

- .info = stac922x_ch_mode_info,

- .get = stac922x_ch_mode_get,

- .put = stac922x_ch_mode_put,

+ .name = "Input Source",

+ .count = 1,

+ .info = stac92xx_mux_enum_info,

+ .get = stac92xx_mux_enum_get,

+ .put = stac92xx_mux_enum_put,

},

+ HDA_CODEC_VOLUME("InMux Capture Volume", 0x15, 0x0, HDA_OUTPUT),

+ HDA_CODEC_VOLUME("InVol Capture Volume", 0x18, 0x0, HDA_INPUT),

+ HDA_CODEC_MUTE("ADCMux Capture Switch", 0x1b, 0x0, HDA_OUTPUT),

{ } /* end */

};

 

@@ -258,11 +240,6 @@ static int stac92xx_build_controls(struc

return err;

}

 

- if (spec->surr_switch) {

- err = snd_hda_add_new_ctls(codec, stac922x_ch_mode_mixer);

- if (err < 0)

- return err;

- }

if (spec->multiout.dig_out_nid) {

err = snd_hda_create_spdif_out_ctls(codec,

spec->multiout.dig_out_nid);

if (err < 0)

@@ -276,18 +253,96 @@ static int stac92xx_build_controls(struc

return 0;

}

 

-#ifdef STAC_TEST

-static unsigned int stac9200_pin_configs[8] = {

+static unsigned int ref9200_pin_configs[8] = {

0x01c47010, 0x01447010, 0x0221401f, 0x01114010,

0x02a19020, 0x01a19021, 0x90100140, 0x01813122,

};

 

-static unsigned int stac922x_pin_configs[10] = {

- 0x01014010, 0x01014011, 0x01014012, 0x0221401f,

- 0x01813122, 0x01014014, 0x01441030, 0x01c41030,

+static unsigned int *stac9200_brd_tbl[] = {

+ ref9200_pin_configs,

+};

+

+static struct hda_board_config stac9200_cfg_tbl[] = {

+ { .modelname = "ref",

+ .pci_subvendor = PCI_VENDOR_ID_INTEL,

+ .pci_subdevice = 0x2668, /* DFI LanParty */

+ .config = STAC_REF },

+ {} /* terminator */

+};

+

+static unsigned int ref922x_pin_configs[10] = {

+ 0x01014010, 0x01016011, 0x01012012, 0x0221401f,

+ 0x01813122, 0x01011014, 0x01441030, 0x01c41030,

0x40000100, 0x40000100,

};

 

+static unsigned int d945gtp3_pin_configs[10] = {

+ 0x0221401f, 0x01a19022, 0x01813021, 0x01014010,

+ 0x40000100, 0x40000100, 0x40000100, 0x40000100,

+ 0x02a19120, 0x40000100,

+};

+

+static unsigned int d945gtp5_pin_configs[10] = {

+ 0x0221401f, 0x01011012, 0x01813024, 0x01014010,

+ 0x01a19021, 0x01016011, 0x01452130, 0x40000100,

+ 0x02a19320, 0x40000100,

+};

+

+static unsigned int *stac922x_brd_tbl[] = {

+ ref922x_pin_configs,

+ d945gtp3_pin_configs,

+ d945gtp5_pin_configs,

+};

+

+static struct hda_board_config stac922x_cfg_tbl[] = {

+ { .modelname = "ref",

+ .pci_subvendor = PCI_VENDOR_ID_INTEL,

+ .pci_subdevice = 0x2668, /* DFI LanParty */

+ .config = STAC_REF }, /* SigmaTel reference board */

+ { .pci_subvendor = PCI_VENDOR_ID_INTEL,

+ .pci_subdevice = 0x0101,

+ .config = STAC_D945GTP3 }, /* Intel D945GTP - 3 Stack */

+ { .pci_subvendor = PCI_VENDOR_ID_INTEL,

+ .pci_subdevice = 0x0202,

+ .config = STAC_D945GTP3 }, /* Intel D945GNT - 3 Stack, 9221 A1 */

+ { .pci_subvendor = PCI_VENDOR_ID_INTEL,

+ .pci_subdevice = 0x0b0b,

+ .config = STAC_D945GTP3 }, /* Intel D945PSN - 3 Stack, 9221 A1 */

+ { .pci_subvendor = PCI_VENDOR_ID_INTEL,

+ .pci_subdevice = 0x0404,

+ .config = STAC_D945GTP5 }, /* Intel D945GTP - 5 Stack */

+ { .pci_subvendor = PCI_VENDOR_ID_INTEL,

+ .pci_subdevice = 0x0303,

+ .config = STAC_D945GTP5 }, /* Intel D945GNT - 5 Stack */

+ { .pci_subvendor = PCI_VENDOR_ID_INTEL,

+ .pci_subdevice = 0x0013,

+ .config = STAC_D945GTP5 }, /* Intel D955XBK - 5 Stack */

+ { .pci_subvendor = PCI_VENDOR_ID_INTEL,

+ .pci_subdevice = 0x0417,

+ .config = STAC_D945GTP5 }, /* Intel D975XBK - 5 Stack */

+ {} /* terminator */

+};

+

+static unsigned int ref927x_pin_configs[14] = {

+ 0x01813122, 0x01a19021, 0x01014010, 0x01016011,

+ 0x01012012, 0x01011014, 0x40000100, 0x40000100,

+ 0x40000100, 0x40000100, 0x40000100, 0x01441030,

+ 0x40000100, 0x40000100, 0x40000100, 0x01441030,

+ 0x01c41030, 0x40000100,

+};

+

+static unsigned int *stac927x_brd_tbl[] = {

+ ref927x_pin_configs,

+};

+

+static struct hda_board_config stac927x_cfg_tbl[] = {

+ { .modelname = "ref",

+ .pci_subvendor = PCI_VENDOR_ID_INTEL,

+ .pci_subdevice = 0x2668, /* DFI LanParty */

+ .config = STAC_REF }, /* SigmaTel reference board */

+ {} /* terminator */

+};

+

static void stac92xx_set_config_regs(struct hda_codec *codec)

{

int i;

@@ -310,10 +365,9 @@ static void stac92xx_set_config_regs(str

pin_cfg = snd_hda_codec_read(codec, spec->pin_nids, 0,

AC_VERB_GET_CONFIG_DEFAULT,

0x00);

- printk("pin nid %2.2x pin config %8.8x\n", spec->pin_nids,

pin_cfg);

+ snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x pin config

%8.8x\n", spec->pin_nids, pin_cfg);

}

}

-#endif

 

/*

* Analog playback callbacks

@@ -326,56 +380,6 @@ static int stac92xx_playback_pcm_open(st

return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream);

}

 

-/*

- * set up the i/o for analog out

- * when the digital out is available, copy the front out to digital out, too.

- */

-static int stac92xx_multi_out_analog_prepare(struct hda_codec *codec, struct

hda_multi_out *mout,

- unsigned int stream_tag,

- unsigned int format,

- snd_pcm_substream_t *substream)

-{

- hda_nid_t *nids = mout->dac_nids;

- int chs = substream->runtime->channels;

- int i;

-

- down(&codec->spdif_mutex);

- if (mout->dig_out_nid && mout->dig_out_used != HDA_DIG_EXCLUSIVE) {

- if (chs == 2 &&

- snd_hda_is_supported_format(codec, mout->dig_out_nid,

format) &&

- ! (codec->spdif_status & IEC958_AES0_NONAUDIO)) {

- mout->dig_out_used = HDA_DIG_ANALOG_DUP;

- /* setup digital receiver */

- snd_hda_codec_setup_stream(codec, mout->dig_out_nid,

- stream_tag, 0, format);

- } else {

- mout->dig_out_used = 0;

- snd_hda_codec_setup_stream(codec, mout->dig_out_nid, 0,

0, 0);

- }

- }

- up(&codec->spdif_mutex);

-

- /* front */

- snd_hda_codec_setup_stream(codec, nids[HDA_FRONT], stream_tag, 0,

format);

- if (mout->hp_nid)

- /* headphone out will just decode front left/right (stereo) */

- snd_hda_codec_setup_stream(codec, mout->hp_nid, stream_tag, 0,

format);

- /* surrounds */

- if (mout->max_channels > 2)

- for (i = 1; i < mout->num_dacs; i++) {

- if ((mout->max_channels == 6) && (i == 3))

- break;

- if (chs >= (i + 1) * 2) /* independent out */

- snd_hda_codec_setup_stream(codec, nids,

stream_tag, i * 2,

- format);

- else /* copy front */

- snd_hda_codec_setup_stream(codec, nids,

stream_tag, 0,

- format);

- }

- return 0;

-}

-

-

static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,

struct hda_codec *codec,

unsigned int stream_tag,

@@ -383,8 +387,7 @@ static int stac92xx_playback_pcm_prepare

snd_pcm_substream_t *substream)

{

struct sigmatel_spec *spec = codec->spec;

- return stac92xx_multi_out_analog_prepare(codec, &spec->multiout,

stream_tag,

- format, substream);

+ return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,

stream_tag, format, substream);

}

 

static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,

@@ -471,11 +474,23 @@ static struct hda_pcm_stream stac92xx_pc

},

};

 

+static struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {

+ .substreams = 1,

+ .channels_min = 2,

+ .channels_max = 2,

+ .nid = 0x06, /* NID to query formats and rates */

+ .ops = {

+ .open = stac92xx_playback_pcm_open,

+ .prepare = stac92xx_playback_pcm_prepare,

+ .cleanup = stac92xx_playback_pcm_cleanup

+ },

+};

+

static struct hda_pcm_stream stac92xx_pcm_analog_capture = {

.substreams = 2,

.channels_min = 2,

.channels_max = 2,

- .nid = 0x06, /* NID to query formats and rates */

+ /* NID is set in stac92xx_build_pcms */

.ops = {

.prepare = stac92xx_capture_pcm_prepare,

.cleanup = stac92xx_capture_pcm_cleanup

@@ -493,6 +508,14 @@ static int stac92xx_build_pcms(struct hd

info->name = "STAC92xx Analog";

info->stream[sNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;

info->stream[sNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;

+ info->stream[sNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];

+

+ if (spec->alt_switch) {

+ codec->num_pcms++;

+ info++;

+ info->name = "STAC92xx Analog Alt";

+ info->stream[sNDRV_PCM_STREAM_PLAYBACK] =

stac92xx_pcm_analog_alt_playback;

+ }

 

if (spec->multiout.dig_out_nid || spec->dig_in_nid) {

codec->num_pcms++;

@@ -511,14 +534,70 @@ static int stac92xx_build_pcms(struct hd

return 0;

}

 

+static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid,

int pin_type)

+{

+ snd_hda_codec_write(codec, nid, 0,

+ AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);

+}

+

+static int stac92xx_io_switch_info(struct snd_kcontrol *kcontrol, struct

snd_ctl_elem_info *uinfo)

+{

+ uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;

+ uinfo->count = 1;

+ uinfo->value.integer.min = 0;

+ uinfo->value.integer.max = 1;

+ return 0;

+}

+

+static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct

snd_ctl_elem_value *ucontrol)

+{

+ struct hda_codec *codec = snd_kcontrol_chip(kcontrol);

+ struct sigmatel_spec *spec = codec->spec;

+ int io_idx = kcontrol-> private_value & 0xff;

+

+ ucontrol->value.integer.value[0] = spec->io_switch[io_idx];

+ return 0;

+}

+

+static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct

snd_ctl_elem_value *ucontrol)

+{

+ struct hda_codec *codec = snd_kcontrol_chip(kcontrol);

+ struct sigmatel_spec *spec = codec->spec;

+ hda_nid_t nid = kcontrol->private_value >> 8;

+ int io_idx = kcontrol-> private_value & 0xff;

+ unsigned short val = ucontrol->value.integer.value[0];

+

+ spec->io_switch[io_idx] = val;

+

+ if (val)

+ stac92xx_auto_set_pinctl(codec, nid,

+ AC_PINCTL_OUT_EN);

+ else

+ stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_IN_EN);

+

+ return 1;

+}

+

+#define STAC_CODEC_IO_SWITCH(xname, xpval) \

+ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \

+ .name = xname, \

+ .index = 0, \

+ .info = stac92xx_io_switch_info, \

+ .get = stac92xx_io_switch_get, \

+ .put = stac92xx_io_switch_put, \

+ .private_value = xpval, \

+}

+

enum {

STAC_CTL_WIDGET_VOL,

STAC_CTL_WIDGET_MUTE,

+ STAC_CTL_WIDGET_IO_SWITCH,

};

 

static snd_kcontrol_new_t stac92xx_control_templates[] = {

HDA_CODEC_VOLUME(NULL, 0, 0, 0),

HDA_CODEC_MUTE(NULL, 0, 0, 0),

+ STAC_CODEC_IO_SWITCH(NULL, 0),

};

 

/* add dynamic controls */

@@ -550,6 +629,60 @@ static int stac92xx_add_control(struct s

return 0;

}

 

+/* flag inputs as additional dynamic lineouts */

+static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct

auto_pin_cfg *cfg)

+{

+ struct sigmatel_spec *spec = codec->spec;

+

+ switch (cfg->line_outs) {

+ case 3:

+ /* add line-in as side */

+ if (cfg->input_pins[AUTO_PIN_LINE]) {

+ cfg->line_out_pins[3] =

cfg->input_pins[AUTO_PIN_LINE];

+ spec->line_switch = 1;

+ cfg->line_outs++;

+ }

+ break;

+ case 2:

+ /* add line-in as clfe and mic as side */

+ if (cfg->input_pins[AUTO_PIN_LINE]) {

+ cfg->line_out_pins[2] =

cfg->input_pins[AUTO_PIN_LINE];

+ spec->line_switch = 1;

+ cfg->line_outs++;

+ }

+ if (cfg->input_pins[AUTO_PIN_MIC]) {

+ cfg->line_out_pins[3] =

cfg->input_pins[AUTO_PIN_MIC];

+ spec->mic_switch = 1;

+ cfg->line_outs++;

+ }

+ break;

+ case 1:

+ /* add line-in as surr and mic as clfe */

+ if (cfg->input_pins[AUTO_PIN_LINE]) {

+ cfg->line_out_pins[1] =

cfg->input_pins[AUTO_PIN_LINE];

+ spec->line_switch = 1;

+ cfg->line_outs++;

+ }

+ if (cfg->input_pins[AUTO_PIN_MIC]) {

+ cfg->line_out_pins[2] =

cfg->input_pins[AUTO_PIN_MIC];

+ spec->mic_switch = 1;

+ cfg->line_outs++;

+ }

+ break;

+ }

+ return 0;

+}

+

+/*

+ * XXX The line_out pin widget connection list may not be set to the

+ * desired DAC nid. This is the case on 927x where ports A and B can

+ * be routed to several DACs.

+ *

+ * This requires an analysis of the line-out/hp pin configuration

+ * to provide a best fit for pin/DAC configurations that are routable.

+ * For now, 927x DAC4 is not supported and 927x DAC1 output to ports

+ * A and B is not supported.

+ */

/* fill in the dac_nids table from the parsed pin configuration */

static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, const struct

auto_pin_cfg *cfg)

{

@@ -564,7 +697,12 @@ static int stac92xx_auto_fill_dac_nids(s

AC_VERB_GET_CONNECT_LIST, 0) & 0xff;

}

 

- spec->multiout.num_dacs = cfg->line_outs;

+ if (cfg->line_outs)

+ spec->multiout.num_dacs = cfg->line_outs;

+ else if (cfg->hp_pin) {

+ spec->multiout.dac_nids[0] = snd_hda_codec_read(codec,

cfg->hp_pin, 0, AC_VERB_GET_CONNECT_LIST, 0) & 0xff;

+ spec->multiout.num_dacs = 1;

+ }

 

return 0;

}

@@ -609,6 +747,15 @@ static int stac92xx_auto_create_multi_ou

}

}

 

+ if (spec->line_switch)

+ if ((err = stac92xx_add_control(spec,

+ STAC_CTL_WIDGET_IO_SWITCH,

"Line In as Output Switch", cfg->input_pins[AUTO_PIN_LINE] << 8)) < 0)

+ return err;

+

+ if (spec->mic_switch)

+ if ((err = stac92xx_add_control(spec,

STAC_CTL_WIDGET_IO_SWITCH, "Mic as Output Switch",

(cfg->input_pins[AUTO_PIN_MIC] << 8) | 1)) < 0)

+ return err;

+

return 0;

}

 

@@ -624,7 +771,8 @@ static int stac92xx_auto_create_hp_ctls(

if (! pin)

return 0;

 

- wid_caps = snd_hda_param_read(codec, pin, AC_PAR_AUDIO_WIDGET_CAP);

+ wid_caps = get_wcaps(codec, pin);

+

if (wid_caps & AC_WCAP_UNSOL_CAP)

/* Enable unsolicited responses on the HP widget */

snd_hda_codec_write(codec, pin, 0,

@@ -656,9 +804,6 @@ static int stac92xx_auto_create_hp_ctls(

static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec,

const struct auto_pin_cfg *cfg)

{

struct sigmatel_spec *spec = codec->spec;

- static char *labels[AUTO_PIN_LAST] = {

- "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux"

- };

struct hda_input_mux *imux = &spec->private_imux;

hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];

int i, j, k;

@@ -666,7 +811,10 @@ static int stac92xx_auto_create_analog_i

for (i = 0; i < AUTO_PIN_LAST; i++) {

int index = -1;

if (cfg->input_pins) {

- imux->items[imux->num_items].label = labels;

+ /* Enable active pin widget as an input */

+ stac92xx_auto_set_pinctl(codec, cfg->input_pins,

AC_PINCTL_IN_EN);

+

+ imux->items[imux->num_items].label =

auto_pin_cfg_labels;

 

for (j=0; j<spec->num_muxes; j++) {

int num_cons = snd_hda_get_connections(codec,

spec->mux_nids[j], con_lst, HDA_MAX_NUM_INPUTS);

@@ -686,12 +834,6 @@ static int stac92xx_auto_create_analog_i

return 0;

}

 

-static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid,

int pin_type)

-

-{

- snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,

pin_type);

-}

-

static void stac92xx_auto_init_multi_out(struct hda_codec *codec)

{

struct sigmatel_spec *spec = codec->spec;

@@ -713,17 +855,21 @@ static void stac92xx_auto_init_hp_out(st

stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN |

AC_PINCTL_HP_EN);

}

 

-static int stac922x_parse_auto_config(struct hda_codec *codec)

+static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t

dig_out, hda_nid_t dig_in)

{

struct sigmatel_spec *spec = codec->spec;

int err;

 

- if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg)) < 0)

- return err;

- if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)

+ if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) <

0)

return err;

if (! spec->autocfg.line_outs && ! spec->autocfg.hp_pin)

return 0; /* can't find valid pin config */

+ stac92xx_auto_init_multi_out(codec);

+ stac92xx_auto_init_hp_out(codec);

+ if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0)

+ return err;

+ if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)

+ return err;

 

if ((err = stac92xx_auto_create_multi_out_ctls(spec, &spec->autocfg)) <

0 ||

(err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg)) < 0 ||

@@ -731,22 +877,15 @@ static int stac922x_parse_auto_config(st

return err;

 

spec->multiout.max_channels = spec->multiout.num_dacs * 2;

- if (spec->multiout.max_channels > 2) {

+ if (spec->multiout.max_channels > 2)

spec->surr_switch = 1;

- spec->cur_ch_mode = 1;

- spec->num_ch_modes = 2;

- if (spec->multiout.max_channels == 8) {

- spec->cur_ch_mode++;

- spec->num_ch_modes++;

- }

- }

 

if (spec->autocfg.dig_out_pin) {

- spec->multiout.dig_out_nid = 0x08;

+ spec->multiout.dig_out_nid = dig_out;

stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_out_pin,

AC_PINCTL_OUT_EN);

}

if (spec->autocfg.dig_in_pin) {

- spec->dig_in_nid = 0x09;

+ spec->dig_in_nid = dig_in;

stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_in_pin,

AC_PINCTL_IN_EN);

}

 

@@ -763,7 +902,7 @@ static int stac9200_parse_auto_config(st

struct sigmatel_spec *spec = codec->spec;

int err;

 

- if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg)) < 0)

+ if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) <

0)

return err;

 

if ((err = stac92xx_auto_create_analog_input_ctls(codec,

&spec->autocfg)) < 0)

@@ -786,38 +925,12 @@ static int stac9200_parse_auto_config(st

return 1;

}

 

-static int stac92xx_init_pstate(struct hda_codec *codec)

-{

- hda_nid_t nid, nid_start;

- int nodes;

-

- snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_POWER_STATE, 0x00);

-

- nodes = snd_hda_get_sub_nodes(codec, codec->afg, &nid_start);

- for (nid = nid_start; nid < nodes + nid_start; nid++) {

- unsigned int wid_caps = snd_hda_param_read(codec, nid,

- AC_PAR_AUDIO_WIDGET_CAP);

- if (wid_caps & AC_WCAP_POWER)

- snd_hda_codec_write(codec, nid, 0,

- AC_VERB_SET_POWER_STATE, 0x00);

- }

-

- mdelay(100);

-

- return 0;

-}

-

static int stac92xx_init(struct hda_codec *codec)

{

struct sigmatel_spec *spec = codec->spec;

 

- stac92xx_init_pstate(codec);

-

snd_hda_sequence_write(codec, spec->init);

 

- stac92xx_auto_init_multi_out(codec);

- stac92xx_auto_init_hp_out(codec);

-

return 0;

}

 

@@ -924,13 +1037,15 @@ static int patch_stac9200(struct hda_cod

return -ENOMEM;

 

codec->spec = spec;

-

-#ifdef STAC_TEST

- spec->pin_nids = stac9200_pin_nids;

- spec->num_pins = 8;

- spec->pin_configs = stac9200_pin_configs;

- stac92xx_set_config_regs(codec);

-#endif

+ spec->board_config = snd_hda_check_board_config(codec,

stac9200_cfg_tbl);

+ if (spec->board_config < 0)

+ snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9200,

using BIOS defaults\n");

+ else {

+ spec->num_pins = 8;

+ spec->pin_nids = stac9200_pin_nids;

+ spec->pin_configs = stac9200_brd_tbl[spec->board_config];

+ stac92xx_set_config_regs(codec);

+ }

spec->multiout.max_channels = 2;

spec->multiout.num_dacs = 1;

spec->multiout.dac_nids = stac9200_dac_nids;

@@ -962,13 +1077,15 @@ static int patch_stac922x(struct hda_cod

return -ENOMEM;

 

codec->spec = spec;

-

-#ifdef STAC_TEST

- spec->num_pins = 10;

- spec->pin_nids = stac922x_pin_nids;

- spec->pin_configs = stac922x_pin_configs;

- stac92xx_set_config_regs(codec);

-#endif

+ spec->board_config = snd_hda_check_board_config(codec,

stac922x_cfg_tbl);

+ if (spec->board_config < 0)

+ snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x,

using BIOS defaults\n");

+ else {

+ spec->num_pins = 10;

+ spec->pin_nids = stac922x_pin_nids;

+ spec->pin_configs = stac922x_brd_tbl[spec->board_config];

+ stac92xx_set_config_regs(codec);

+ }

spec->adc_nids = stac922x_adc_nids;

spec->mux_nids = stac922x_mux_nids;

spec->num_muxes = 2;

@@ -978,7 +1095,47 @@ static int patch_stac922x(struct hda_cod

 

spec->multiout.dac_nids = spec->dac_nids;

 

- err = stac922x_parse_auto_config(codec);

+ err = stac92xx_parse_auto_config(codec, 0x08, 0x09);

+ if (err < 0) {

+ stac92xx_free(codec);

+ return err;

+ }

+

+ codec->patch_ops = stac92xx_patch_ops;

+

+ return 0;

+}

+

+static int patch_stac927x(struct hda_codec *codec)

+{

+ struct sigmatel_spec *spec;

+ int err;

+

+ spec = kzalloc(sizeof(*spec), GFP_KERNEL);

+ if (spec == NULL)

+ return -ENOMEM;

+

+ codec->spec = spec;

+ spec->board_config = snd_hda_check_board_config(codec,

stac927x_cfg_tbl);

+ if (spec->board_config < 0)

+ snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC927x,

using BIOS defaults\n");

+ else {

+ spec->num_pins = 14;

+ spec->pin_nids = stac927x_pin_nids;

+ spec->pin_configs = stac927x_brd_tbl[spec->board_config];

+ stac92xx_set_config_regs(codec);

+ }

+

+ spec->adc_nids = stac927x_adc_nids;

+ spec->mux_nids = stac927x_mux_nids;

+ spec->num_muxes = 3;

+

+ spec->init = stac927x_core_init;

+ spec->mixer = stac927x_mixer;

+

+ spec->multiout.dac_nids = spec->dac_nids;

+

+ err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);

if (err < 0) {

stac92xx_free(codec);

return err;

@@ -1000,5 +1157,15 @@ struct hda_codec_preset snd_hda_preset_s

{ .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch =

patch_stac922x },

{ .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },

{ .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },

+ { .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },

+ { .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },

+ { .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },

+ { .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },

+ { .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },

+ { .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },

+ { .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },

+ { .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },

+ { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },

+ { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },

{} /* terminator */

};

--

1.1.3

 

--

Daniel T. Chen crimsun@xxxxxxxxxx

 

 

i'm not sure if you apply the patch then create the stack file if it will work.

still worth the try.

 

still downloading, post more updates.

 

peace

GPG key: www.sh.nu/~crimsun/pubkey.gpg.asc

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...