Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=9e507abd87103b5263bb0bbd94a15d74004557e9
Commit:     9e507abd87103b5263bb0bbd94a15d74004557e9
Parent:     ac98695d6c1508b724f246f38ce57fb4e3cec356
Author:     Takashi Iwai <[EMAIL PROTECTED]>
AuthorDate: Thu Feb 8 17:50:10 2007 +0100
Committer:  Jaroslav Kysela <[EMAIL PROTECTED]>
CommitDate: Wed Feb 14 08:38:20 2007 +0100

    [ALSA] hda-codec - Fix Oops with probing sigmatel codec chips
    
    When a device is unkown, the driver tries to set up the codec based on
    the BIOS information.  Then it may result in Oops if BIOS is broken.
    The patch fixes the issue, falling back to a reference model in such a
    case.
    
    Signed-off-by: Takashi Iwai <[EMAIL PROTECTED]>
    Signed-off-by: Jaroslav Kysela <[EMAIL PROTECTED]>
---
 sound/pci/hda/patch_sigmatel.c |   40 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
index 6f4a392..2535c1a 100644
--- a/sound/pci/hda/patch_sigmatel.c
+++ b/sound/pci/hda/patch_sigmatel.c
@@ -1800,6 +1800,7 @@ static int patch_stac925x(struct hda_codec *codec)
        spec->board_config = snd_hda_check_board_config(codec, STAC_925x_MODELS,
                                                        stac925x_models,
                                                        stac925x_cfg_tbl);
+ again:
        if (spec->board_config < 0) {
                snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x, 
using BIOS defaults\n");
                err = stac92xx_save_bios_config_regs(codec);
@@ -1825,6 +1826,15 @@ static int patch_stac925x(struct hda_codec *codec)
        spec->mixer = stac925x_mixer;
 
        err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
+       if (!err) {
+               if (spec->board_config < 0) {
+                       printk(KERN_WARNING "hda_codec: No auto-config is "
+                              "available, default to model=ref\n");
+                       spec->board_config = STAC_925x_REF;
+                       goto again;
+               }
+               err = -EINVAL;
+       }
        if (err < 0) {
                stac92xx_free(codec);
                return err;
@@ -1850,6 +1860,7 @@ static int patch_stac922x(struct hda_codec *codec)
        spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
                                                        stac922x_models,
                                                        stac922x_cfg_tbl);
+ again:
        if (spec->board_config < 0) {
                snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, "
                        "using BIOS defaults\n");
@@ -1875,6 +1886,15 @@ static int patch_stac922x(struct hda_codec *codec)
        spec->multiout.dac_nids = spec->dac_nids;
        
        err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
+       if (!err) {
+               if (spec->board_config < 0) {
+                       printk(KERN_WARNING "hda_codec: No auto-config is "
+                              "available, default to model=ref\n");
+                       spec->board_config = STAC_D945_REF;
+                       goto again;
+               }
+               err = -EINVAL;
+       }
        if (err < 0) {
                stac92xx_free(codec);
                return err;
@@ -1903,6 +1923,7 @@ static int patch_stac927x(struct hda_codec *codec)
        spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
                                                        stac927x_models,
                                                        stac927x_cfg_tbl);
+ again:
        if (spec->board_config < 0) {
                 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC927x, 
using BIOS defaults\n");
                err = stac92xx_save_bios_config_regs(codec);
@@ -1945,6 +1966,15 @@ static int patch_stac927x(struct hda_codec *codec)
        spec->multiout.dac_nids = spec->dac_nids;
 
        err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
+       if (!err) {
+               if (spec->board_config < 0) {
+                       printk(KERN_WARNING "hda_codec: No auto-config is "
+                              "available, default to model=ref\n");
+                       spec->board_config = STAC_D965_REF;
+                       goto again;
+               }
+               err = -EINVAL;
+       }
        if (err < 0) {
                stac92xx_free(codec);
                return err;
@@ -1970,6 +2000,7 @@ static int patch_stac9205(struct hda_codec *codec)
        spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
                                                        stac9205_models,
                                                        stac9205_cfg_tbl);
+ again:
        if (spec->board_config < 0) {
                snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, 
using BIOS defaults\n");
                err = stac92xx_save_bios_config_regs(codec);
@@ -2008,6 +2039,15 @@ static int patch_stac9205(struct hda_codec *codec)
                            AC_VERB_SET_GPIO_MASK, 0x00000001);
 
        err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
+       if (!err) {
+               if (spec->board_config < 0) {
+                       printk(KERN_WARNING "hda_codec: No auto-config is "
+                              "available, default to model=ref\n");
+                       spec->board_config = STAC_9205_REF;
+                       goto again;
+               }
+               err = -EINVAL;
+       }
        if (err < 0) {
                stac92xx_free(codec);
                return err;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to