lkml.org 
[lkml]   [2006]   [Mar]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: 2.6.16-rc6: known regressions (v2)
    At Fri, 17 Mar 2006 15:36:42 +0100,
    Adrian Bunk wrote:
    >
    >
    > Subject : snd-intel-hda stopped working on a Dell E1705 Laptop
    > References : http://lkml.org/lkml/2006/3/12/16
    > Submitter : Parag Warudkar <kernel-stuff@comcast.net>
    > Handled-By : Takashi Iwai <tiwai@suse.de>
    > Status : Takashi Iwai: This looks like a problem of the latest sigmatel
    > codec code in general. The author of original
    > code is investigating.

    Could you try the patch below?
    It's a part of a patch in ALSA bugtrack #1843.


    Takashi


    diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
    index 4a6dd97..0ef5503 100644
    --- a/sound/pci/hda/hda_codec.c
    +++ b/sound/pci/hda/hda_codec.c
    @@ -1935,7 +1935,23 @@ static int is_in_nid_list(hda_nid_t nid,
    return 0;
    }

    -/* parse all pin widgets and store the useful pin nids to cfg */
    +/*
    + * Parse all pin widgets and store the useful pin nids to cfg
    + *
    + * The number of line-outs or any primary output is stored in line_outs,
    + * and the corresponding output pins are assigned to line_out_pins[],
    + * in the order of front, rear, CLFE, side, ...
    + *
    + * If more extra outputs (speaker and headphone) are found, the pins are
    + * assisnged to hp_pin and speaker_pin, respectively. If no line-out jack
    + * is detected, one of speaker of HP pins is assigned as the primary
    + * output, i.e. to line_out_pins[0]. So, line_outs is always positive
    + * if any analog output exists.
    + *
    + * The analog input pins are assigned to input_pins array.
    + * The digital input/output pins are assigned to dig_in_pin and dig_out_pin,
    + * respectively.
    + */
    int snd_hda_parse_pin_def_config(struct hda_codec *codec, struct auto_pin_cfg *cfg,
    hda_nid_t *ignore_nids)
    {
    @@ -2048,6 +2064,41 @@ int snd_hda_parse_pin_def_config(struct
    break;
    }

    + /*
    + * debug prints of the parsed results
    + */
    + snd_printd("autoconfig: line_outs=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
    + cfg->line_out_pins[0], cfg->line_out_pins[1],
    + cfg->line_out_pins[2], cfg->line_out_pins[3],
    + cfg->line_out_pins[4]);
    + snd_printd(" speaker=0x%x, hp=0x%x, dig_out=0x%x, din_in=0x%x\n",
    + cfg->speaker_pin, cfg->hp_pin, cfg->dig_out_pin,
    + cfg->dig_in_pin);
    + snd_printd(" inputs: mic=0x%x, fmic=0x%x, line=0x%x, fline=0x%x,"
    + " cd=0x%x, aux=0x%x\n",
    + cfg->input_pins[AUTO_PIN_MIC],
    + cfg->input_pins[AUTO_PIN_FRONT_MIC],
    + cfg->input_pins[AUTO_PIN_LINE],
    + cfg->input_pins[AUTO_PIN_FRONT_LINE],
    + cfg->input_pins[AUTO_PIN_CD],
    + cfg->input_pins[AUTO_PIN_AUX]);
    +
    + /*
    + * FIX-UP: if no line-outs are detected, try to use speaker or HP pin
    + * as a primary output
    + */
    + if (! cfg->line_outs) {
    + if (cfg->speaker_pin) {
    + cfg->line_outs = 1;
    + cfg->line_out_pins[0] = cfg->speaker_pin;
    + cfg->speaker_pin = 0;
    + } else if (cfg->hp_pin) {
    + cfg->line_outs = 1;
    + cfg->line_out_pins[0] = cfg->hp_pin;
    + cfg->hp_pin = 0;
    + }
    + }
    +
    return 0;
    }

    diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
    index 35c2823..f9f9e5c 100644
    --- a/sound/pci/hda/patch_sigmatel.c
    +++ b/sound/pci/hda/patch_sigmatel.c
    @@ -691,13 +691,7 @@ static int stac92xx_auto_fill_dac_nids(s
    AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
    }

    - 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;
    - }
    + spec->multiout.num_dacs = cfg->line_outs;

    return 0;
    }
    @@ -804,9 +798,6 @@ static int stac92xx_auto_create_analog_i
    for (i = 0; i < AUTO_PIN_LAST; i++) {
    int index = -1;
    if (cfg->input_pins[i]) {
    - /* Enable active pin widget as an input */
    - stac92xx_auto_set_pinctl(codec, cfg->input_pins[i], AC_PINCTL_IN_EN);
    -
    imux->items[imux->num_items].label = auto_pin_cfg_labels[i];

    for (j=0; j<spec->num_muxes; j++) {
    @@ -855,10 +846,8 @@ static int stac92xx_parse_auto_config(st

    if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
    return err;
    - if (! spec->autocfg.line_outs && ! spec->autocfg.hp_pin)
    + if (! spec->autocfg.line_outs)
    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)
    @@ -873,14 +862,10 @@ static int stac92xx_parse_auto_config(st
    if (spec->multiout.max_channels > 2)
    spec->surr_switch = 1;

    - if (spec->autocfg.dig_out_pin) {
    + if (spec->autocfg.dig_out_pin)
    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) {
    + if (spec->autocfg.dig_in_pin)
    spec->dig_in_nid = dig_in;
    - stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_in_pin, AC_PINCTL_IN_EN);
    - }

    if (spec->kctl_alloc)
    spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
    @@ -901,14 +886,13 @@ static int stac9200_parse_auto_config(st
    if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
    return err;

    - if (spec->autocfg.dig_out_pin) {
    + if ((err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
    + return err;
    +
    + if (spec->autocfg.dig_out_pin)
    spec->multiout.dig_out_nid = 0x05;
    - stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_out_pin, AC_PINCTL_OUT_EN);
    - }
    - if (spec->autocfg.dig_in_pin) {
    + if (spec->autocfg.dig_in_pin)
    spec->dig_in_nid = 0x04;
    - stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_in_pin, AC_PINCTL_IN_EN);
    - }

    if (spec->kctl_alloc)
    spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
    @@ -921,9 +905,31 @@ static int stac9200_parse_auto_config(st
    static int stac92xx_init(struct hda_codec *codec)
    {
    struct sigmatel_spec *spec = codec->spec;
    + struct auto_pin_cfg *cfg = &spec->autocfg;
    + int i;

    snd_hda_sequence_write(codec, spec->init);

    + /* set up pins */
    + if (spec->multiout.hp_nid) {
    + /* fake event to set up pins */
    + codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
    + } else {
    + stac92xx_auto_init_multi_out(codec);
    + stac92xx_auto_init_hp_out(codec);
    + }
    + for (i = 0; i < AUTO_PIN_LAST; i++) {
    + if (cfg->input_pins[i])
    + stac92xx_auto_set_pinctl(codec, cfg->input_pins[i],
    + AC_PINCTL_IN_EN);
    + }
    + if (cfg->dig_out_pin)
    + stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin,
    + AC_PINCTL_OUT_EN);
    + if (cfg->dig_in_pin)
    + stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
    + AC_PINCTL_IN_EN);
    +
    return 0;
    }

    -
    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: 2006-03-17 17:31    [W:0.030 / U:1.236 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site