Skip to content

Commit

Permalink
[ALSA] hda-intel - Add workarounds for STAC codecs
Browse files Browse the repository at this point in the history
Some machines with STAC codecs seem to have problems (e.g. no audible
playback) when the delay in codec-read routine is too short.
I still don't figure out which command sequence causes this problem
(due to lack of test hardware), but it's known that increasing the
delay fixes.  So, added a stupid workaround here temporarily...

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
  • Loading branch information
Takashi Iwai authored and Jaroslav Kysela committed Jan 31, 2008
1 parent 192b8e3 commit 5298765
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 2 deletions.
3 changes: 3 additions & 0 deletions sound/pci/hda/hda_codec.h
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,9 @@ struct hda_bus {
struct hda_bus_unsolicited *unsol;

struct snd_info_entry *proc;

/* misc op flags */
unsigned int needs_damn_long_delay :1;
};

/*
Expand Down
8 changes: 6 additions & 2 deletions sound/pci/hda/hda_intel.c
Original file line number Diff line number Diff line change
Expand Up @@ -559,8 +559,12 @@ static unsigned int azx_rirb_get_response(struct hda_codec *codec)
}
if (!chip->rirb.cmds)
return chip->rirb.res; /* the last value */
udelay(10);
cond_resched();
if (codec->bus->needs_damn_long_delay)
msleep(2); /* temporary workaround */
else {
udelay(10);
cond_resched();
}
} while (time_after_eq(timeout, jiffies));

if (chip->msi) {
Expand Down
12 changes: 12 additions & 0 deletions sound/pci/hda/patch_sigmatel.c
Original file line number Diff line number Diff line change
Expand Up @@ -3472,6 +3472,18 @@ static int patch_stac927x(struct hda_codec *codec)

codec->patch_ops = stac92xx_patch_ops;

/*
* !!FIXME!!
* The STAC927x seem to require fairly long delays for certain
* command sequences. With too short delays (even if the answer
* is set to RIRB properly), it results in the silence output
* on some hardwares like Dell.
*
* The below flag enables the longer delay (see get_response
* in hda_intel.c).
*/
codec->bus->needs_damn_long_delay = 1;

return 0;
}

Expand Down

0 comments on commit 5298765

Please sign in to comment.