lkml.org 
[lkml]   [2007]   [Nov]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: snd_hda_intel 2.6.24-rc2 bug: interrupts don't always work on Lenovo X60s
    At Mon, 12 Nov 2007 10:46:40 -0800,
    Roland Dreier wrote:
    >
    > > > [ 2311.759856] ACPI: PCI Interrupt 0000:00:1b.0[B] -> GSI 17 (level, low) -> IRQ 21
    > > > [ 2311.759866] hda_intel: probe_mask set to 0x1 for device 17aa:2010
    > > > [ 2311.759886] PCI: Setting latency timer of device 0000:00:1b.0 to 64
    > > > [ 2312.911309] hda_intel: azx_get_response timeout, switching to polling mode: last cmd=0x003f000c
    > >
    > > Hm, strange, NID 0x03 shouldn't be accessed via AD1981 codec, at
    > > least, thinkpad model. Did you enable CONFIG_SND_HDA_CODEC_ANALOG?
    > > Otherwise it won't work.
    >
    > Yes, I have
    >
    > CONFIG_SND_HDA_CODEC_ANALOG=y
    >
    > in my .config.
    >
    > By the way, the "polling mode" seems to work OK: I still get normal
    > playback of music etc.

    Yes, the polling mode should work in most cases, too.

    Anyway, could you try the patch below? As far as I see, it's the only
    part that may access PINCAP verb for that NID.


    thanks,

    Takashi

    ---

    diff -r cd6cede1eca4 sound/pci/hda/hda_codec.c
    --- a/sound/pci/hda/hda_codec.c Mon Nov 12 14:55:19 2007 +0000
    +++ b/sound/pci/hda/hda_codec.c Tue Nov 13 08:28:48 2007 +0100
    @@ -1626,19 +1626,26 @@ static void hda_set_power_state(struct h

    nid = codec->start_nid;
    for (i = 0; i < codec->num_nodes; i++, nid++) {
    - if (get_wcaps(codec, nid) & AC_WCAP_POWER) {
    - unsigned int pincap;
    - /*
    - * don't power down the widget if it controls eapd
    - * and EAPD_BTLENABLE is set.
    - */
    - pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
    - if (pincap & AC_PINCAP_EAPD) {
    - int eapd = snd_hda_codec_read(codec, nid,
    - 0, AC_VERB_GET_EAPD_BTLENABLE, 0);
    - eapd &= 0x02;
    - if (power_state == AC_PWRST_D3 && eapd)
    - continue;
    + unsigned int wcaps = get_wcaps(codec, nid);
    + if (wcaps & AC_WCAP_POWER) {
    + unsigned int wid_type = (wcaps & AC_WCAP_TYPE) >>
    + AC_WCAP_TYPE_SHIFT;
    + if (wid_type == AC_WID_PIN) {
    + unsigned int pincap;
    + /*
    + * don't power down the widget if it controls
    + * eapd and EAPD_BTLENABLE is set.
    + */
    + pincap = snd_hda_param_read(codec, nid,
    + AC_PAR_PIN_CAP);
    + if (pincap & AC_PINCAP_EAPD) {
    + int eapd = snd_hda_codec_read(codec,
    + nid, 0,
    + AC_VERB_GET_EAPD_BTLENABLE, 0);
    + eapd &= 0x02;
    + if (power_state == AC_PWRST_D3 && eapd)
    + continue;
    + }
    }
    snd_hda_codec_write(codec, nid, 0,
    AC_VERB_SET_POWER_STATE,
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-11-13 08:31    [W:0.026 / U:235.480 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site