At Wed, 25 Mar 2009 01:47:16 -0700, Russ Dill wrote: > > The patch is causing breakage for me (no audio): > > [37998.770034] HDA Intel 0000:00:14.2: PCI INT A disabled > [38019.228311] HDA Intel 0000:00:14.2: PCI INT A -> GSI 16 (level, > low) -> IRQ 16 > [38019.360994] input: HDA Digital PCBeep as > /devices/pci0000:00/0000:00:14.2/input/input9 > [38019.389307] hda_codec: formats == 0 (nid=0x2, val=0xe0560, ovrd=1, > streams=0xe0560) > [38019.389318] hda_codec: cannot attach PCM stream 0 for codec #1 > [38019.389367] hda_codec: formats == 0 (nid=0x6, val=0x1e0560, ovrd=1, > streams=0x1e0560) > [38019.389373] hda_codec: cannot attach PCM stream 1 for codec #1 > [38019.389435] hda_codec: formats == 0 (nid=0x9, val=0x60160, ovrd=1, > streams=0x60160) > [38019.389440] hda_codec: cannot attach PCM stream 2 for codec #1 Looks like something wrong in my caching code, likely a wrong hash key generation or so. Will take a look after returning from the vacation. thanks, Takashi > > > On Mon, Mar 23, 2009 at 4:27 PM, Takashi Iwai <tiwai@xxxxxxx> wrote: > > At Mon, 23 Mar 2009 16:12:38 -0700, > > Russ Dill wrote: > >> > >> On Mon, Mar 23, 2009 at 3:55 PM, Takashi Iwai <tiwai@xxxxxxx> wrote: > >> > At Mon, 23 Mar 2009 15:48:19 -0700, > >> > Russ Dill wrote: > >> >> > >> >> On Mon, Mar 23, 2009 at 3:45 PM, Takashi Iwai <tiwai@xxxxxxx> wrote: > >> >> > At Mon, 23 Mar 2009 15:28:57 -0700, > >> >> > Russ Dill wrote: > >> >> >> > >> >> >> >> > BTW, I found why model=auto doesn't work well on your machine. > >> >> >> >> > It's because (again) of BIOS. It doesn't set the codec SSID properly > >> >> >> >> > so the driver doesn't accept the HP auto-toggle and other features. > >> >> >> >> > > >> >> >> >> > So, in your case, using model=acer-aspire would be likely the best > >> >> >> >> > choice (supposing it matches with most functionality). If you have no > >> >> >> >> > problem (at least regressions) with this model, I'll add the entry to > >> >> >> >> > point to model=acer-aspire > >> >> >> >> > >> >> >> >> Add Acer Ferrar 5000 Quirk to Intel HDA driver > >> >> >> > > >> >> >> > Thanks, a similar fix was already merged now. > >> >> >> > >> >> >> It all works for a while, but eventually I'll get a "azx_get_response > >> >> >> timeout, switching to polling mode: last cmd=0x10bb2001" and it no > >> >> >> longer responds to headphone plug events without an unload/reload of > >> >> >> the module. > >> >> > > >> >> > Did you try my test patch? > >> >> > >> >> It is with the patch: > >> >> > >> >> [16877.337044] hda_intel: azx_get_response timeout, switching to > >> >> polling mode: last cmd=0x106f000a > >> >> [16878.341056] hda_intel: azx_get_response timeout (ERROR): last cmd=0x106f000a > >> >> [16879.345036] hda_intel: azx_get_response timeout (ERROR): last cmd=0x106f000a > >> >> [16880.380016] hda_intel: azx_get_response timeout (ERROR): last cmd=0x106f000a > >> >> [16881.384022] hda_intel: azx_get_response timeout (ERROR): last cmd=0x106f000a > >> > > >> > Interesting, this is again the same verb. > >> > So, there seems something unstable regarding the digital PCM... > >> > > >> > And do you still have the problem with HP plugging? > >> > > >> > >> There seems to be some confusion. All I'm doing right now is playing > >> audio through the analog PCM. After a while, I get that dmesg output > >> and HP plugging stops working. > > > > Yes, that's what I understood, too. The driver still queries the PCM > > parameter for the digital output widget because you turn on "IEC958 > > Default PCM" switch, thus the signal is still routed to the digital, > > too. > > > > > > The below is another test patch to reduce this problem (hopefully). > > It basically caches the parameter values to avoid superfluous > > queries. It's against the very latest alsa-driver snapshot. > > Apply it in addition to the previous test patch. > > > > > > thanks, > > > > Takashi > > > > --- > > > > diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c > > index a4e5e59..1d88e2f 100644 > > --- a/sound/pci/hda/hda_codec.c > > +++ b/sound/pci/hda/hda_codec.c > > @@ -1053,6 +1053,8 @@ EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup_stream); > > /* FIXME: more better hash key? */ > > #define HDA_HASH_KEY(nid,dir,idx) (u32)((nid) + ((idx) << 16) + ((dir) << 24)) > > #define HDA_HASH_PINCAP_KEY(nid) (u32)((nid) + (0x02 << 24)) > > +#define HDA_HASH_PARPCM_KEY(nid) (u32)((nid) + (0x03 << 24)) > > +#define HDA_HASH_PARSTR_KEY(nid) (u32)((nid) + (0x04 << 24)) > > #define INFO_AMP_CAPS (1<<0) > > #define INFO_AMP_VOL(ch) (1 << (1 + (ch))) > > > > @@ -1143,7 +1145,9 @@ int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, > > } > > EXPORT_SYMBOL_HDA(snd_hda_override_amp_caps); > > > > -u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid) > > +static unsigned int > > +query_caps_hash(struct hda_codec *codec, hda_nid_t nid, u32 key, > > + unsigned int (*func)(struct hda_codec *, hda_nid_t)) > > { > > struct hda_amp_info *info; > > > > @@ -1151,11 +1155,22 @@ u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid) > > if (!info) > > return 0; > > if (!info->head.val) { > > - info->amp_caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); > > info->head.val |= INFO_AMP_CAPS; > > + info->amp_caps = func(codec, nid); > > } > > return info->amp_caps; > > } > > + > > +static unsigned int read_pin_cap(struct hda_codec *codec, hda_nid_t nid) > > +{ > > + return snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); > > +} > > + > > +u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid) > > +{ > > + return query_caps_hash(codec, nid, HDA_HASH_PINCAP_KEY(nid), > > + read_pin_cap); > > +} > > EXPORT_SYMBOL_HDA(snd_hda_query_pin_caps); > > > > /* > > @@ -2538,6 +2553,41 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate, > > } > > EXPORT_SYMBOL_HDA(snd_hda_calc_stream_format); > > > > +static unsigned int get_pcm_param(struct hda_codec *codec, hda_nid_t nid) > > +{ > > + unsigned int val = 0; > > + if (nid != codec->afg && > > + (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD)) > > + val = snd_hda_param_read(codec, nid, AC_PAR_PCM); > > + if (!val || val == -1) > > + val = snd_hda_param_read(codec, codec->afg, AC_PAR_PCM); > > + if (!val || val == -1) > > + return 0; > > + return val; > > +} > > + > > +static unsigned int query_pcm_param(struct hda_codec *codec, hda_nid_t nid) > > +{ > > + return query_caps_hash(codec, nid, HDA_HASH_PARPCM_KEY(nid), > > + get_pcm_param); > > +} > > + > > +static unsigned int get_stream_param(struct hda_codec *codec, hda_nid_t nid) > > +{ > > + unsigned int streams = snd_hda_param_read(codec, nid, AC_PAR_STREAM); > > + if (!streams || streams == -1) > > + streams = snd_hda_param_read(codec, codec->afg, AC_PAR_STREAM); > > + if (!streams || streams == -1) > > + return 0; > > + return streams; > > +} > > + > > +static unsigned int query_stream_param(struct hda_codec *codec, hda_nid_t nid) > > +{ > > + return query_caps_hash(codec, nid, HDA_HASH_PARSTR_KEY(nid), > > + get_stream_param); > > +} > > + > > /** > > * snd_hda_query_supported_pcm - query the supported PCM rates and formats > > * @codec: the HDA codec > > @@ -2556,15 +2606,8 @@ static int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, > > { > > unsigned int i, val, wcaps; > > > > - val = 0; > > wcaps = get_wcaps(codec, nid); > > - if (nid != codec->afg && (wcaps & AC_WCAP_FORMAT_OVRD)) { > > - val = snd_hda_param_read(codec, nid, AC_PAR_PCM); > > - if (val == -1) > > - return -EIO; > > - } > > - if (!val) > > - val = snd_hda_param_read(codec, codec->afg, AC_PAR_PCM); > > + val = query_pcm_param(codec, nid); > > > > if (ratesp) { > > u32 rates = 0; > > @@ -2586,15 +2629,9 @@ static int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, > > u64 formats = 0; > > unsigned int streams, bps; > > > > - streams = snd_hda_param_read(codec, nid, AC_PAR_STREAM); > > - if (streams == -1) > > + streams = query_stream_param(codec, nid); > > + if (!streams) > > return -EIO; > > - if (!streams) { > > - streams = snd_hda_param_read(codec, codec->afg, > > - AC_PAR_STREAM); > > - if (streams == -1) > > - return -EIO; > > - } > > > > bps = 0; > > if (streams & AC_SUPFMT_PCM) { > > @@ -2668,17 +2705,9 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid, > > int i; > > unsigned int val = 0, rate, stream; > > > > - if (nid != codec->afg && > > - (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD)) { > > - val = snd_hda_param_read(codec, nid, AC_PAR_PCM); > > - if (val == -1) > > - return 0; > > - } > > - if (!val) { > > - val = snd_hda_param_read(codec, codec->afg, AC_PAR_PCM); > > - if (val == -1) > > - return 0; > > - } > > + val = query_pcm_param(codec, nid); > > + if (!val) > > + return 0; > > > > rate = format & 0xff00; > > for (i = 0; i < AC_PAR_PCM_RATE_BITS; i++) > > @@ -2690,12 +2719,8 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid, > > if (i >= AC_PAR_PCM_RATE_BITS) > > return 0; > > > > - stream = snd_hda_param_read(codec, nid, AC_PAR_STREAM); > > - if (stream == -1) > > - return 0; > > - if (!stream && nid != codec->afg) > > - stream = snd_hda_param_read(codec, codec->afg, AC_PAR_STREAM); > > - if (!stream || stream == -1) > > + stream = query_stream_param(codec, nid); > > + if (!stream) > > return 0; > > > > if (stream & AC_SUPFMT_PCM) { > > > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel